Autor Tema: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A  (Leído 2952 veces)

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

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #15 en: 20 de Noviembre de 2017, 15:05:25 »
Hola gracias por responder.La subrrutina a la que me refiero es la que realiza la interrupcion por activacion del pin RB0/INT " PORTB,0".Mientras solo muestra el relog va bien,pero cuando completa el minuto y tiene que mostrar la fecha en desplazamiento solo muestra la primera letra y luego se cuelga el programa.y no consigo ver donde esta el problema,con tu ayuda he consegido reducir el numero de lineas pero por lo demas sige con el mismo fallo.Espero que tu des con una solucion ,porque yo con mi corta experiencia no consigo encontrarla.Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #16 en: 22 de Noviembre de 2017, 07:52:27 »
Disculpa, no eh tenido tiempo para verlo. Apenas me haga un tiempo lo miro, ya que requiero un poco mas de tiempo para este programa.

Simple, tu problema esta en que el I2C es por software y lo estas realizando en la interrupcion. Si el I2C se toma demasiado tiempo perdes un pulso cada 2.

Solucion: Mover la lectura de I2C al loop principal. Pero como esta lleno de cosas el loop principal seguramente tampoco te funcione.


Entonces como solucionamos este problema. Mejor encararlo de otra forma. Para que vamos a leer y leer y leer cada segundo el RTC. Para eso hacemos esto (antes del loop principal y luego de la configuracion) que nos facilite la vida:

- Limpiamos Flag RB0, todavia no habilitamos la interrupcion
- Configuramos el RTC
- Leemos el RTC, vamos a tener Hora, Minutos y Segundos guardados en el micro
- Activamos la interrupcion de RB0, si paso un pulso mientras leiamos al activarlo va a ir a la interrupcion, si no paso entonces no pasa nada.

Y aca solo resta la parte de la interrupcion, que hacemos en la interrupcion?, solo sumamos 1 segundo cada ves que ocurre a esos registros donde guardamos los segundos, miuntos y horas.

Entonces al durar muy poco la interrupción, NUNCA vas a perder un segundo. Solo necesitas leer el RTC 1 sola ves. Y luego en tu loop principal que es donde vas a mostrar todo es donde va a depender si lo haces muy lento va a mostrarte tal ves mal el valor, pero ahora vas a tener los segundos/minutos y horas de forma correcta en tu PIC.

Si queres asegurarte un poco mas, cada 1 dia, es decir cuando de que Horas = Minutos = Segundos = 0, activas un bit de algun registro, y luego en tu loop principal (fuera de la interrupcion) lees nuevamente el RTC.



PD: Todavia te falta pasar todos las letras y numeros que los tenes realizados con MOVLW/MOVWF, a ponerlos con DT Como tenes los Meses.

Luego hay que modificar TABLA_CARACTERES para que no haga saltos de esa forma, sino que lo vamos a computar de otra forma y leer la flash. Pensa que es aproximadamente el 40% de lineas de programa que tenes, te deberia quedar asi:

Código: ASM
  1. COMIENZO_LETRAS:
  2.       DT 0X3C, 0X7E,  0X66, 0X66, 0X66, 0X66, 0X7E, 0X3C        ;0
  3.       DT 0X18, 0X38,  0X78, 0X18, 0X18, 0X18, 0X18, 0X7E        ;1
  4.       ;......... Aca siguen todas las demas
« Última modificación: 22 de Noviembre de 2017, 09:08:24 por KILLERJC »

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #17 en: 23 de Noviembre de 2017, 04:18:10 »
Gracias no se me habia ocurrido lo del tiempo que toma el I2C por sofware, voy a reformar el codigo como me dices a ver si asi funciona.Ya te informare de como ha ido.De lo de hacer una tabla con "DT"
con los caracteres ya lo hize,pero la tabla resultante se multiplica por 8 y se pasa de las 256  primeras lineas del codigo con lo que me daba un error al compilar.Si se te ocurre alguna forma de hacerlo que funcione dimelo.Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #18 en: 23 de Noviembre de 2017, 11:58:05 »
Citar
De lo de hacer una tabla con "DT" con los caracteres ya lo hize,pero la tabla resultante se multiplica por 8 y se pasa de las 256  primeras lineas del codigo con lo que me daba un error al compilar

Es que no necesitas una tabla... Para leer la FLASH podes hacerlo con los registros de la EEPROM, y tiene 2 ventajas.. No te preocupas por las paginas y El registro de las EEPROM son 2, por lo cual son 16bits, es cargar el valor de "COMIENZO_LETRAS" en el registro de la EEPROM, y luego sumarle el offset.

Le pones un ORG que comienze en 00, ejemplo 0x1700 si es que llega al 0x1FFF, asi siempre el comienzo de una letra los 3 bits de menor peso son 0, eso te va a indicar cuando terminaste la letra ( por que son multiplos de 8 ).

Luego cambias esa "tabla" que tenias con GOTO, por una funcion que te devuelva los valores correspondientes leyendo la flash.

Busca en el datasheet: "Read Flash" esta en la seccion de EEPROM y Flash. Ahi incluso te dice el paso a paso.



 

anything