TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: TheFallen0001 en 09 de Enero de 2011, 19:12:27
-
Saludos amigos del foro. He leido los post referentes al tema, pero he realizado un codigo en PBP probasic (microcode) y simulacion en PROTEUS, todo lo posible, pero no me funciona ni la lectura en el LCD y los datos de envio por serial.
El problema esta en la definición del ADC del PIC, pero no le he podido definir bien, soy nuevo en los microcontroladores y si es resuelto mi problema, voluntariamente dejo mi codigo y esquema para que puedan ser utilizados por aquellos que tengan la misma inquietud.
Muchas gracias y estoy atento a cualquier comentario.
-
que es lo que no te funciona exactamente
-
Hola amigo, tengo problemas para definir los puertos de entrada del ADC. (puertoA, como entradas AN0. AN1) para dos sensores y como arrancar realizar la conversion del analogo digital (definir ADCON1 Y ADCON0), por ello deje adjuntos los archivos, si puedes revisarlos e incluso tengo el archivo de simulacion de PROTEUS.
Resumiendo: AN0 se encraga de enviar dato de temperatura a LCD y AN1 se sencarga de enviar dato a serial por TX y RX (portC) por ello deje el archivo de basic en word o abres el archivo.bas
Hice lo humanamente posible pero me sale sino el dato por LCD pero incorrecto.
Gracias por tu atención y perdon por la molestia.
-
prueba con el siguiente codigo
@ DEVICE WDT_OFF ' Watchdog Timer desconectado
@ DEVICE PWRT_ON ' Power-On Timer conectado
@ DEVICE BOD_Off ' Brown-Out Detect conectado
TRISB = 00000000
TRISA = 00000001
define OSC 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_BITS 4
DEFINE LCD_LINES 1
DEFINE ADC_bits 10
DEFINE ADC_clock 3
DEFINE ADC_sampleus 50
pause 1000
adcon1 =%10000000
direc var word
indice var byte
temp var word
lec var word
LCDOUT $fe,1 , " termometro "
pause 1000
LCDOUT $fe,1 , " recibe datos "
pause 1000
inicio :
adcin 0,temp
lec = temp * 48 /100 ´esto es para pasar 1024/5 y luego dividir dentro de 100 para obtener 10mv por grado centigrado
direc = temp * 48 //98 'temp por 48 dividido 98 y coloco el resto en direc, esto para tener un valor decimal en la lectura
pause 100
lcdout $fe,1 , " temp = ", dec lec , "." ,dec direc
pause 100
goto inicio
end
ojala te ayude
-
Hola Chrisbaf, estoy contento por que funciona la simulación de PROTEUS :-/ con tu código, pero presenta un salto de temperatura de 1 grado de diferencia, entre el voltaje del LM35 y la lectura. Por ello modifique lo siguiente:
ADCIN0, temp
lec=temp*49/100
direc=temp*49/98
Además tengo otra pregunta, ¿De que manera puedo enviar el dato que registo por de forma serial?, la comunicación la tengo que realizar a 2400 baudios.
Te agradezco el interés.
-
aqui hay algo que te puede ayudar
SEROUT Pin,Mode,[Item[,Item...}]
Envía uno ó más Items a Pin , en formato standard asincrónico usando 8 bits de datos , sin paridad y 1
stop bit (8N1) .SEROUT es similar al comando Serout de BS1 .Pin es automáticamente colocado como
salida . Pin puede ser una constante , 0 - 15 , ó una variable que contenga un número de 0-15 (p.ej. B0) ó
un número de Pin (p.ej. PORTA.0)
Los nombres Mode (p.ej. T2400) están definidos en el archivo MODEDEFS.BAS .
Para usarlos ,agregue la línea :
Include “modedefs.bas”
al comienzo de su programa PBP .
SEROUT 0,N2400,[#B0,10] ´ envía el valor ASCII de B0 ,seguido por un LF al pin 0 , en forma serial