Autor Tema: no me lee el segundo  (Leído 2846 veces)

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

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
no me lee el segundo
« en: 22 de Abril de 2013, 16:16:25 »
Amigos:

Saludos a todos, Saben necesito recibir de sus observaciones y consejos, llevo días buscando donde puede estar el error y no logro ubicar   :x :?. el siguiente programa se basa en el no mal ponderado reloj rtc ds1307.
* El objetivo principal es programar el reloj y antes de que inicie el programa principal "inicio:", lea el segundo en que se encuentra la memoria del reloj, por ejemplo si el reloj esta en el segundo 50 entonces la expresión y= 60-seg1, me de como resultado 10  y este valor sea la referencia para el ciclo while que tendrá un decremento de 1 cada 1 seg. las consecuencia de llevar acabo esta acción es sincronizar el funcionamiento del programa principal "inicio" en 0 seg y no en otro.
* El problema que tiene este programa, es que no me le el seg que esta transcurriendo, por ende no resulta lo deseado.


Es por ello estimados que espero poder recibir una pequeña ayuda, retroalimentacion, etc; se agradecería un millón. Saludos a todos.  :)


Código: [Seleccionar]

'configuracion de botones y led
'Symbol s1 = PORTB.2
Symbol led1 = PORTB.3
Symbol led2 = PORTB.5
Symbol led3 = PORTB.6
Symbol led4 = PORTB.7
'Dim s1_on As Byte
's1_on = 0
's1 = 1

'configuracion de i2c

Symbol sda = PORTB.0
Symbol scl = PORTB.1

'configuracion de variable reloj
Dim addr(7) As Byte
Dim data As Byte
Dim seg As Byte
Dim min As Byte
Dim hora As Byte
Dim dia As Byte
Dim daym As Byte
Dim mes As Byte
Dim anno As Byte
Dim seg1 As Byte
Dim y As Byte


Gosub reloj1
WaitMs 100
Gosub datos
Gosub calculo1
Gosub calculo
While y > 0  'ciclo while que me permite retrazar el inicio del programa en la programa principala "INICIO"
y = y - 1
WaitMs 1000  'retraso de 1 segundo a la diferencia.
Toggle led4  'observo que transcurre el segundo deseado
Wend
Toggle led2

inicio:
Toggle led3  'parpadeo del led me indica que esta en el programa principal
WaitMs 1000
Goto inicio
End                                               

reloj1:
For addr = 0 To 7
'(segundos, minutos, horas, dia semana, dia, mes, año), control
data = LookUp(0x50, 0x00, 0x16, 0x04, 0x25, 0x10, 0x90), addr
I2CWrite sda, scl, 0xd0, addr, data  'escribe los datos al ds1307
Next addr
'Toggle led1
's1_on = 0
Return                                           

datos:
seg = 0
min = 0
hora = 0
daym = 0
dia = 0
mes = 0
anno = 0
seg1 = 0


'Toggle led1
addr = 0
I2CRead sda, scl, 0xd1, 0x00, seg
WaitMs 20
addr = 1
I2CRead sda, scl, 0xd1, 0x01, min
WaitMs 20
addr = 2
I2CRead sda, scl, 0xd1, 0x02, hora
WaitMs 20
addr = 3
I2CRead sda, scl, 0xd1, 0x03, dia
WaitMs 20
addr = 4
I2CRead sda, scl, 0xd1, 0x04, daym
WaitMs 20
addr = 5
I2CRead sda, scl, 0xd1, 0x05, mes
WaitMs 20
addr = 6
I2CRead sda, scl, 0xd1, 0x06, anno
WaitMs 20
Return                                           

calculo:
Toggle led1  'observo que paso por esta rutina
y = 60 - seg1
Return                                           

calculo1:
'convierto de hexadecimal a decimal
Toggle led1 'observo que ha pasado por esta rutina
If seg >= 0 And seg <= 9 Then seg1 = seg
If seg >= 16 And seg <= 25 Then seg1 = seg - 6
If seg = 32 And seg <= 41 Then seg1 = seg - 12
If seg >= 48 And seg <= 57 Then seg1 = seg - 18
If seg >= 64 And seg <= 73 Then seg1 = seg - 24
If seg >= 80 And seg <= 89 Then seg1 = seg - 30
Return


Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: no me lee el segundo
« Respuesta #1 en: 22 de Abril de 2013, 18:25:51 »
Me voy a auto-responder. encontré el error y era sumamente evidente. solo hay que colocar los pines como entradas y salidas digitales. les dejo el programa que diseñe para observar los cambios y como avanza, espero que a este pequeño programa le puedan sacar algun provecho, especialmente aquellos que hacen dataloggers!.


Código: [Seleccionar]

Define CLOCK_FREQUENCY = 20
'Define SIMULATION_WAITMS_VALUE = 1
Define LCD_BITS = 8  'indicamos que el bus de datos del lcd sera de 8 bits
Define LCD_DREG = PORTD  'el bus de datos sera el puerto d
Define LCD_DBIT = 0  '(0/4) indiferente en bus de 8 bits
Define LCD_RSREG = PORTE  'el bit RS esta en el puerto E
Define LCD_RSBIT = 0  'se ua RE0 RS
Define LCD_EREG = PORTE  'el bit e esta en el puerto E
Define LCD_EBIT = 2  'se usa RE1 para E
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_COMMANDUS = 2000  'tiempo de espera despues de ejecutar un comand del lcd en uSeg
Define LCD_DATAUS = 50  'tiempo de espera despues de enviar un dato al lcd en uSeg
Define LCD_INITMS = 50  'tiempo de espera despues de inicializar el display, solo se ejecuta una vez en uSeg

Lcdinit

'---------------------puerto I2C------------------
Symbol sda = PORTB.0  'asignamos nombre al pin que hara de sda del puerto I2C
Symbol scl = PORTB.1  'asignamos nombre al pin que hara de scl del puerto I2C

'---------Botones para las interrupciones----------

'---------leds---------------
AllDigital
Symbol led1 = PORTB.3
Symbol led2 = PORTB.4
Symbol led5 = PORTB.5
Symbol led3 = PORTB.6
Symbol led4 = PORTB.7

'variables del reloj

Dim addr(7) As Byte
Dim data As Byte
Dim seg As Byte

Dim seg1 As Byte
Dim min As Byte
Dim hora As Byte
Dim dia As Byte
Dim daym As Byte
Dim mes As Byte
Dim anno As Byte
Dim y As Byte

'--------------------sin seteo del reloj-----------------

For addr = 0 To 7
'(segundos, minutos, horas, dia semana, dia, mes, año), control
data = LookUp(0x40, 0x20, 0x23, 0x01, 0x04, 0x03, 0x03, 0x90), addr
I2CWrite sda, scl, 0xd0, addr, data  'escribe los datos al ds1307
Next addr

'********************Cuerpo principal del programa*************************
Gosub datos
Gosub calculo1
Gosub calculo
While y > 0
y = y - 1
Gosub lcd4
WaitMs 1000
Toggle led4
Wend
Toggle led1



inicio:
Toggle led5
WaitMs 1000
Goto inicio
End                                               



'-----------------------------Sub-Rutinas----------------------------------



datos:  'leemos la hora desde el dispositivo ds1807
addr = 0
I2CRead sda, scl, 0xd1, 0x00, seg
WaitMs 20
addr = 1
I2CRead sda, scl, 0xd1, 0x01, min
WaitMs 20
addr = 2
I2CRead sda, scl, 0xd1, 0x02, hora
WaitMs 20
addr = 3
I2CRead sda, scl, 0xd1, 0x03, daym
WaitMs 20
addr = 4
I2CRead sda, scl, 0xd1, 0x04, dia
WaitMs 20
addr = 5
I2CRead sda, scl, 0xd1, 0x05, mes
WaitMs 20
addr = 6
I2CRead sda, scl, 0xd1, 0x06, anno
WaitMs 20
Return                                           

calculo:
Toggle led3
y = 60 - seg1
Return                                           
calculo1:
Toggle led2
If seg >= 0 And seg <= 9 Then seg1 = seg
If seg >= 16 And seg <= 25 Then seg1 = seg - 6
If seg = 32 And seg <= 41 Then seg1 = seg - 12
If seg >= 48 And seg <= 57 Then seg1 = seg - 18
If seg >= 64 And seg <= 73 Then seg1 = seg - 24
If seg >= 80 And seg <= 89 Then seg1 = seg - 30
Return                                           

lcd4:
Lcdcmdout LcdClear
Lcdout "y:", #y
Return     

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: no me lee el segundo
« Respuesta #2 en: 22 de Abril de 2013, 19:32:19 »
Felicidades por resolverlo por tu propia cuenta, llevo varios días que apenas puedo pasar por el foro.
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: no me lee el segundo
« Respuesta #3 en: 24 de Abril de 2013, 13:06:46 »
Gracias por tu apoyo y animo al = que algunos consejos que he visto por tu hilo, sin duda es una gran satisfacción resolverlo por uno mismo los problemas y sin mencionar que levo programando solo 2 a 3 meses.
Ahora en unos días mas subiré un programa diseñado en Vb6 que se comunica con el pic para programar el reloj desde el HID y que integra el programa anterior. Para hacer algunos aportes.