TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: siniestro en 22 de Septiembre de 2014, 12:55:48
-
Buen dia amigos me acerco a este foro con una duda. En base a ejemplos hice este programa para un PIC16F877A
DEFINE LCD_DREG PORTD 'define el puerto a usar para el LCD
DEFINE LCD_DBIT 4 'define el uso de solo 4 bits de direccion 7-6-5-4
DEFINE LCD_RSREG PORTD'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 2 'Define cual pin sera el pin R/s del display
DEFINE LCD_EREG PORTD 'UTILIZAR EL ENABLE EN EL PUERTO D
DEFINE LCD_EBIT 3 'Define Pin del puerto para el Enable del LCD
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4 'Define numero de lineas del Display
Hora VAR byte
Minuto var byte
DiaMes var Byte
Mes var byte
Ano var byte
SYMBOL sda=PORTC.5
SYMBOL scl=PORTC.4
LOOP
I2CREAD sda, scl,$D0,1,[mINUTO]
I2CREAD sda, scl,$D0,2,[hORA]
I2CREAD sda, scl,$D0,4,[dIAMES]
I2CREAD sda, scl,$D0,5,[mES]
I2CREAD sda, scl,$D0,6,[aNO]
PAUSE 100
MINUTO=((MINUTO>>4)*10+(MINUTO & $0F))
hora=((MINUTO>>4)*10+(MINUTO & $0F))
diames=((diames>>4)*10+(diames & $0F))
Mes=((Mes>>4)*10+(Mes & $0F))
ano=((ano>>4)*10+(ano & $0F))
pause 50
LCDOUT $fe, 1,hora/10+48,hora//10,":",minuto/10+48,minuto//10+48," ",diames/10+48,diames//10+48,"/",mes/10+48,mes//10+48,"/",ano/10+48,ano//10+48
GOTO LOOP
Al probarlo en proteus en el display solo se ve 00:00 00/00/00
Pero en fisico, en la protoboard funciona bien. Mi duda es sobre las funciones siguientes:
MINUTO=((MINUTO>>4)*10+(MINUTO & $0F))
Se que los dos simbolos de mayor que, sirven para desplazar en este caso 4 Bits a la derecha, y el & es un AND pero la verdad no entiendo el porque de operar el valor leido en Minutos de esta forma.
Luego en la visualizacion en el LCD:
LCDOUT $fe, 1,hora/10+48,hora//10,":",minuto/10+48,minuto//10+48," ",diames/10+48,diames//10+48,"/",mes/10+48,mes//10+48,"/",ano/10+48,ano//10+48
porque hace esto hora/10+48 y luego hora//10 , en que formato quedan las variables despues de: hora=((MINUTO>>4)*10+(MINUTO & $0F)) porque no usar la forma
DEC o HEX o BIN en estos casos para mandar el valor al LCD ????
Gracias
-
porque el LCD espera el valor numerico (codigo ASCII) del caracter a mostrar.
saludos
-
Gracias mi amigo, en efecto. Supuse eso porque recuerdo que cuando programe en C++ para convertir caracteres (variables tipo Char) a su valor entero (para pasar a valores int), simplemente le restaba 48 al valor char para volverlo del ASCII a Int, por lo tanto, si hago lo inverso , sumandole 48 a un entero, en el caso de ser valores para los numeros, el valor se convierte en el equivalente ASCII.
hora/10+48,hora//10+48
si hora=24
hora/10+48=50.2 y como PBP no maneja decimales, el ASCII 50=2
hora//10=4+48=52 y el ASCII 52=4
en el caso de :
hora=((MINUTO>>4)*10+(MINUTO & $0F))
es porque el RTC en lugar de enviarme el 24 en binario= 00011000
me envia 00100100 que es la representacion BCD y hay que convertirlo a decimal
En estos momentos por curiosidad estudio como hace esa conversion, por lo que veo desplaza los bits 4 posiciones
000000010 luego multiplica por 10= 20, la seccion que no entiendo es: (MINUTO & $0F) esa operacion deberia dar 4 para sumarlos al 20 y asi tener la representacion decimal del BCD
Edito:
(MINUTO & $0F) es 4 porque & segun el manual PBP en español
OPERADORES DE BITS INTELIGENTES (BITWISE) INDICE
Estos operadores actuan sobre cada bit de un valor en forma booleana .Pueden ser usados para aislar bits o para agregar bits dentro de un valor .
B0 = B0 & %00000001 ´ aisla el bit 0 de B0
el hexadecimal 0F=15 y en binario %1111 y entonces MINUTO & $0F aila los primeros 4 bits del BCD y toma las "unidades" y en efecto eso es 4
-
exactamente!