desktop

Curso de programación de PIC en PICBasic Pro

Patico 21 interesante el proyecto claro que pueden tomar valores decimales en estos dias realice un voltimetro digital de 0 -5 DC te dejo el codigo
Código:
' Programa de voltimetro con pic basic pro de tension (0-5VDC) e ilustracion en 
' LCD con 2 decimas a traves de pic 16f877A. 

'definicion de Oscilador externo

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


Define	LOADER_USED	1

' Definicion de configuracion de pines para comunicacion con lcd a 4bits.

DEFINE  LCD_DREG        PORTB
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTB
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTB
DEFINE  LCD_EBIT        1                                      

' Definicion de parametro de conversion A/D 

DEFINE  ADC_BITS        10     	' Selecionar numero de bits conversion A/D 
DEFINE  ADC_CLOCK       3     	' Selecionar reloj interno de conversion A/D
DEFINE  ADC_SAMPLEUS    50    	' Selecionar tiempode conversion Useg

'creacion de variable y configuracion puertos del pic 16f877A

adval	Var	Word	'Variable donde se va ha guardar medida obtenida
TRISA = %11111111	' Selecionar PORTA como entrada 
ADCON1 = %10000010	' Selecionar PORTA analogo 
Low PORTB.2		    ' LCD R/W colocado a cero logico(W)
Pause 500       	' esperar 0.5 second

'Inicio del programa

voltimetro:
	
Adcin 0, adval		'leer canal cero y guardar resultado en al avariable adval
adval = (adval */ 500)>>2	'lectura de tension 
LCDOut $fe,1   	' Clear LCD
LCDOut $fe,2,"VOLTS DC:",DEC (adval/100),".", DEC2 adval 'mostrar en LCD  
Pause 100       	' esperea 100mseg
Goto voltimetro       ' volver medir 
End

Analizalo que te puede servir para lo que pretendes hacer te anexo imagen de funcionamiento
 

Adjuntos

  • vltimetro_digital_969.zip
    41.1 KB · Visitas: 1,089
hola muchas gracias por el codigo lo estoy tratando de analizar pero al mirarlo me ha dejado una impresion esta linea de codigo adval = (adval */ 500)>>2 en particular porque utilizas seguido */ no entiendo cual es esta expresion porque se supone que normalmente en otros lenguajes de programacion el caracter * es para multiplicar y / es para dividir me podrias explicar eso por favor
 
eso significa modulo, es la operacion por la cual te devuelve el resto de una division; imaginalo asi si deseas decimales, cosa que no sonsigues directamente por pic basic pro, lo mejor es multiplicar y dividir asi obtienes el decimal pero sin la como; asi
5/2=2,5 pero en PBP me arroja solo 2 pero asi hago 5*10/2=25 asi obtuve el decimal solo le pongo la coma; otra forma es 5/2 =2 (segun PBP) y 5*/2 =1 (resto de la division) ahora a este resto 1*10/2=5
asi que ahora solo coloco en el lcd 2 (resultado de la primera operacion) y 5 (resultado de la ultima operacion) y la coma al medio de los dos
 
hola gracias por responder mira en un manual o algo asi de PBP mire que << es para desplazamientos izquierdo y >> para desplazamiento derecho eso no se la verdad para que sirve me podrias explicar y eso de los decimales mas o menos me di cuenta pero como puedo hacer para que la los decimales aparezcan al mover mi potenciometro un poco aparezca 0.1 y a medida que vaya moviendo pueda verlo 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1....ahora tengo otra duda talvez bien torpe peron no entiendo por ejemplo tengo mi potenciometro que lo lee de 0 a 255 pero para mi conveniencia lo quiero transformar a otra escala es decir de 0 a 500 lo mas facil que se me ocurrio era (P1*500/255) p1 es mi variable pero al mirar en el LCD en 0 era 0 estaba bien en la mitad del potenciometro meda 256 pero sigo abanzando se baja a 4 y al final me da 255 y eso me tiene muy confundido...ahora tambien quiero restarle a mi variable p1-10 me comienza en 6225 o algo asi y al seguir avanzando sigue la escala no entiendo puedes darme una mano con eso por favor con lo de los decimales para que lo mires te adjunto la simulacion y el programa.
 

Adjuntos

  • codigo_de_conversor_405.rar
    48.4 KB · Visitas: 755
en base decimal (la que usamos) si tienes el numero 14 y usas el desplazamiento Ej. 14<<2 nos dara como resultado 1400 se desplazaron los digitos 2 lugares hacia la izquierda es como multiplicar por 100 o 10 al cuadradolo mismo sucede en binario si tienes el numero b=%11101100 y realizas a=b<<4 todo se desplaza hacia la izquierda 4 lugares (que es igual a multiplicar por 2^4)y los lugares vacios de completan con ceros por lo tanto a=%11000000 y si realizas a=b>>4 el valor de a sera a=%00001110 ahora yo asumi que las variables son de tipo byte por eso lo que sale de los 8 bits se pierde, no lo probe pero creo que ese es el problema de tu programa el adc es de 10 bits creo y tus variables son de 8 bits mientras la cuenta no exceda 255 (8 bits) todo esta bien pero si se excede por lo menos 1 existe un desborde, imagina si tu variable b esta en 255 b=%11111111 y si pasa a 256 b=%100000000 que tiene 9 bits pero la variable solo vera los 8 menos significativos es decir la variable que vera el micro es b=%00000000 y el cree que es 0 si la variable es mas grande (word) esto ocurrira en un limite distinto y mas grande a las cuentas en 8 bits . pruebalo yo me dare un tiempo y vere bien tu simulacion y codigo y ver en que te ayudo
 
le acabo de dar otra mirada y dime si un byte almacena hasta 255 cuando haces p1*500 ya excediste los 255 y se perdieron bits y al dividir, lo haces solo con lo que quedo de la operacion anterior; ahora todo sale bien mientras tus calculos no excedan a 255 por eso todo va bien hasta cierto punto; cambia el tamaño de tus variables teniendo en cuenta el numero maximo que puedes obtener.


bye
 
hola amigo gracias por contestar ahora me queda un poco mas claro es decir que se opera con numeros binarios o me equivoco en lugar de decimales ops: ......osea que debo cambiar mis variables en lugar que sean byte deben ser word... ahora no entiendo porque al restar de mi variable es decir 255-10 comienza de 656525 o algo asi cuando lo pongo en cero eso si no entiendo ojala me pudieras explicar por favor y de nuevo muchas gracias
 
el PBP te da la facilidad de operar en decimal, pero algunas instrucciones son de operacion en binario como los desplazamientos y las operaciones logicas bit a bit ( & AND, | OR, ^ NOT). ahora con respecto a la resta, es algo parecido al desbordamiento solo k cuando tienes un numero y le restas uno mayor, la resta va de maravillas mientras no excedas la variables es decir si tus variables son de tipo byte; b=255
si haces c=b-150, no tienes problemas incluso con c=b-255 pero si se te ocurre hacer c=b-256 como la variable c es byte lo que sucede es (imaginando que b=255) c=b-255-1 entonces c=0-1 esto en binario es c=%00000000 - %00000001 ; la respuesta no puede ser negativa asi que el micro hace lo siguiente asume que c=%100000000 - %00000001 (pero recuerda que b es tipo byte) y la respuesta seria c=%011111111 pero c es byte y solo toma los 8 bits de la derecha es decir c=%11111111 que en decimal es 255; en resumidas cuentas cuando se llega al maximo de la variable se reinicia la cuenta ascendente 254, 255, 0, 1,2... y si se llega a cero se cuenta del maximo hacia atras 2,1,0,255,254,253...; espero haberte ayudado, cuando yo comence con los micros lo hice con mas dudas y nadie me ayudo mucho solo los libros e internet me ayudaron; y para que me sirve saber algo si no lo comparto.

cuidate bye
 
Excelente amigo crpty esa es la actitud,entre todos aprendemos cosa nuevas, no se si sea pertinente pero dejo a concentimiento para desarrollar proyectos con pic basic pro y el entorno virtual de Labview o abrir otro hilo a mi parecer seria excelente ya que no he encontrado información en español referente a este tema de una forma consisa lo primero que se haria seria un tutorial para posteriomente trabajar con este entorno,y por ejemplo desarrollar tarjetas de comunicacion serial para controlar actuadores desde la PC como el ejemplo del caso de la temperatura con el LM 35 con rsr 232, control de motores desde la PC, entre otros proyectos que tengo planeados desarrollar y compartir con los miembros de este foro.

Espero comentarios
 
hola amigo cripty gracias por la respuesta mira lo que yo estoy haciendo es multiplicar 255 por 2 me queda 510 y lo que hago es restar 10 para que me quede 500 como he querido hacer y sigo intentando y nada de nada me pasa lo que sucede coloque como me dices para que no me de numeros negativos pero sigue de esa misma manera es del desbordamiento no me queda claro la verdad me toca analizarle bien y entender lo que me quieres decir muchas gracias por la ayuda y el acolite y no ser egoista con los que sabes....
amigo mecatrodatos seria muy interesante si pudieras desarrollarlo con los micros 18f2550 y 18f4550 para que sea muy completo y poderlo hacer desde USB talvez sea pensar demasiado alto bueno seria chevere disculpando el atrevimiento ya que uno apenass comienza en esto de los micros
 
amigo mecatrodatos seria muy interesante si pudieras desarrollarlo con los micros 18f2550 y 18f4550 para que sea muy completo y poderlo hacer desde USB talvez sea pensar demasiado alto bueno seria chevere disculpando el atrevimiento ya que uno apenass comienza en esto de los micros[/QUOTE

Claro patico 21 esa es la idea realizaremos algunos ejercicios con cominicacion RSR 232 con el pic 16f877A y posteriormente con el PIc 18f2550, mirare tu codigo de los potencimetros y te dare algunos comentArios paRa resolver tu problema de visualizacion en lcd,seria interesante realizarlo desde comunicacion serial como sugerencia.
 
que tal vamos con otro proyecto de teclado matrixal pero de visualizacion de letras (A;B;C;D;*;#) he aqui el codigo :

Código:
; programa de visualizacion de teclado 
'          1 2 3 A 
'          4 5 6 B
'          7 8 9 C
'          * 0 # D
' con pic 16f877A y lcd 2x16 en donde muestra la tecla presionada en la pantalla
' del LCD utilizando operandos matematicos del PBP. 


'Definir libreria  
Define	LOADER_USED	1


'definir oscilador externo
@ device xt_osc
define osc 4

' Define LCD connections
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       3
Define  LCD_EREG        PORTD
Define  LCD_EBIT        2


' Definicion de variables
col     Var     Byte            '  columnas
fila    Var     Byte            ' filas 
B       Var     Byte            ' numero 
A       Var     Byte            ' tecla a visualizar



OPTION_REG.7 = 0        ' Activa resistencias internas PORTB 
ADCON1 = 7              ' PORTA y PORTE digital
Low PORTD.1             ' LCD R/W low (escritura)
Pause 100               ' tiempo para inicializar el LCD
Lcdout $fe, 1, "PRESIONE TECLA"  ' mensaje 

inicio:
Gosub leer            
Lookup A, ["0123456789*#ABCD"],B
Lcdout $fe,1,B      ' mostrar tecla primida
Goto inicio              


' Subrutina para leer tecla pulsada 
leer:
Pause 50                ' esperer 50ms

leer0:
PORTB = 0               ' puerto B como salida
TRISB = $f0             
If ((PORTB >> 4) != $f) Then leer0    
Pause 50                

leer1:
For col = 0 To 3       
PORTB = 0       
TRISB = (dcd col) ^ $ff 
fila = PORTB >> 4        'leer filas 
If fila != $f Then tecla     
Next col
Goto  leer1           

tecla: 
B = (col * 4) + (ncd (fila ^ $f)) - 1

' transformadorrmacion de tecla activada 
' 10 = *
' 11 = #
' 12 = A
' 13 = B
' 14 = C
' 15 = D
Lookup B, [1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15],A
Return                  ' retornar 
End

Como siempre dejo la simulacion en proteus , codigo fuente y esquematico "comentar es agradecer"
 

Adjuntos

  • TCLEDO -LCD.zip
    86.1 KB · Visitas: 850
  • lcdtecla.zip
    56.4 KB · Visitas: 762
Última edición por un moderador:
hola amigos otra vez por aqui solicitando su ayuda quisiera poder utilizar mi codigo que lo he posteado anteriormente pero ahora quiero activar un mensaje a travez de un boton que me diga memoria llena lo he logrado pero independientemente al codigo que quiero anadirle si lo pego tan solo o solo se ejecuta el nuevo codigo o el codigo anterior como debo hacer para que funcionen el codigo del conversor analogo digital cuando no pulse el boton y al pulsar el boton me despliegue el mensaje de mamoria llena les añado el codigo ojala me puedan ayudar por favor


Código:
@devicext_osc ; oscilador externo XT 
define osc 4
define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4
P1 VAR BYTE
P2 VAR BYTE
P3 VAR BYTE
boton var portb.0
ADCON1=%100
INICIO:
PAUSE 300
POTEN1:
    ADCON0=%1000001
    GOSUB MEDIR
    P1= ADRESH
POTEN2:
    ADCON0=%1001001
    GOSUB MEDIR
    P2=ADRESH
POTEN3:
    ADCON0=%1011001
    GOSUB MEDIR
    P3=ADRESH
p1=(p1*500/255)
p2=(p2*30/255)
 
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
pro:                       'desde aqui es el pedazo de codigo que quisiera 
if boton=0then encen       'que se  muestre cuando pulse el boton 
lcdout $fe,1               '
goto pro                    '
encen:                       '
pause 200                     '
lcdout $fe,1,$82,"MEMORIA LLENA" '
lcdout $fe,$C0,"***PRECAUCION***" '
goto pro                           '
END
 
Última edición por un moderador:
Hola amigos, soy nuevo en la programacion en PBP y tengo una duda con respecto a como mover el contenido de un dato en la LCD hacia la izquierda o derecha a traves del comando LCDOUT... Regularmente lo hacía com assembler pero no lo se hacer en PBP. Agradezco el apoyo que me puedan brindar en este requerimiento con ejemplos de instrucciones que contengan desplazamientos de valores tal como la introduccion de datos en una calculadora o la escritura con un editor de texto cualquiera (cursor activo, borrar datos, etc) Saludos a todos
 
Última edición:
Buen día, mi idea es censar 2 o mas temperaturas con distintos censores y visualizarlo en el mismo LCD cambiando la selección con un pulsador. Pero no pude lograr con figurar las 2 entradas veo una o la otra, alguien me puede ayudar?
Gracias
 
pues la verdad no se me ocurre como hacerlo pero la mas facil es con un switch :LOL: o porque no le haces una cosa mas vacana hazlo con un barrido por ejemplo una caratula primero luego de un x tiempo lo avanzas a la temperatura 1 y despues a la temperatura 2 y despues otra vez a la caratula...se veria vacano asi bueno para mi es una idea nada mas
 
Que tal amigos para mi amigo patico en estos dias subo la forma de visualizar en lcd movimiento en distancia por medio de potenciometros a forma real, para mi amigo gregoril bedoya claro que si es posible pero debes tener en cuenta el nivel de tension maxima que otorga la fuente para realizar el acondicionamiento se señal y ser visualizado el valor real en un dispositivo grafico(display ,lcd),por otro lado te recomiendo amigo rfandres realizar un menu y con ello visualizar las temperaturas sensadas por lo sensores que utilizaras que pueden ser analogo o digitales.
 
logre pasar los menu con el mismo pulsador, aca se los dejo.


Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 7/25/2009                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
 
@ 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 conucacion 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 = %11111111        
LCDOUT $FE, 1        ;limpiar LCD 
; Programa principal e inicio de la conversion A/D
LOOP11:
LCDOUT $FE, 1        ;limpiar LCD 
LOOP:
ADCIN 0,Sensar             ;Lee canal 0 y guardar en variable sensar
Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,$80, "TEMP. MOTOR"
LCDOUT $FE,$c0,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
pause 200
if porta.4=1 then loop1
goto loop
LOOP1:
LCDOUT $FE, 1        ;limpiar LCD 
LOOP12:
ADCIN 1,Sensar             ;Lee canal 0 y guardar en variable sensar
Temp = 2*sensar           ;Conversion a grados centigrados 
LCDOUT $FE,$80, "TEMP. INTERIOR"
LCDOUT $FE,$c0,"TEMPERATURA:",DEC2 Temp,"C" ;mostrar valor decimal en LCD 
pause 200
if porta.4=1 then loop11
goto loop12
                  
END                        ;fin del programa
 
Última edición por un moderador:
despues de mucho tiempo, regrese y estoy en un nuevo proyecto que es algo un poco mas enfocado a la potencia; tengo que encender un triac o un diac de potencia en el cruce por cero de la tension que para la aplicacion es generalmente 440 o 380 voltios en alterna espero me den ideas acerca de como hacer saber al micro que la onda esta en el cruce por cero.
cuidense mucho amigos
 
Atrás
Arriba