TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Evonkc 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. :)
'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
-
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!.
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
-
Felicidades por resolverlo por tu propia cuenta, llevo varios días que apenas puedo pasar por el foro.
-
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.