Autor Tema: RCT Ds1307  (Leído 2127 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
RCT Ds1307
« 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

Código: [Seleccionar]
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:

Código: [Seleccionar]
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:

Código: [Seleccionar]
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

« Última modificación: 22 de Septiembre de 2014, 13:03:17 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: RCT Ds1307
« Respuesta #1 en: 22 de Septiembre de 2014, 13:17:00 »
porque el LCD espera el valor numerico (codigo ASCII) del caracter a mostrar.

saludos
-
Leonardo Garberoglio

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: RCT Ds1307
« Respuesta #2 en: 22 de Septiembre de 2014, 13:44:49 »
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 :

Código: [Seleccionar]
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
Citar
        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




« Última modificación: 22 de Septiembre de 2014, 13:50:06 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: RCT Ds1307
« Respuesta #3 en: 22 de Septiembre de 2014, 14:03:05 »
exactamente!
-
Leonardo Garberoglio