Hola dogflu66.
tengo una pregunta, de la rutina del programa 2.
lee_hora: 'lee la hora del RTC en formato BCD y la pasa a decimal
i = 0 'variable indice, asigna los datos de forma ordenada, leidos del RTC
While i <= 6 'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
PIE1.TMR1IE = 0 'deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, i, reg(i) 'lectura de la direccion de memoria indicada del RTC, formato BCD
PIE1.TMR1IE = 1 'activa las interrupciones del timer1
aux_4l = reg(i) And %00001111 'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000 'segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %01110000 'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %00110000 'horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %00000000 'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %00110000 'dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %00010000 'mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000 'año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4) 'convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l 'fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1 'incrementa la variable indice con cada repeticion del bucle While/Wend
Wend 'fin del bucle y salta a While
Return
------------------------------
PIE1.TMR1IE = 1 para que lo volvemos a encender?para que lo apagamos antes? no comprendo, perdona mi ignorancia.
otra cosita:
aux_4l = reg(i) And %00001111
la variable que guarda el nible bajo es igual al resultado de hacer una and logica del registro numero "i" es decir "reg(i)" y el numero binario 0111 0000,
¿por que ese numero binario? en algunos otros tambien? cambia, tiene que ver con el registro del DS1307
si la variable "i" toma valores desde 0 hasta 6, la parte baja del nible lo comprendo, pero la baja
la parte alta nos va ha dar siempre 0. Tomamos por ejemplo i=1 seria:
0000 0001 --> reg(1)
0111 0000 -->%01110000
------------
000000000 --> aux_4h=0000
aux_4h = ShiftRight(aux_4h, 4)
con esto lo desplamos el nible alto a derecha, 4 posiciones a la derecha, si fuera 0111 0000 seria 0000 0111, pero como da todo ceros seguira siendo cero.
La conversion del nible alto a bajo no se deberia de hacer antes?
antes de la and logica asi se evitaria que fuera cero
otra cosilla
reg(i) = (aux_4h * 10) + aux_4l
con esto haces: el registro numero "i" le igualamos el valor del nible alto multiplicado por 10 y le sumamos el nible bajo.
yo creo que el nible alto estaba en binario, salio como resultado de una and logica del registro numero "i" con el numero
binario 0000 1111.
no entiendo como multiplicas un numero binario por un numero decimal, a no ser que el aux_4h sea decimal.
ejemplo i=1
aux_4h = reg(i) And %01110000 parte del nible alto
aux_4H= 0000 0001 and 0111 0000 se queda con la parte alta
0000 0001
0111 0000
--------------
0000 0000 --> aux_4h si se queda con la parte alta simpre sera cero ya que
"i" toma valores de 0 a 6 situandose simpre en el nible bajo
aux_4l = reg(i) And %00001111
aux_4l= 0000 0001 and 0000 1111 = 0000 0001 solo almacena los 4 primeros seria 0001 aux_4l =0001
aplicamos:
reg(i) = (aux_4h * 10) + aux_4l siendo aux_4l simpre binario
reg (i)=(0*10)+dato binario
reg (i)= aux_4l en binario
para poner un dato BCD "0101" a binario seria (0*23)+(1*22)+(0*21)+(1*20)
esto sera (0*8 )+(1*4)+(0*2)+1*1) => 0+4+0+1 => 4+1 => 5 en decimal
I2CRead sda, scl, 0xd0, i, reg(i) yo prefiero poner para "I2CRead" 0xD1 pero bueno
estamos leyendo las direciones correlativas del 0 al 6 con el valor de"i" ademas estamos leyendo correlativamente los registros del 0 al 6 del nible bajo.
amigo dogflus66 podrias corregirme, y aclarme esta dudas.
gracias