[Tutorial] y manejo de proton IDE

Aún con una fuente de pones un regulador para el pic y otro para el servo y solo las masas en común, agregas unas capacidades de 0.1uF y allí ya no deberías tener problemas
Que corriente entrega tu fuente, ya que el servo consume entre 400 y 500mA a máxima potencia
 
Última edición:
El uso de todas las instrucciones se encuentra en la ayuda de Proton.
También se incluyen ejemplos en la carpeta PDS\Samples.
La diferencia entre PWM y HPWM, es que la primera genera PWM por software y la segunda por hardware.
Por eso la primer letra de la instrucción tiene una H. (Hardware)
Así que la instrucción HPWM únicamente puede funcionar con PIC's que tengan módulo CCP.
Y como algunos PIC tienen varios módulos CCP, por eso HPWM requiere saber por qué canal se va a generar la señal. (Channel)

Adjunto un ejemplo con HPWM.
En Proteus anda de 10, pero cuando lo armo fisicamente, no me hacen caso los botones... Que estoy haciendo de mal?.... Les adjunto unas imagen...

Para el motor utilicé 5V con transistor de 2N2222A... Y el resto de los componente iguales....
Tengo que declarar algo al CCP1 en el PIC?
 

Adjuntos

Disculpen chico, tras hora buscando el problema recien me doy cuenta que era que el grabador de PIC no se grabó correctamente me parece, ya me parecía raro que no se regulaba el PWM, por que siempre me aseguro en la protoboard... Es una mala costumbre que tengo de no poner los PULL UP-DOWN en proteus, pero obviamente lo monte físicamente una resistencia de 10Kohm. Logré hacer andar. Que era no se. Lo solucioné re-grabando de nuevo al PIC. (Un TM-PROG 2.0 tengo).
 
Tengo problema con LM35, estoy simulando en proteus, todo normal, pero físicamente, no se queda quieto el valor, marca cualquier cosa, de 18 a 32 grados... El Display esta muy bien, solo que no se queda quieto el valor de muestro. Que estoy haciendo de mal? Les adjunto... Es porque después quiero usarlo para regular la velocidad de un ventilador mediante PWM con LM35. Estuve viendo el manual de Proton en Ingles, dice que hay que usar ADin y Adcon (adcon no me quedo claro, ¿Que seria?)

Aca lo subí en YouTube, para que vean el muestro del valor en LCD.
 

Adjuntos

Con adcon le decis que todo el puerto es digital o alguna de sus salidas o por el contrario le indicas que todo el puerto o todas las entradas AN son analógicas o solo algunas de ellas
Con ADCON1=7 todo es digital
En cambio ADCON1=%10000000 'El PORTA.0 es anlógico
Quedaría así
TRISA = %00000001 'AN0 como entrada
ADCON1 = %10000000 'PORTA.0 es analógico
 
Última edición:
Con adcon le decis que todo el puerto es digital o alguna de sus salidas o por el contrario le indicas que todo el puerto o todas las entradas AN son analógicas o solo algunas de ellas
Con ADCON1=7 todo es digital
En cambio ADCON1=%10000000 'El PORTA.0 es analógico
Quedaría así
TRISA = %00000001 'AN0 como entrada
ADCON1 = %10000000 'PORTA.0 es analógico
No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
(Y esto es nada más para los puertos con ADC)
Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.

Ejemplo:
PHP:
Device 16F887
; Palabra de configuración
Reminders = Off
Config1 INTOSCIO,LVP_OFF,FCMEN_OFF,IESO_OFF,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
Reminders = On

Xtal 8MHz

Declare Create_Coff On              ; Crear el archivo para depuración (.cof)

; Declaración de variables
Dim Valor_ADC   As Word
Dim Temperatura As Float

Inicio:
    OSCCON = %01110001              ; Configurar el oscilador interno a 8MHz.
; Configuración del ADC
    ADCON1bits_ADFM = 1             ; Resultado con justificación a la derecha
    Declare Adin_Res    = 10        ; Resultado ADC a 10 bits
    Declare Adin_Tad    = FRC       ; Reloj del ADC (FRC = Interno)
    Declare Adin_Stime  = 50        ; Tiempo de muestreo en uS
    ANSEL = 1                       ; Canal 0 análogico
    ANSELH = 0                      ; Puerto B Digital I/O (En vez de All_Digital)
; Configuración de la pantalla
    Declare LCD_Type    Alpha       ; Alfanumérica
    Declare LCD_DTPin   PORTD.4     ; Bus de datos de RD4 a RD7
    Declare LCD_RSPin   PORTD.3     ; Pin RS en RD3
    Declare LCD_ENPin   PORTD.2     ; Pin E en RD2
    Declare LCD_Interface   4       ; Modo a 4 Bits
    Declare LCD_Lines   2           ; Pantalla de dos líneas
    
    Cls                             ; Inicializar o limpiar la pantalla.
    Print At 1,1, "Temperatura LM35"

Programa:
    Valor_ADC = ADIn 0              ; Se lee el canal 0 y se guarda el valor en "Valor_ADC"
    Temperatura = (150 * Valor_ADC) / 308; (308 = Valor que tendrá el ADC a 150 °C "1.5V")
    ; Mostrar el resultado en pantalla
    Print At 2,1, Dec2 Temperatura, " ", 0xDF, "C  " 
    GoTo Programa
    
    End
 

Adjuntos

Última edición:
Doc, vos ves en alguna parte que yo menciono el 16F877?
Pregunto por ADCON y lo que leyo en en manual, solo me referí a eso a lo que pregunto, y me limite a eso en forma genérica y no particular, si ha leido alguna vez mis post verá que enfatizo en la lectura de la hoja de datos, no importa si es un micro un transitor o lo que fuere, hoja de datos al lado y todo lo que publica el fabricante
 
No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
(Y esto es nada más para los puertos con ADC)
Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.

Ejemplo:
PHP:
Device 16F887
; Palabra de configuración
Reminders = Off
Config1 INTOSCIO,LVP_OFF,FCMEN_OFF,IESO_OFF,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
Reminders = On

Xtal 8MHz

Declare Create_Coff On              ; Crear el archivo para depuración (.cof)

; Declaración de variables
Dim Valor_ADC   As Word
Dim Temperatura As Float

Inicio:
    OSCCON = %01110001              ; Configurar el oscilador interno a 8MHz.
; Configuración del ADC
    ADCON1bits_ADFM = 1             ; Resultado con justificación a la derecha
    Declare Adin_Res    = 10        ; Resultado ADC a 10 bits
    Declare Adin_Tad    = FRC       ; Reloj del ADC (FRC = Interno)
    Declare Adin_Stime  = 50        ; Tiempo de muestreo en uS
    ANSEL = 1                       ; Canal 0 análogico
    ANSELH = 0                      ; Puerto B Digital I/O (En vez de All_Digital)
; Configuración de la pantalla
    Declare LCD_Type    Alpha       ; Alfanumérica
    Declare LCD_DTPin   PORTD.4     ; Bus de datos de RD4 a RD7
    Declare LCD_RSPin   PORTD.3     ; Pin RS en RD3
    Declare LCD_ENPin   PORTD.2     ; Pin E en RD2
    Declare LCD_Interface   4       ; Modo a 4 Bits
    Declare LCD_Lines   2           ; Pantalla de dos líneas
    
    Cls                             ; Inicializar o limpiar la pantalla.
    Print At 1,1, "Temperatura LM35"

Programa:
    Valor_ADC = ADIn 0              ; Se lee el canal 0 y se guarda el valor en "Valor_ADC"
    Temperatura = (150 * Valor_ADC) / 308; (308 = Valor que tendrá el ADC a 150 °C "1.5V")
    ; Mostrar el resultado en pantalla
    Print At 2,1, Dec2 Temperatura, " ", 0xDF, "C  " 
    GoTo Programa
    
    End
Me anduvo pero al ultimo tuve que ponerle Delayms 1000, porque no me dejaba leer en la pantalla... Me resultó... Gracias...



PHP:
Device = 16F887
Xtal 8


Declare LCD_Type Alpha
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
Declare LCD_DTPin PORTD.4
Declare LCD_Lines 2

DelayMS 150
Cls

Print At 1,1, "Temperatura"

Declare Adin_Res 10       ; 10 bits de resolución
Declare Adin_Tad FRC      ; Seleccionar RC OSC
Declare Adin_Stime  50     ; 50uS para tiempo de muestreo

Dim ADC As Word     
Dim Temperatura As Float 



INICIO:
 
  ADC_Value = ADIn 0 
  Temperatura = ADC * 150 / 19712
  Print At 2,1, "Temp: ", Dec1 Temperatura
  DelayMS 1000
     
    
  GoTo INICIO
Esa es la forma que me maté haciendolo toda la tarde, en la cual pude lograr hacerlo andar y obtener una temperatura mas precisa.... Nuevamente gracias... No dude en escribirme... Todavia no soy experto, pero me gusta colaborar con ustedes... Y compartir mis conocimiento que he aprendido....
 
Última edición:
No te esperes mucha precisión ni del conversor AD del PIC y mucho menos del LM35, los dos siempre introducirán cierto error.
El regulador usado y las variantes de voltaje conforme a la temperatura, generan cierta fluctuación que repercute en las lecturas del conversor.
Pero recuerda que su uso básico en general, es para fines didácticos y que en la mayoría de aplicaciones, siempre irán bien.
Ya para casos de precisión, se usa la referencia del conversor y otro canal que la lea, para tenerla en cuenta y será base de la fórmula que muestre la derivación.
 
Sobre el motor Paso a Paso, tengo entendido que se maneja con secuencia binarias. Es correcto? Porque lo simulo en proteus y no gira en sentido horario como deseo. Aqui paso el codigo y el esquema.

PHP:
'Motor Paso a Paso con L298N

Device 16F887
Xtal 4
All_Digital true

TRISD=%00000000
PORTD=0

Inicio:
    PORTD=%00001001
    DelayMS 200
    PORTD=%00000011
    DelayMS 200
    PORTD=%00000110
    DelayMS 200
    PORTD=%00001100
    DelayMS 200
GoTo Inicio
 

Adjuntos

Doc, vos ves en alguna parte que yo menciono el 16F877?
Pregunto por ADCON y lo que leyo en en manual, solo me referí a eso a lo que pregunto, y me limite a eso en forma genérica y no particular, si ha leido alguna vez mis post verá que enfatizo en la lectura de la hoja de datos, no importa si es un micro un transitor o lo que fuere, hoja de datos al lado y todo lo que publica el fabricante
Es solo guiarse por los nombres de los registros en inglés.
ADCON = Analog to digital control (Control de análogo a digital)
ANSEL = Analog selection (Selección a análogo)
:unsure:
 
Básicamente, no todos los PIC tienen los mismos registros, y tampoco su uso es igual de uno a otro.
Las cosas cambian y por eso la hoja de datos siempre nos servirá para encontrar esas diferencias.

Muchas personas copian códigos para usarlos en los PIC que tienen disponibles y obviamente al compilar obtendrán errores.
Errores que muchas veces se pueden corregir, y otras veces no se logrará un funcionamiento correcto aunque se logre la compilación.
Y eso será precisamente porque los registros aunque tengan el mismo nombre, no tienen la misma función.
 
Sobre el motor Paso a Paso, tengo entendido que se maneja con secuencia binarias. Es correcto? Porque lo simulo en proteus y no gira en sentido horario como deseo. Aqui paso el codigo y el esquema.

PHP:
'Motor Paso a Paso con L298N

Device 16F887
Xtal 4
All_Digital true

TRISD=%00000000
PORTD=0

Inicio:
    PORTD=%00001001
    DelayMS 200
    PORTD=%00000011
    DelayMS 200
    PORTD=%00000110
    DelayMS 200
    PORTD=%00001100
    DelayMS 200
GoTo Inicio
Precisamente estoy testeando un motor a pasos BIPOLAR en proteus y en protoboard fisicamente y si me gira correctamente en ambos sentidos,estuve revisando tu codigo y no se parece en nada al mio,tal vez ahi esta el error te recomiendo que lo revises...
 
¡Increíble! ¿podrías darme algún ejemplo (referencia del PIC) en donde ANSEL, ADCON etc signifique otra cosa?.Gracias.
:eek:
Ejemplos ya no serán adecuados, porque estoy 100 % seguro que ya he puesto alguno.
Y lo digo porque aquí existe un Buscador.
Aparte de eso, la hoja de datos así lo dice.
Muchos podrán hablar de leer y releer una hoja de datos, pero he visto que esas personas no ayudan.
Mencionar datos y características se obtienen al ver la hoja de datos.

He visto posts que preguntan por algo que se obtiene viendo la hoja de datos.
Y no pocos, bastantes.
Ahora, te diré algo muy importante...
Cuando no eres capaz de comprender lo que en ella viene, creo que será el momento de regresar a la Universidad y preguntarle a tu Catedrático, eso que no comprendes.

Yo actualmente respondo a preguntas que no puedan tener una explicación lógica y basada en fundamentos que lo puedan demostrar.
 
Precisamente estoy testeando un motor a pasos BIPOLAR en proteus y en protoboard fisicamente y si me gira correctamente en ambos sentidos,estuve revisando tu codigo y no se parece en nada al mio,tal vez ahi esta el error te recomiendo que lo revises...
Por eso pregunto cual error? Porque el profesor de mi facultad me dice que el motor se mueve con secuencias binarias, no me dio ejemplo y ni nada, revise pagina por pagina en este tema no se han hablado aún. Entonces empecé hacer ese codigo. Pero no hace nada. Estoy tratando de usarlo con L298N y motor paso a paso que tengo.
 
Ejemplos ya no serán adecuados, porque estoy 100 % seguro que ya he puesto alguno.
Y lo digo porque aquí existe un Buscador.
Aparte de eso, la hoja de datos así lo dice.
Muchos podrán hablar de leer y releer una hoja de datos, pero he visto que esas personas no ayudan.
Mencionar datos y características se obtienen al ver la hoja de datos.

He visto posts que preguntan por algo que se obtiene viendo la hoja de datos.
Y no pocos, bastantes.
Ahora, te diré algo muy importante...
Cuando no eres capaz de comprender lo que en ella viene, creo que será el momento de regresar a la Universidad y preguntarle a tu Catedrático, eso que no comprendes.

Yo actualmente respondo a preguntas que no puedan tener una explicación lógica y basada en fundamentos que lo puedan demostrar.
Bueno amigo no es para que te enojes.

Revise varias hojas de datos y encontré que en el PIC18f2550 no existe ANSEL; allí hacen la selección análogo y digital, desde ADCON0 Y ADCON1. Pero obviamente también contiene los bits de control del conversor AD.

No seria practico ni adecuado que un registro con el mismo nombre tenga significados diferentes.

Pero si pueden tener un bit de más o un bit de menos o estar unidos (2 registros asociados en uno solo).

CONCLUSION: Si o si, un registro significara lo mismo en todos los PIC ( porque su nombre asi lo indica), pero podrá tener un orden diferente de bits.

Creo que ambos tenemos la razón y ambos estamos equivocados.

Por cierto, nunca fui a la universidad. :cry:
 
Hola a todos.

Mecatrodatos, muy bien el tutorial.

Atricio , en el adjunto , te dejo simulación en proteus de comunicación por usart de dos 876.
En el cual estoy utilizando ADC ,PWM,LCD y USART.
Esta simulado y probado en real , por lo tanto funciona, espero que te sea de utilidad.

Feliz navidad a todos
Muchas gracias por la info colegas.. me ha servido mucho..
si alguien mas me recomienda algo sobre RF se lo agradecere mucho.
saludos
 
Arriba