Curso de programación de PIC en PICBasic Pro

Que tal hasta el momento hemos desarrollados proyectos con el pic 16f84A , pero este micro se nos que para leer sensores de temperatura como el lm35 y configurar entradas y salidas superiores a trece (13) que son con las que cuenta el pic 16f84A con sus dos puertos A y B respectivamente, por que trabajaremos con el pic 16F877A que posee convertidores A/D y tres puertos mas que el 84A.

Para empezar a desarrollar el proximo proyecto adjunto documento explicativo del conversor A/D del pic 16f877A ya que leeremos el famoso sensor de temperatura lm35. y visualizaremos su valor en un LCD .Todo ello para entender los comandos del codigo que se desarrollara en basic pro.
 

Adjuntos

  • convertidor_anlogo_digital_pic_16f877a_448.pdf
    310.6 KB · Visitas: 1,386
El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC y un rango que abarca desde -55º a + 150ºC. La salida es lineal y equivale a 10 mV/ºC.

· Precisión de : ~1,5ºC (peor caso)

· No linealidad : ~0,5ºC (peor caso)

Su tensión de salida es linealmente proporcional con la temperatura en la escala Celsius (centígrada) . Posee una precisión aceptable para la aplicación requerida, no necesita calibración externa y es de bajo costo. Funciona en el rango de alimentación comprendido entre 4 y 30 voltios. Tiene tres pines: alimentación, tierra y salida análoga

Codigo fuente pic basic pro comentado:
Código:
;Programa en donde se utiliza el sensor de temperatura LM35,el pic 16f877A,LCD
;de 2 X16 y se muestra el valor en decimal en la pantalla de cristal liquido con
;su respectivo mensaje TEMPERATURA:**C.

; definicion de Oscilador Externo 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

; Definicion de conexiónes del LCD

DEFINE LCD_DREG PORTB          ; LCD bits de comunicacion al LCD 
DEFINE LCD_DBIT 0              ; Coneccion puerto B (RB0,RB1,RB2,RB3) 
DEFINE LCD_RSREG PORTB         ; LCD bit RS conectado a PORTB
DEFINE LCD_RSBIT 4             ; LCD bit RS conectado a puerto B (RB4)
DEFINE LCD_EREG PORTB         ; LCD bit E conectado a PORTB
DEFINE LCD_EBIT 5              ; LCD bit E conectado a puerto B (Rb5)
DEFINE LCD_BITS 4              ; LCD comunicado 4Bits 
DEFINE LCD_LINES 2             ; LCD de 2 lineas 


; definicion de parametros de conversion A/D 

DEFINE ADC_BITS 8           ; numero de bit conversion A/D
DEFINE ADC_CLOCK 3           ; reloj interno RC usado en conversion A/D
DEFINE ADC_SAMPLEUS 50       ; tiempo de conversion en Us

; Creacion de Variables

Sensar  Var Word      ; Variable donde se guarda el resultado de conversion A/D
Temp Var Byte ; Temperatura en grados centigfrados (C)
TRISA =1      ; RA0 (AN0) es donde se conecta pin OUT del LM35
TRISB =0             ; PORTB es salida

PAUSE 500             ; 0.5s para inicializar LDC

; inicializacion conversor A/D 

ADCON1 = 0            ;ANO entrada analoga
                         
ADCON0 = %11000001        

LCDOUT $FE, 1        ;limpiar LCD 

; Programa principal e inicio de la conversion A/D

LOOP:

ADCIN 0,Sensar             ;Lee canal 0 y guardar en variable sensar

Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,2,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
PAUSE 1000                 ;retardo de un segundo
GOTO LOOp                  ;Crea un bucle cerrado 
END                        ;fin del programa

Cualquier  comentario, Critica ,Colaboracion sera bien recibida he dejado documentos adjuntos para la aclaracion de cualquier inquietud espero sea de su agrado. El proyecto ha sido maotado y funciona a la perfeccion.
 

Adjuntos

  • tem_lm35_767.zip
    20 KB · Visitas: 895
  • lm35_197.pdf
    122.1 KB · Visitas: 865
  • montaje_lm35_816.pdf
    122.5 KB · Visitas: 1,013
  • lm3511ppt_127.zip
    705.2 KB · Visitas: 1,094
Bien vamos con proyecto interesante aqui os dejo el codigo fuente comentado:
Código:
;Programa en donde se mueve un servo motor de tres lineas con el pic 16f877A,
;se utiliza LCD 2X16 que muestra la posicion de giro dada por tres botones 
;conectados al puerto B, los cuales dan las posiciones: giro derecha ,centro y 
;giro izquierda referenciado de 0 a 1000, donde posicion de centro es 500.
 
; deficion de Oscilador Externo 
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
' Libreria para la operacion del programa 

Define	LOADER_USED	1

; Definicion de conexiónes del LCD

Define  LCD_DREG        PORTD   
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTA
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTA
Define  LCD_EBIT        1

pos     var     word    ' Posicion del servo

servo1  var     PORTC.1 'pin donde se conecta el servo


        ADCON1 = 7      ' PORTA y PORTE digitales
        Low PORTA.2     ' LCD R/W low = escritura
        Pause 100       ' retardo para inicializar el LCD

        OPTION_REG = $7f 
        Low servo1       ;portc.1 como salida para controlar el servo

        Gosub center    'ir a centro


' progrma principal

LOOP:
        PORTB = 0       ' PORTB lineas a cero logico para leer botones
        TRISB = $fe     
        

        'Rutinas para el chequeo de botones y posiciones del servo
        If PORTB.4 = 0 Then
                Gosub left
        Endif
        If PORTB.5 = 0 Then
                Gosub center
        Endif
        If PORTB.6 = 0 Then
                Gosub right
        Endif
        ;Rutina para mostrar mensaje y valor decimal de la posicion del servo
        
        Lcdout $fe,1
        Lcdout $fe,2,"Position = ", #pos

        servo1 = 1      ' iniciar pulso hacia el servo
        Pauseus 1000 + pos
        servo1 = 0      ' termine pulso 

        Pause 16        ' retardo

        Goto LOOP   ' Crea un bucle cerrado


' giro hacia la izquierda
left:   If pos < 1000 Then
                pos = pos + 1
        Endif
        Return


' giro hacia la derecha
right:  If pos != 0 Then
                pos = pos - 1
        Endif
        Return


' posicion de centro
center: pos = 500
        Return

        End
 

Adjuntos

  • servo_756.zip
    146.1 KB · Visitas: 959
hola a todos los amigos gracias por los valiosos ejemplos que postearon la verdad no me queda claro es decir que si coloco mi codigo tal como esta con la configuracion de el amigo mecatrodatos y dispongo el montaje como lo posteo el amigo javicone debe funcional o hago algun cambio adicional....ahora una pregunta mas probe el siguiente codigo para prender y apagar un led y me da error me dice que la primera linea de codigo es invalido (@ device xt_osc ; oscilador externo XT ) que esta mal?

Código:
; encender un led conectado al pin 37 (RB4) del pic 16F877A durante 2.5 seg y 
;luego apagarlo 0.5 seg el proceso debe repetirse 4 veces luego el led debe 
;permanecer apagado. 

@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 
x var byte ; crea la variable x y asigna un espacio de memoria 
; de o a 255 
LED var portb.4 ; asigna el nombre de led a RB4 del pic 16f877A 


programa: ; inicio de la linea de programa 
for x=0 to 3 ; repetir 4 veces 
high led ;enciende led 
pause 2500 ; esperar 2.5 seg 
low led ;apaga led 
pause 500 ; espera 0.5 seg 
next ; siguiente repeticion hasta que sea x=3 
end ; fin del programa

estoy usando el microcode studio plus les agradezco la ayuda que me puedan brindar
 
Por favor traten de colocar sus codigos de ejemplo entre las etiquetas code y /code para que la lectura de las respuestas en el foro sea mas simple

Gracias...
 
Hola a todos ya estamos de regreso, amigo patico21 verifica que cuando vayas a compilar el programa, hayas seleccionado el pic que quieres, en este caso el 16f877a, esto lo haces en el microcode en la barra de menu de arriba, espero te sea de ayuda, ya que aveces me a pasado que esos pequeños detalles se nos pasan, saludos.
 
hola amigo gracias por responder si me fije y esta colocado el micro 16F877A por eso preguntaba la veradad me parece muy raro pense que puede ser el programa si pudieran darme una ayuda con eso les agradeceria mucho
 
Que tal mira este problema ocurre bajo las siguientes condiciones :

1.No dejar espacio entre la @, device y xt_osc o se encuentre alguna de esta palabras pegadas generandose el codigo de error en la parte izquierda inferior del micro code studio; (Error PRUEBA.ASM 53:[235] opcode expected instead of ´xt_osc´

-Por otro lado bajo el formato de Micro Code este codigo se presenta en color verde si no es asi debes desplazarlo hacia la orilla izquierda para que tome este color ya que si lo ubicas por ejemplo en el centro de la hoja donde estas desarrollando el codigo se te presenta en color negro.

-Los comentarios se te presentan de color azul cuando utilizas ; o '

-Los mensajes para lcd en color rojo si utilizas " "

Espero te sirva
 
Analizando tu codigo patico 21 el de mensaje hola teneis dos errores
Código:
pause 200 
x var byte 
abc var byte 
ini: 
       lcdout $FE,1 
       for x = 0 to 5 
lookup x, ["hola"],abc 
       lcdout, abc 
       pause 400 
       next 
       pause 2000 
goto ini 
end

Cuando realices el montaje o la simulacion en proteus no va ha parecer la primera letra de tu mensaje y se te va ha repetir la a dos veces mas es decir en la LCD te aparecera algo asi: olaaa ya que es un mensaje que se muestra caracter por carater o estoy equivacado, si estoy en lo correcto el for de la variable x se debe repetir con respecto al numetro de letras que componen el mensaje es decir como tu mensaje la integran cuatro h-o-l-a tendreis que colocar (for x=0 to 3) para que con ello no se muestre al final doble a.

Por otro lado para que te aparezca la (h ) deja un espacion entre las comillas y la h, o el comando LCDOUT $FE,2 despues del de limpiar LCD (lcdout $FE,1 ) como sigue:

1.
lookup x, [" hola"],abc

2.
lcdout $FE,1
lcdout $FE,2
for x = 0 to 5
 
hola mecatrodatos gracias por responder tines mucha razon en lo del lcd con razon no salia lo que yo esperaba y te don de nuevo la razon con respecto a los espacios entre la linea de @ device xt_osc habia espacio entre las palabras y por eso no me compilaba el codigo muchas gracias...ahora mi pregunta seria como quedaria el codigo para poder ya simulaarlo quedaria algo asi o me equivoco

Código:
ADCON1=7 
Define LCD_DREG PORTB 
Define LCD_DBIT 4 
Define LCD_RSREG PORTB 
Define LCD_RSBIT 3 
Define LCD_EREG PORTB 
Define LCD_EBIT 2 


pause 200 
x var byte 
abc var byte 
ini: 
       lcdout $FE,1 
       for x = 0 to 3 
lookup x, [" hola"],abc 
       lcdout, abc 
       pause 400 
       next 
       pause 2000 
goto ini 
end


gracias por la ayuda que me puedan brindar
 
Esta bien pero no te olvides incluir las dos lineas de codigo de tipo de oscilador externo a utilizar y la frecuencia de uso por otro lado puedes omitir el ACON1=7 ya que no estas utilizando los puertos A y E del pic que tienen conversores A/D
 
Bien iremos con un proyecto que estoy realizando el cual consiste interpretar la temperatura desde un pic hacia un pc utilizando labview alguno que conozca como utilizar labview le estare agradecido tengo que utilizar comunicacion rs 232 en la cual no tengo problema el inconveniente es como hago la cuestion grafica en labview.

Tambien a traves de este software tengo que manejar un Ascensor ya he realizado el codigo de los dos proyectos en pic basic pro, espero una colaboracion en el entrono de labview y subire los avances.
 
Hola, quisiera pedir ayuda para hacer el siguiente proyecto:
Un reloj con alarma, sensor de temperatura y calendario todo expresado en el mismo LCD al mismo tiempo. Si no me equivoco, con un 16f84 se puede hacer, ya que se puede usar el PORTA para las entras (señal y 3 pulsadores) y el portB para el LCD. Se podria realizar?

Ej:
__________________
|-12:50------------9:30-|
|-1/1/09----------10ºC -|
 
hola amigos un favor quiero leer el voltaje que me da un potenciometro como se muestra en la imagen quisiera mostrar en el LCD el voltage que hay entre el punto central del potenciometro y tierra. consegui el siguiente codigo

Código:
define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBTI 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4

p1 var byte
p2 var byte 
p3 var byte

ADCON1=%100           'este es la linea que no entiendo para que se usa

inicio:
    PAUSE 300
poten1:
    ADCON0=%1000001   'este es la linea que no entiendo para que se usa
    GOSUB medir
    p1=ADRESH
poten2:
    ADCON0=%1001001   'este es la linea que no entiendo para que se usa
    GOSUB medir
    p2=ADRESH
poten3:
    ADCON0=%1011001   'este es la linea que no entiendo para que se usa
    gosub medir
    p3=ADRESH

lcdout $fe,1,"pot1 pot2 pot3"
lcdout $fe,$c1,#p1
lcdout $fe,$c6,#p2
LCDout $fe,$cb,#p3
goto inicio

medir:

pause 50
ADCON0.2=1
pauseus 50
return
end


quisiera que por favor me ayuden con las lineas que no entiendo porque se asigna ese valor he leido un poco que es en base a una tabla de cada micro pero no me queda claro el uso este codigo en las lineas que he señalado el porque si me pudieran explicar un poco serian tan gentiles por favor. este codigo es para medir unos potenciometros que estan conectados en A0 A1 A3 y lo muesta en el LCD. ayudenme por favor tengo una gran duda y la verdad que no me queda claro
 
Que tal para mi amigo electroandres el hecho de recomendarte un sensor digital para tu proyecto es que el pic que vas a utilizar no tiene conversores A/D como el pic 16f877A por ello debes selecionar uno que pueda leer tu pic y adjuntar la medida obtenida en 8 byte para que posteriormente sea enviado el valor en decimal al lcd por comunicacion de 4 bits revisa este codigo espero sea de utilidad
Código:
'DEFINICION OSCILADOR EXTERNO                                                        
 
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 


' DEFINICION DE LIBRERIA PARA COMUNICACION 

Define	LOADER_USED	1

'DEFINICION DE PINES PARA CONECTAR EL LCD

Define  LCD_DREG        PORTB
Define  LCD_DBIT        0
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       4
Define  LCD_EREG        PORTB
Define  LCD_EBIT        5                                    


' CREACION DE VARIABLES

command var     byte            ' VARIABLE PARA COMANDO
i       var     byte            ' VARIABLE PARA CONTEO
temp    var     word            ' PARA GUARDAR VALOR TEMP

' DETERMINACION DE PIN SENSOR DS 18S20 CONECTADO AL PIC 16F84a

DQ      var     PORTB.7         ' PIN DEL SENSOR DS18S20 CONECTADO A PORTB.7 
DQ_DIR  var     TRISB.7         ' DEL PIC 16F84a


        Low PORTB.6             ' LCD R/W A CERO LOGIGO POR EL PIC 16F84a
        Pause 100               ' 100 MS PARA INICIALIZAR LCD

        Lcdout $fe, 1
        Lcdout $fe,$80, "Temp:"      'MOSTRAR MENSAJE
        
'PROGRAMA PARA LECTURA DE TEMPERATURA EN EL LCD

INICIO:
        Gosub init18S20          ' IR A RUTINA DE INICIALIZACION DEL LCD

        command = $cc           
        Gosub write18S20

        command = $44           ' EMPIEZE CONVERCION DE TEMPERATURA
        Gosub write18S20

        Pause 2000              ' ESPERO 2S EG HASTA QUE FINALICE LA CONVERSION

        Gosub init18S20          

        command = $cc           
        Gosub write18S20

        command = $be           ' LEER TEMPERATURA
        Gosub write18S20
        Gosub read18S20

'RUTINA PARA MOSTRAR VALOR DE TEMPERATURA EN EL LCD
        
        Lcdout $fe,$86, dec (temp >> 1),".",dec (temp.0 * 5), "oC"

        Goto INICIO           ' CREA UN BUCLE CERRADO


' INICIALIZA  DS18S20 Y CHEQUEA PRESENCIA

init18S20:

        Low DQ                  
        Pauseus 500           
        DQ_DIR = 1              

        Pauseus 100             
        If DQ = 1 Then
                Lcdout $fe, 1 
                Lcdout $fe,$83,"SENSOR DS18S20"
                Lcdout $fe,$C2,"NO CONECTADO"
                Pause 500
                Goto INICIO   
        Endif
        Pauseus 400             
        Return


' RUTINA PARA COMUNICACION DEL PIC CON SENSOR DS1820 A 8 BYTE
write18S20:
        For i = 1 to 8        
                If command.0 = 0 Then
                        Gosub write0    
                Else
                        Gosub write1   
                Endif
                command = command >> 1  
        Next i
        Return

' RUTINA PARA DESHABILITAR DS18S20 A TRAVES DE UN BIT 
write0:
        Low DQ
        Pauseus 60             
        DQ_DIR = 1              
        Return

' RUTINA PARA HABILITAR DS18S20 A TRAVES DE UN BIT 
write1:
        Low DQ                  
@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz
        DQ_DIR = 1              
        Pauseus 60              
        Return
                           

' RUTINA PARA LEER DS18S20
read18S20:
        For i = 1 to 16       
                temp = temp >> 1        
                Gosub readbit   
        Next i
        Return

' RUTINA PARA LEER BIT DS18S20
readbit:
        temp.15 = 1            
        Low DQ                 
@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz         
        DQ_DIR = 1              
        If DQ = 0 Then
                temp.15 = 0     
        Endif
        Pauseus 60              
        Return

        End
 

Adjuntos

  • pic_16f84a_y_ds18202_146.zip
    76.2 KB · Visitas: 939
ok, igual todabia no me hiba a meter en el tema del de temperatura, por ahora solo quiero hacer reloj + alarma.
Tengo un problema con el sonido de la alarma, ya hice todo el comando para cambiar la hora de alarma, expresarla en el lcd y todo, ahora lo unico que me falta es que cuando este igual hour y Ahour (hora alarma) min = amin. Empiece a sonar
hasta ahi todo bien
hice un if

If (alarm_button = 0) and (ahour = hour) and (minute = amin) then
for alarm =0 to 100
sound alarma_sonido, [100,10,50,100]
pause 1000
next
endif

el tema es que no se como ejecutar ese comando y que el reloj siga andando, que sume segundos y haga lo que tenga que hacer. Me podrias ayudar?
puede ser el comando on interrupt el que tengo que usar?
 
Atrás
Arriba