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

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

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Saludos necesito ayuda porque estoy estancado.El programa debe hacer una interrupcion por
RB0/INT cada segundo,leer el DS1307 y  volver al programa que es un bucle de sacar por la pantalla
la hora/minuto/segundo y cada minuto muestra en movimiento el dia de la semana /dia del mes/mes y año y acontinuacion sigue con hora/minuto/segundo asta que complete el siguiente minuto.
El problema es que cuando se produce la interrupcion se queda parado.
El programa pasa de la pagina 0 ,  pero ya he probado a configurar el PCLATH y tambien con pagesel
y sigue igual.
Ay os dejo el programa.
* PRUEBA PANEL 1M.pdf-ch.pdf
(94.53 kB - descargado 272 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #1 en: 30 de Octubre de 2017, 21:53:35 »
Disculpa pero creo que falta el inicio, donde configuras los vectores de reset e interrupcion.

Por otro lado por unas rutinas que vi abajo, me parece que estas usando I2C por software ( SDA_bajo, SDA_altaimpedancia, etc), cuando tenes un modulo para hacerlo por hardware.

DecenasHoras/UnidadesHoras/DosPuntosHoras/DecenasMinutos/UnidadesMinutos/etc son todos repetitivos. Se podria hacer mucho mas facil con el FSR.

DiasSemana/Meses seguramente no esten funcionando como vos crees, las etiquetas son direcciones de programa, Es decir son de 13 bits, pero la instruccion RETLW solo permite devolver 8 bits. Así que si tu idea era de llamar a la tabla para obtener el valor de dirección no va a servir. Solo estarias obteniendo los 8 bits menos significantes de la direccion.

Eso son algunas de las cosas que note. Pero no me volvi loco mirando el programa al ver tanto codigo que puede ser resumido. Y tampoco se puede seguir cuando se encuentra incompleto.

Eso si una cosa mas...
Para la proxima copia y pega el programa aca. Luego lo seleccionas, y hay una lista cuando escribis el mensaje que dice "Codigo" elegi ASM.

Código: ASM
  1. Hola:
  2.  goto Hola

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #2 en: 01 de Noviembre de 2017, 04:41:48 »
Gracias por responder KILLERJC.Soy nuevo en esto de la programacion solo e echo pequeños programas para el 16F84 y quiero ver si puedo completar este proyecto a ver si con vuestra ayuda soy capaz.
El programa no lo pude enviar completo porque en pdf me ocupa mas de 300 kb.ysolo se puede enviar 200.El I2C lo tengo por software porque el modulo MSSP lo tengo ocupado con la comunicacion SPI para controlar el panel de 8 matrix de led de 8x8.Si tu crees que con el FSR se puede hacer mucho mas facil,por fabor explicamelo toda la ayuda es bien recibida gracias de antemano.
A ver si puedo enviarlo completo ,saludos.

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #3 en: 01 de Noviembre de 2017, 05:22:19 »
[code]1/3  PROGRAMA[code  LIST      P=16F876A
                           INCLUDE <P16F876A.INC>
     
     
     CBLOCK       0X20
     Colun_1       
     Colun_2
     Colun_3
     Colun_4
     Colun_5
     Colun_6
     Colun_7
     Colun_8
     Conta_Barrido_Config
     Caracter
     Conta_Encendidos                 
     Conta_1
     Conta_2
     Conta_3
     Conta_4
     CONTA_NO_OP_D1
     CONTA_NO_OP_D2
     CONTA_NO_OP_D3
     CONTA_NO_OP_D3B
     CONTA_NO_OP_D4
     CONTA_NO_OP_D4B
     CONTA_NO_OP_D5A
     CONTA_NO_OP_D5B
     CONTA_NO_OP_D6A
     CONTA_NO_OP_D6B
     CONTA_NO_OP_D7
     CONTA_NO_OP_D8
     COLUN
     RX_DATO
     DATO_HIT
     DATO_LOW
     R_ContA
     R_ContB
     I2C_ContadorBits
     I2C_Dato
     I2C_Flags
     Anho
     Mes
     Dia
     DiaSemana
     Hora
     Minuto
     Segundo
     Bus1Linea_Dato
     Bus1Linea_ContadorBits
     DS1820_Temperatura
     DS1820_TemperaturaSigno
     DS1820_TemperaturaDecimal
     FlagsAjuste
     Auxiliar
     ApuntaCaracter
     ValorCaracter
     Guarda_W
     Guarda_STATUS
     Guarda_Auxiliar
     Guarda_PCLATH
     Conta_Segundos
     CONTA_PRUEBA                   
     ENDC
     DS1307_DireccionEscritura   EQU    0XD0
     DS1307_DireccionLectura     EQU    0XD1
     DS1820_Skip_ROM_Command     EQU    0XCC
     DS1820_Read_Scratchpad_Command    EQU   0XBE
     DS1820_Convert_T_Command          EQU   0X44
     #DEFINE       I2C_UltimoByteLeer  I2C_Flags,0
     #DEFINE       SCL                  PORTA,3
     #DEFINE       SDA                  PORTA,4
     #DEFINE       Bus1Linea            PORTB,3
     #DEFINE       ModoPulsador         PORTB,4
     #DEFINE       IncrementarPulsador  PORTB,5
     #DEFINE       OndaCuadrada_DS1307  PORTB,0
     #DEFINE       F_AjusteAnho         FlagsAjuste,5
     #DEFINE       F_AjusteMes          FlagsAjuste,4
     #DEFINE       F_AjusteDia          FlagsAjuste,3
     #DEFINE       F_AjusteDiaSemana    FlagsAjuste,2
     #DEFINE       F_AjusteHora         FlagsAjuste,1
     #DEFINE       F_AjusteMinuto       FlagsAjuste,0
     
             
  ;**************************************************************************
  ;*********PROGRAMA*********************************************************
 
   RESET ORG       0X0000
         goto      INICIO
         ORG       0X0004
         goto      ServicioInterrupcion
TABLA_CARACTERES
         addwf     PCL,F
         goto      Numer_0
         goto      Numer_1
         goto      Numer_2
         goto      Numer_3
         goto      Numer_4
         goto      Numer_5
         goto      Numer_6
         goto      Numer_7
         goto      Numer_8
         goto      Numer_9
         goto      Signo_Dos_Puntos
         goto      Signo_PuntoyComa;Equivale a signo de grados
         goto      Signo_MenorQue
         goto      Signo_Igual
         goto      Signo_MayorQue
         goto      Signo_Interrogacion
         goto      Signo_Arroba;Equivale a espacio
         goto      Letra_A
         goto      Letra_B
         goto      Letra_C
         goto      Letra_D
         goto      Letra_E
         goto      Letra_F
         goto      Letra_G
         goto      Letra_H
         goto      Letra_I
         goto      Letra_J
         goto      Letra_K
         goto      Letra_L
         goto      Letra_M
         goto      Letra_N
         goto      Letra_O
         goto      Letra_P
         goto      Letra_Q
         goto      Letra_R
         goto      Letra_S
         goto      Letra_T
         goto      Letra_U
         goto      Letra_V
         goto      Letra_W
         goto      Letra_X
         goto      Letra_Y
         goto      Letra_Z
         
Numer_0
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E 
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_1
         movlw     0X18
         movwf     Colun_1
         movlw     0X38
         movwf     Colun_2
         movlw     0X78
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Numer_2
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Numer_3
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X1E
         movwf     Colun_4
         movlw     0X1E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_4
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X06
         movwf     Colun_7
         movlw     0X006
         movwf     Colun_8
         return
Numer_5
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4
         movlw     0X3E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_6
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_7
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Numer_8
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_9
         movlw     0X3E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X3E
         movwf     Colun_5
         movlw     0X0C
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0x30
         movwf     Colun_8
         return
Signo_Dos_Puntos
         movlw     0X00
         movwf     Colun_1
         movlw     0X18
         movwf     Colun_2
         movlw     0X18
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_PuntoyComa
         movlw     0X00
         movwf     Colun_1
         movlw     0X3C
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X3C
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_MenorQue
         movlw     0X24
         movwf     Colun_1
         movlw     0X24
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_Igual
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_MayorQue
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
Signo_Interrogacion
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X10
         movwf     Colun_6
         movlw     0X08
         movwf     Colun_7
         movlw     0X04
         movwf     Colun_8
         return
Signo_Arroba
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Letra_A
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_B
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7C
         movwf     Colun_8
         return
Letra_C
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X60
         movwf     Colun_4
         movlw     0X60
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_D
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7C
         movwf     Colun_8
         return
Letra_E
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X78
         movwf     Colun_4
         movlw     0X78
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_F
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X78
         movwf     Colun_4
         movlw     0X78
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Letra_G
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X6C
         movwf     Colun_4
         movlw     0X6E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_H
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_I
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X18
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_J
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X06
         movwf     Colun_4
         movlw     0X06
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0x3C
         movwf     Colun_8
         return
Letra_K
         movlw     0X66
         movwf     Colun_1
         movlw     0X6C
         movwf     Colun_2
         movlw     0X78
         movwf     Colun_3
         movlw     0X70
         movwf     Colun_4
         movlw     0X70
         movwf     Colun_5
         movlw     0X78
         movwf     Colun_6
         movlw     0X6C
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_L
         movlw     0X60
         movwf     Colun_1
         movlw     0X60
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X60
         movwf     Colun_4
         movlw     0X60
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_M
         movlw     0X42
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X7E
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_N
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X76
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X6E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_O
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_P
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7C
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Letra_Q
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X76
         movwf     Colun_5
         movlw     0X67
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3E
         movwf     Colun_8
         return
Letra_R
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7C
         movwf     Colun_5
         movlw     0X78
         movwf     Colun_6
         movlw     0X6C
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_S
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4 
         movlw     0X3E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_T
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X18
         movwf     Colu1n_3
         movlw     0X181
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
         return
Letra_U
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_V
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X3C
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
         return
Letra_W
         movlw     0X42
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X42
         movwf     Colun_8
         return
Letra_X
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X24
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_Y
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X3C
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X30
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0x60
         movwf     Colun_8
         return
Letra_Z
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return   
MODO_SPI;Se configura en modo SPI
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco 1
         bsf       SSPSTAT,SMP
         bsf       SSPSTAT,CKE
         bcf       STATUS,RP0;Banco 0
         movlw     0X00
         movwf     SSPCON;CKP
         return
CONFIG_1
         movlw     0X09
         movwf     DATO_HIT
         movlw     0X00
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         call      ENVIA_DATO_SPI_2DIG
         call      ENVIA_DATO_SPI_3DIG
         call      ENVIA_DATO_SPI_4DIG
         call      ENVIA_DATO_SPI_5DIG
         call      ENVIA_DATO_SPI_6DIG
         call      ENVIA_DATO_SPI_7DIG
         call      ENVIA_DATO_SPI_8DIG
         return
CONFIG_2
         movlw     0X0A
         movwf     DATO_HIT
         movlw     0X01
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         call      ENVIA_DATO_SPI_2DIG
         call      ENVIA_DATO_SPI_3DIG
         call      ENVIA_DATO_SPI_4DIG
         call      ENVIA_DATO_SPI_5DIG
         call      ENVIA_DATO_SPI_6DIG
         call      ENVIA_DATO_SPI_7DIG
         call      ENVIA_DATO_SPI_8DIG
         return
CONFIG_3
         movlw     0X0B
         movwf     DATO_HIT
         movlw     0X07
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         call      ENVIA_DATO_SPI_2DIG
         call      ENVIA_DATO_SPI_3DIG
         call      ENVIA_DATO_SPI_4DIG
         call      ENVIA_DATO_SPI_5DIG
         call      ENVIA_DATO_SPI_6DIG
         call      ENVIA_DATO_SPI_7DIG
         call      ENVIA_DATO_SPI_8DIG     
         return
CONFIG_4
         movlw     0X0C
         movwf     DATO_HIT
         movlw     0X01
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         call      ENVIA_DATO_SPI_2DIG
         call      ENVIA_DATO_SPI_3DIG
         call      ENVIA_DATO_SPI_4DIG
         call      ENVIA_DATO_SPI_5DIG
         call      ENVIA_DATO_SPI_6DIG
         call      ENVIA_DATO_SPI_7DIG
         call      ENVIA_DATO_SPI_8DIG
         return
CONFIG_5
         movlw     0X0F
         movwf     DATO_HIT
         movlw     0X00
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         call      ENVIA_DATO_SPI_2DIG
         call      ENVIA_DATO_SPI_3DIG
         call      ENVIA_DATO_SPI_4DIG
         call      ENVIA_DATO_SPI_5DIG
         call      ENVIA_DATO_SPI_6DIG
         call      ENVIA_DATO_SPI_7DIG
         call      ENVIA_DATO_SPI_8DIG
         return
NO_OPERACION
         movlw     0X00
         movwf     DATO_HIT
         movlw     0X00
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI
         return
CONFIG_MAX7219
         call      CONFIG_1
         call      CONFIG_2
         call      CONFIG_3
         call      CONFIG_4
         call      CONFIG_5
         return
ENVIA_DATO_SPI
         bsf       SSPCON,SSPEN;Habilita modo SPI
         bcf       PORTC,2
         movf      DATO_HIT,W
         movwf     SSPBUF
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco1
BUCLE_1
         btfss     SSPSTAT,BF
         goto      BUCLE_1
         bcf       STATUS,RP0
         bcf       STATUS,RP1;Banco0
         movf      DATO_LOW,W
         movwf     SSPBUF
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco1
BUCLE_2
         btfss     SSPSTAT,BF
         goto      BUCLE_2
         bcf       STATUS,RP0
         bcf       STATUS,RP1;Banco0
         bsf       PORTC,2
         bcf       SSPCON,SSPEN;Desabilita modo SPI
         return
ENVIA_DATO_SPI_1DIG;Digito numero uno
         bsf       SSPCON,SSPEN
         bcf       PORTC,2
         movf      DATO_HIT,W
         movwf     SSPBUF
         bsf       STATUS,RP0
         bcf       STATUS,RP1
BUCLE_1DIG_H
         btfss     SSPSTAT,BF
         goto      BUCLE_1DIG_H
         bcf       STATUS,RP0
         movf      DATO_LOW,W
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_1DIG_L
         btfss     SSPSTAT,BF
         goto      BUCLE_1DIG_L
         bcf       STATUS,RP0
         movlw     0X07;Envia siete no_op
         movwf     CONTA_NO_OP_D1
N_NO_OP_D1
         movlw     0X00
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_NO_OP_H
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_H
         bcf       STATUS,RP0
         movlw     0X00
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_NO_OP_L
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_L
         bcf       STATUS,RP0
         decfsz    CONTA_NO_OP_D1
         goto      N_NO_OP_D1
         bsf       PORTC,2
         bcf       SSPCON,SSPEN
         return
ENVIA_DATO_SPI_2DIG;Digito numero dos
         bsf       SSPCON,SSPEN
         bcf       PORTC,2
         movlw     0X00;Envia un no_op
         movwf     SSPBUF
         bsf       STATUS,RP0
         bcf       STATUS,RP1
BUCLE_NO_OP_H2A
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_H2A
         bcf       STATUS,RP0
         movlw     0X00
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_NO_OP_L2A
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_L2A
         bcf       STATUS,RP0
         movf      DATO_HIT,W;Envia dato hit
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_2DIG_H
         btfss     SSPSTAT,BF
         goto      BUCLE_2DIG_H
         bcf       STATUS,RP0
         movf      DATO_LOW,W;Envia dato low
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_2DIG_L
         btfss     SSPSTAT,BF
         goto      BUCLE_2DIG_L
         bcf       STATUS,RP0
         movlw     0X06;Envia seis no_op
         movwf     CONTA_NO_OP_D2
N_NO_OP_D2
         movlw     0X00
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_NO_OP_H2B
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_H2B
         bcf       STATUS,RP0
         movlw     0X00
         movwf     SSPBUF
         bsf       STATUS,RP0
BUCLE_NO_OP_L2B
         btfss     SSPSTAT,BF
         goto      BUCLE_NO_OP_L2B
         bcf       STATUS,RP0
         decfsz    CONTA_NO_OP_D2
         goto      N_NO_OP_D2
         bsf       PORTC,2
         bcf       SSPCON,SSPEN
         return
ENVIA_DATO_SPI_3DIG;Digito numero tres
         bsf      SSPCON,SSPEN
         bcf      PORTC,2
         movlw    0X02;Envia dos no_op
         movwf    CONTA_NO_OP_D3
N_NO_OP_D3
         movlw    0X00
         movwf    SSPBUF
         bsf      STATUS,RP0
         bcf      STATUS,RP1

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #4 en: 01 de Noviembre de 2017, 05:26:58 »
2/3
Código: ASM
  1.  
Convertir;Convertimos el caracter en 8 Bytes y los colocamos en los registros Colun_1 al Colun_8
         
         movwf     Caracter
         movlw     0X30
         subwf     Caracter,F
         movf      Caracter,W
         return
Caracter_Al_Principio_Panel; Coloca los 8 Bytes del catacter justo a la derecha del panel
         movlw     0XE0
         movwf     FSR
         movf      Colun_1,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_2,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_3,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_4,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_5,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_6,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_7,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_8,W
         movwf     INDF
         return
Desplazar;Desplaza los Bytes de los caracteres de derecha a izquierda, 8 de una vez(un caracter)
         movlw     0X08
         movwf     Conta_1
Desplaza_1Posicion_A_Izquierda;Desplaza una colunna a la izquierda todo el panel,
         movlw     0XA0;Apunta a la primera colunna de la izquierda
         movwf     FSR
Otra_Vez
         movf      INDF,W
         decf      FSR,F
         movwf     INDF
         incf      FSR,F
         incf      FSR,F
         movlw     0XE9
         xorwf     FSR,W
         btfss     STATUS,Z
         goto      Otra_Vez
         decfsz    Conta_1,F
         goto      Desplaza_1Posicion_A_Izquierda
         return
Encender_Panel
         movlw     0X01
         movwf     Conta_Encendidos
Encender_Otra_Vez
         movlw     0X01;Primera colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movf      0XA0,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA8,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB0,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB8,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC0,W
         bcf       STATUS,RP0
         movwf     DATO_LOW 
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC8,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD0,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X01
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD8,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X02;Segunda colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA1,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA9,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB1,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB9,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC1,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC9,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD1,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X02
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD9,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X03;Tercera Colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA2,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAA,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB2,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBA,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC2,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCA,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD2,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X03
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDA,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X04;Cuarta colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA3,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAB,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB3,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBB,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC3,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCB,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD3,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X04
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDB,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X05;Quinta colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA4,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAC,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB4,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBC,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC4,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCC,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD4,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X05
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDC,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X06;Sexta colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA5,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAD,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB5,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBD,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC5,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCD,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD5,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X06
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDD,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X07;septima colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA6,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAE,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB6,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBE,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC6,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCE,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD6,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X07
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDE,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         movlw     0X08;Octava colunna
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XA7,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_1DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XAF,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_2DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XB7,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_3DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XBF,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_4DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XC7,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_5DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XCF,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_6DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XD7,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_7DIG
         movlw     0X08
         movwf     DATO_HIT
         bsf       STATUS,RP0
         movf      0XDF,W
         bcf       STATUS,RP0
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI_8DIG
         return
TEMPORIZA
         movlw     0X85;100 en decimal
         movwf     CONTA_PRUEBA
Temporiza_5mls
         movlw     0X4D;77 en decimal
         movwf     TMR1L
         movlw     0X9E;158 en decimal
         movwf     TMR1H
         bsf       T1CON,TMR1ON;Activa TMR1
Espera
         btfss     PIR1,TMR1IF
         goto      Espera
         bcf       PIR1,TMR1IF
         decfsz    CONTA_PRUEBA
         goto      Temporiza_5mls
         bcf       T1CON,TMR1ON;Desactiva TMR1
         return
INICIO
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco1
         movlw     0X10
         movwf     TRISC
         movlw     0X07
         movwf     ADCON1
         clrf      OPTION_REG
         bsf       ModoPulsador
         bsf       IncrementarPulsador
         bsf       OndaCuadrada_DS1307       
         bcf       STATUS,RP0
         bcf       STATUS,RP1;Banco0     
         bsf       PORTC,2
         call      MODO_SPI
         call      CONFIG_MAX7219
         clrf      FlagsAjuste
         pagesel   DS1307_Inicializa
         call      DS1307_Inicializa
         call      DS1307_Lee
         pagesel   INICIO
         btfss     Segundo,7
         goto      AntesConBateria
         pagesel   DS1307_CargaInicial
         call      DS1307_CargaInicial
         pagesel   INICIO
         movlw     0X90
         movwf     INTCON
         goto      Principal
AntesConBateria
         movlw     0X90
         movwf     INTCON
Principal
         pagesel   Muestra_Relog
         call      Muestra_Relog
         pagesel   Principal
         goto      Principal
ServicioInterrupcion
         movwf     Guarda_W
         swapf     STATUS,W
         movwf     Guarda_STATUS
         swapf     Auxiliar,W
         movwf     Guarda_Auxiliar
         btfss     INTCON,INTF
         goto      FinInterrupcion     
         pagesel   DS1307_Lee
         call      DS1307_Lee
         pagesel   ServicioInterrupcion
FinInterrupcion
         bcf       INTCON,INTF
         swapf     Guarda_Auxiliar,W
         movwf     Auxiliar
         swapf     Guarda_STATUS,W
         movwf     STATUS
         swapf     Guarda_W,F
         swapf     Guarda_W,W
         retfie
         ORG       0X0800

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #5 en: 01 de Noviembre de 2017, 05:31:17 »
3/4
Código: ASM
  1.  
Mensajes
         addwf     PCL,F
MensajeLunes
         DT"LUNES",0X00
MensajeMartes
         DT"MARTES",0X00
MensajeMiercoles
         DT"MIERCOLES",0X00
MensajeJueves
         DT"JUEVES",0X00
MensajeViernes
         DT"VIERNES",0X00
MensajeSabado
         DT"SABADO",0X00
MensajeDomingo
         DT"DOMINGO",0X00
;
MensajeEnero
         DT"ENERO",0X00
MensajeFebrero
         DT"FEBRERO",0X00
MensajeMarzo
         DT"MARZO",0X00
MensajeAbril
         DT"ABRIL",0X00
MensajeMayo
         DT"MAYO",0X00
MensajeJunio
         DT"JUNIO",0X00
MensajeJulio
         DT"JULIO",0X00
MensajeAgosto
         DT"AGOSTO",0X00
MensajeSeptiembre
         DT"SEPTIEMBRE",0X00
MensajeOctubre
         DT"OCTUBRE",0X00
MensajeNoviembre
         DT"NOVIEMBRE",0X00
MensajeDiciembre
         DT"DICIEMBRE",0X00
MensajeBlanco
         DT"        ",0X00
;
DiasSemana
         addwf      PCL,F
         nop
         retlw      MensajeLunes
         retlw      MensajeMartes
         retlw      MensajeMiercoles
         retlw      MensajeJueves
         retlw      MensajeViernes
         retlw      MensajeSabado
         retlw      MensajeDomingo
Meses
         addwf      PCL,F
         nop
         retlw      MensajeEnero
         retlw      MensajeFebrero
         retlw      MensajeMarzo
         retlw      MensajeAbril
         retlw      MensajeMayo
         retlw      MensajeJunio
         retlw      MensajeJulio
         retlw      MensajeAgosto
         retlw      MensajeSeptiembre
         nop
         nop
         nop
         nop
         nop
         nop
         retlw      MensajeOctubre
         retlw      MensajeNoviembre
         retlw      MensajeDiciembre
Muestra_Relog
HORAS
         movf      Hora,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   DecenasHoras
         call      DecenasHoras
         pagesel   Muestra_Relog
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   UnidadesHoras
         call      UnidadesHoras
DOS_PUNTOS_HORAS
         pagesel   DOS_PUNTOS_HORAS
         movlw     ":"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   DosPuntosHoras
         call      DosPuntosHoras
MINUTOS
         pagesel   MINUTOS
         movf      Minuto,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   DecenasMinutos
         call      DecenasMinutos
         pagesel   MINUTOS
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   UnidadesMinutos
         call      UnidadesMinutos
DOS_PUNTOS_MINUTOS
         pagesel   DOS_PUNTOS_MINUTOS
         movlw     ":"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   DosPuntosMinutos
         call      DosPuntosMinutos
SEGUNDOS
         pagesel   SEGUNDOS
         movf      Segundo,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   DecenasSegundos
         call      DecenasSegundos
         pagesel   SEGUNDOS
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   UnidadesSegundos
         call      UnidadesSegundos
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   SEGUNDOS
         movf      Segundo,F
         btfss     STATUS,Z
         goto      Fin_Muestra_Relog
MuestraFecha
         pagesel   EspacioEnBlanco
         call      EspacioEnBlanco
         pagesel   Dia_De_La_Semana
         call      Dia_De_La_Semana
         pagesel   EspacioEnBlanco
         call      EspacioEnBlanco
         pagesel   Dia_Del_Mes
         call      Dia_Del_Mes
         pagesel   EspacioEnBlanco
         call      EspacioEnBlanco
         pagesel   NombreMes
         call      NombreMes
         pagesel   EspacioEnBlanco
         call      EspacioEnBlanco
         pagesel   NumeroAnho
         call      NumeroAnho
         pagesel   EspacioEnBlanco
         call      EspacioEnBlanco
         pagesel   NumeroHora
         call      NumeroHora
         pagesel   Dos_Puntos
         call      Dos_Puntos
         pagesel   NumeroMinuto
         call      NumeroMinuto
         pagesel   Dos_Puntos
         call      Dos_Puntos
         pagesel   NumeroSegundo
         call      NumeroSegundo
         pagesel   MuestraFecha
Fin_Muestra_Relog
         return     
DecenasHoras
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco 1
         movwf     0XA0
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XA1
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XA2
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XA3
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XA4
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XA5
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XA6
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XA7
         bcf       STATUS,RP0
         return
UnidadesHoras
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XA8
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XA9
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XAA
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XAB
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XAC
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XAD
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XAE
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XAF
         bcf       STATUS,RP0
         return
DosPuntosHoras
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XB0
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XB1
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XB2
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XB3
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XB4
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XB5
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XB6
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XB7
         bcf       STATUS,RP0
         return
DecenasMinutos
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XB8
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XB9
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XBA
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XBB
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XBC
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XBD
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XBE
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XBF
         bcf       STATUS,RP0
         return
UnidadesMinutos
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XC0
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XC1
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XC2
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XC3
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XC4
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XC5
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XC6
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XC7
         bcf       STATUS,RP0
         return
DosPuntosMinutos
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XC8
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XC9
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XCA
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XCB
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XCC
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XCD
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XCE
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XCF
         bcf       STATUS,RP0
         return
DecenasSegundos
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XD0
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XD1
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XD2
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XD3
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XD4
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XD5
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XD6
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XD7
         bcf       STATUS,RP0
         return
UnidadesSegundos
         movf      Colun_1,W
         bsf       STATUS,RP0
         bcf       STATUS,RP1
         movwf     0XD8
         bcf       STATUS,RP0
         movf      Colun_2,W
         bsf       STATUS,RP0
         movwf     0XD9
         bcf       STATUS,RP0
         movf      Colun_3,W
         bsf       STATUS,RP0
         movwf     0XDA
         bcf       STATUS,RP0
         movf      Colun_4,W
         bsf       STATUS,RP0
         movwf     0XDB
         bcf       STATUS,RP0
         movf      Colun_5,W
         bsf       STATUS,RP0
         movwf     0XDC
         bcf       STATUS,RP0
         movf      Colun_6,W
         bsf       STATUS,RP0
         movwf     0XDD
         bcf       STATUS,RP0
         movf      Colun_7,W
         bsf       STATUS,RP0
         movwf     0XDE
         bcf       STATUS,RP0
         movf      Colun_8,W
         bsf       STATUS,RP0
         movwf     0XDF
         bcf       STATUS,RP0
         return       
Dia_De_La_Semana
         movf      DiaSemana,W
         sublw     0X07
         btfsc     STATUS,C
         goto      Llamada_a_DiasSemana
         movlw     0X01
         movwf     DiaSemana
Llamada_a_DiasSemana
         movf      DiaSemana,W
         call      DiasSemana       
VisualizaMensaje
         movwf     ApuntaCaracter
         movlw     Mensajes
         subwf     ApuntaCaracter,F
         decf      ApuntaCaracter,F
VisualizaOtroCaracter
         movf      ApuntaCaracter,W
         call      Mensajes
         movwf     ValorCaracter
         movf      ValorCaracter,F
         btfsc     STATUS,Z
         goto      FinMensaje
NoUltimoCaracter 
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NoUltimoCaracter
         incf      ApuntaCaracter,F
         goto      VisualizaOtroCaracter
FinMensaje
         return
EspacioEnBlanco
         movlw     "@"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel         
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   EspacioEnBlanco
         return
Dia_Del_Mes
         movf      Dia,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   Dia_Del_Mes
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   Dia_Del_Mes
         return
NombreMes
         movf      Mes,W
         sublw     0X12
         btfsc     STATUS,C
         goto      Llamada_a_Meses
         movlw     0X01
         movwf     Mes
Llamada_a_Meses
         movf      Mes,W
         call      Meses
         call      VisualizaMensaje
         return
NumeroAnho
         movlw     "2"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroAnho
         movlw     "0"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroAnho   
         movf      Anho,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroAnho
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroAnho
         return
NumeroHora
         movf      Hora,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroHora
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel   
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroHora
         return
Dos_Puntos
         movlw     ":"
         pagesel   Convertir
         call      Convertir
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   Dos_Puntos
         return
NumeroMinuto
         movf      Minuto,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroMinuto
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroMinuto
         return
NumeroSegundo
         movf      Segundo,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroSegundo
         movf      Auxiliar,W
         andlw     0X0F
         pagesel   TABLA_CARACTERES
         call      TABLA_CARACTERES
         pagesel   Caracter_Al_Principio_Panel
         call      Caracter_Al_Principio_Panel
         pagesel   Desplazar
         call      Desplazar
         pagesel   Encender_Panel
         call      Encender_Panel
         pagesel   TEMPORIZA
         call      TEMPORIZA
         pagesel   NumeroSegundo     
         return           
PuestaEnHora
         return
Incrementar
         return
         
     
         
         
AjusteBCD
         movwf     Auxiliar
         andlw     0X0F
         sublw     0X09
         btfsc     STATUS,C
         goto      NoSuperaNueve
         movlw     0X06
         addwf     Auxiliar,F
NoSuperaNueve
         movf      Auxiliar,W
         return
         

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #6 en: 01 de Noviembre de 2017, 05:33:02 »
4/4
Código: ASM
  1.  
       
;SUBRUTINAS PARA MANEJO DEL BUS I2C
; Subrutina "SDA_Bajo" -------------------------------------------------------------------------------
;
SDA_Bajo
   bsf   STATUS,RP0      ; Configura la línea SDA como salida.
   bcf   SDA
   bcf   STATUS,RP0
   bcf   SDA         ; SDA en bajo.
   return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
   bsf   STATUS,RP0      ; Configura la línea SDA entrada.
   bsf   SDA         ; Lo pone en alta impedancia y, gracias a la
   bcf   STATUS,RP0      ; Rp de esta línea, se mantiene a nivel alto.
   return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
   bsf   STATUS,RP0
   bcf   SCL         ; Configura la línea SCL como salida.
   bcf   STATUS,RP0
   bcf   SCL         ; La línea de reloj SCL en bajo.
   return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
   bsf   STATUS,RP0      ; Configura la línea SCL entrada.
   bsf   SCL         ; Lo pone en alta impedancia y, gracias a la Rp
   bcf   STATUS,RP0      ; de esta línea, se mantiene a nivel alto.
SCL_EsperaNivelAlto
   btfss   SCL         ; Si algún esclavo mantiene esta línea en bajo
   goto   SCL_EsperaNivelAlto   ; hay que esperar.
   return
;
; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
;
; Esta subrutina envía una condición de Start o inicio.
;
I2C_EnviaStart
   call   SDA_AltaImpedancia   ; Línea SDA en alto.
   call   SCL_AltaImpedancia   ; Línea SCL en alto.
   call   Retardo_5micros      ; Tiempo tBUF del protocolo.
   call   SDA_Bajo      ; Flanco de bajada de SDA mientras SCL está alto.
   call   Retardo_4micros      ; Tiempo tHD;STA del protocolo.
   call   SCL_Bajo      ; Flanco de bajada del reloj SCL.
   call   Retardo_5micros   
   return
;
; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
;
; Esta subrutina envía un condición de Stop o parada.
;
I2C_EnviaStop
   call   SDA_Bajo
   call   SCL_AltaImpedancia   ; Flanco de subida de SCL.
   call   Retardo_5micros      ; Tiempo tSU;STO del protocolo.
   call   SDA_AltaImpedancia   ; Flanco de subida de SDA.
   call   Retardo_5micros      ; Tiempo tBUF del protocolo.
   return
;
; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
;
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte,
; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
;
I2C_EnviaByte
   movwf   I2C_Dato         ; Almacena el byte a transmitir.
   movlw   0x08         ; A transmitir 8 bits.
   movwf   I2C_ContadorBits
I2C_EnviaBit
   rlf       I2C_Dato,F      ; Chequea el bit, llevándolo previamente al Carry.
   btfsc   STATUS,C
   goto   I2C_EnviaUno
I2C_EnviaCero
   call   SDA_Bajo      ; Si es "0" envía un nivel bajo.
   goto   I2C_FlancoSCL
I2C_EnviaUno
   call   SDA_AltaImpedancia   ; Si es "1" lo activará a alto.
I2C_FlancoSCL
   call   SCL_AltaImpedancia   ; Flanco de subida del SCL.
   call   Retardo_4micros      ; Tiempo tHIGH del protocolo.
   call   SCL_Bajo      ; Termina el semiperiodo positivo del reloj.
   call   Retardo_5micros      ; Tiempo tHD;DAT del protocolo.
   decfsz   I2C_ContadorBits,F      ; Lazo para los ocho bits.
   goto   I2C_EnviaBit
   call   SDA_AltaImpedancia   ; Libera la línea de datos.
   call   SCL_AltaImpedancia   ; Pulso en alto de reloj para que el esclavo
   call   Retardo_5micros      ; pueda enviar el bit ACK.
   call   SCL_Bajo
   call   Retardo_5micros
   return
;
; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
; del registro W. Se empieza a leer por el bit de mayor peso MSB.
; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.

I2C_LeeByte
   movlw   0x08         ; A recibir 8 bits.
   movwf   I2C_ContadorBits
   call   SDA_AltaImpedancia   ; Deja libre la línea de datos.
I2C_LeeBit
   call   SCL_AltaImpedancia   ; Flanco de subida del reloj.
   bcf    STATUS,C      ; En principio supone que es "0".
   btfsc   SDA         ; Lee el bit
   bsf    STATUS,C      ; Si es "1" carga 1 en el Carry.
   rlf    I2C_Dato,F      ; Lo introduce en el registro.
   call   SCL_Bajo      ; Termina el semiperiodo positivo del reloj.
   call   Retardo_5micros      ; Tiempo tHD;DAT del protocolo.
   decfsz   I2C_ContadorBits,F      ; Lazo para los 8 bits.
   goto   I2C_LeeBit; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento ACK en consecuencia.
   btfss    I2C_UltimoByteLeer   ; Si es el último, no debe enviar el bit de reconocimiento ACK.
   call   SDA_Bajo      ; Envía el bit de reconocimiento ACK porque todavía no es el último byte a leer.
   call   SCL_AltaImpedancia   ; Pulso en alto del SCL para transmitir el
   call   Retardo_4micros      ; bit ACK de reconocimiento. Este es tHIGH.
   call   SCL_Bajo      ; Pulso de bajada del SCL.
   call   Retardo_5micros
   movf   I2C_Dato,W      ; El resultado se manda en el registro de
   return            ; de trabajo W.
   

;SUBRUTINAS DE RETARDOS PARA CUARZO DE 20 MHZ QUE SON 5 MHZ/S. 0,2us POR CICLO MAQUINA
;RETARDOS DE 1,4,5,10,20,50 Y 100 us
Retardo_100micros;RETARDO DE 100 MICROS
    nop
    movlw    0XA4;164 en decimal
    goto     RetardoMicros
Retardo_50micros;RETARDO DE 50 MICROS
    movlw    0X51;81 en decimal
    goto     RetardoMicros
Retardo_20micros;RETARDO DE 20 MICROS
    movlw    0X1F;31en decimal
    goto     RetardoMicros
Retardo_10micros;RETARDO DE 10 MICROS
    nop
    movlw    0X0E
    goto     RetardoMicros
Retardo_5micros;RETARDO DE 5 MICROS
    nop
    nop
    nop
    movlw    0X05
    goto     RetardoMicros
Retardo_4micros;RETARDO DE 4 MICROS
    movlw    0X05     
RetardoMicros
    movwf     R_ContA
Rmicros_Bucle
    decfsz    R_ContA,F
    goto      Rmicros_Bucle
    return
Retardo_1micro;RETARDO DE 1 MICRO
    nop
    return
;RETARDOS DE 500 micros y 1,2,5 y 10  milisegundos
Retardo_500micros
    movlw     0X05
    goto      Retardos_ms
Retardo_1ms
    movlw     0X0B
    goto      Retardos_ms
Retardo_2ms
    movlw     0X17
    goto      Retardos_ms
Retardo_5ms
    movlw     0X3B
    goto      Retardos_ms
Retardo_10ms
    movlw     0X77
    goto      Retardos_ms
Retardos_ms
    movwf     R_ContB
Bucle_ext
    movlw     0X68
    movwf     R_ContA
Bucle_int
    decfsz    R_ContA,F
    goto      Bucle_int
    decfsz    R_ContB,F
    goto      Bucle_ext
    return
; Estas subrutinas permiten realizar las tareas de manejo del reloj-calendario DS1307
; Este dispositivo transmite la información vía serie a través de un bus I2C.
; Subrutina "DS1307_Inicializa" ---------------------------------------------------------
; Configura la señal cuadrada que genera el DS1307 en su pin SQW/OUT a 1 Hz.

DS1307_Inicializa
   call   I2C_EnviaStart      ; Envía condición de Start.
   movlw   DS1307_DireccionEscritura   ; Indica al DS1307 que el byte a escribir,
   call   I2C_EnviaByte      ; está en la posición 07h, que corresponde
   movlw   0x07         ; al control de la señal cuadrada.
   call   I2C_EnviaByte
   movlw   b'00010000'      ; Escribe en el registro de control para
   call   I2C_EnviaByte      ; configurar onda cuadrada del DS1307 a 1 Hz.
   call   I2C_EnviaStop      ; Termina de enviar datos.
   return

; Subrutina "DS1307_Lee" ----------------------------------------------------------------
;
; Se leen las variables de tiempo del DS1307 y se guardan en los registros correspondientes.
DS1307_Lee
   bcf       I2C_UltimoByteLeer
   call   I2C_EnviaStart      ; Envía condición de Start.
   movlw   DS1307_DireccionEscritura   ; Indica al DS1307 que el primer byte
   call   I2C_EnviaByte      ; a leer está en la posición 00H, que corresponde
   movlw   0x00         ; a los segundos.
   call   I2C_EnviaByte
   call   I2C_EnviaStop      ; Envía condición de Stop. Ahora va a leer el DS1307.
   call   I2C_EnviaStart      ; Envía condición de Start.
   movlw   DS1307_DireccionLectura
   call   I2C_EnviaByte
   call   I2C_LeeByte      ; Lee los segundos.
   movwf   Segundo         ; Lo carga en el registro correspondiente.
   call   I2C_LeeByte      ; Lee el resto de los registros utilizando
   movwf   Minuto         ; el mismo procedimiento.
   call   I2C_LeeByte
   movwf   Hora
   call   I2C_LeeByte
   movwf   DiaSemana
   call   I2C_LeeByte
   movwf   Dia
   call   I2C_LeeByte
   movwf   Mes
   bsf       I2C_UltimoByteLeer   ; Para terminar.
   call   I2C_LeeByte
   movwf   Anho
   call   I2C_EnviaStop      ; Acaba de leer.
   return

; Subrutina "DS1307_CargaInicial" -------------------------------------------------------
;
; Realiza una carga inicial en los registros internos del reloj-calendario DS1307 a fecha
; Lunes, 1 de Enero de 2004 a las 0:00:00.
;
DS1307_CargaInicial
   movlw   0X0F; Inicializa todos los datos del reloj: Año, mes,
   movwf   Dia
   movlw   0X0A         ; día, día de la semana, hora, minuto y segundo.
   movwf   Mes
   movlw   0X07
   movwf   DiaSemana
   movlw   0X17   
   movwf   Anho         ; Inicializa en el año 2004.
   clrf   Hora
   clrf   Minuto
   clrf   Segundo         ; Después lo graba en el DS1307 para
   call   DS1307_Escribe      ; ponerlo en marcha.
   return
;
; Subrutina "DS1307_Escribe" ----------------------------------------------------------------
;
; Carga los datos de los registros Anho, Mes, etc., dentro del DS1307.

DS1307_Escribe
   call   I2C_EnviaStart      ; Envía condición de Start.
   movlw   DS1307_DireccionEscritura   ; Indica al DS1307 que el primer byte a escribir
   call   I2C_EnviaByte      ; está en la posición 00h que corresponde
   movlw   0x00         ; a los segundos.
   call   I2C_EnviaByte
   movf   Segundo,W      ; Pasa los segundos de la memoria del PIC16F84A al
   call   I2C_EnviaByte      ; DS1307.
   movf   Minuto,W      ; Y se repite el proceso para el resto.
   call   I2C_EnviaByte
   movf   Hora,W
   call   I2C_EnviaByte
   movf   DiaSemana,W
   call   I2C_EnviaByte
   movf   Dia,W
   call   I2C_EnviaByte
   movf   Mes,W
   call   I2C_EnviaByte
   movf   Anho,W
   call   I2C_EnviaByte
   call   I2C_EnviaStop      ; Termina de enviar datos.
   return

;**************************** Librería "BUS_1LIN.INC" *********************************
; Estas subrutinas permiten realizar las tareas básicas de control del bus de una sola línea
; según el protocolo del fabricante de semiconductores Dallas Semiconductors.
; Subrutina "Bus1Linea_AltaImpedancia" --------------------------------------------------
;
; Configura la línea única de 1-Wire Bus como entrada. Lo pone en alta impedancia.

Bus1Linea_AltaImpedancia
   bsf   STATUS,RP0
   bsf   Bus1Linea      ; La línea como entrada, por tanto, en alta
   bcf   STATUS,RP0      ; impedancia.
   return

; Subrutina "Bus1Linea_Bajo" ------------------------------------------------------------
;
; Mantiene el pin de datos del Bus de 1 línea en bajo.
 
Bus1Linea_Bajo
   bsf   STATUS,RP0
   bcf   Bus1Linea      ; La línea como salida.
   bcf   STATUS,RP0
   bcf   Bus1Linea      ; Pasa a bajo.
   return

; Subrutina "Bus1Linea_Reset" -----------------------------------------------------------
;
; Envía un impulso de Reset al dispositivo conectado en el bus de 1 línea y después
; espera recibir un impulso de Presence". Esto consiste en:
; 1º.   El PIC manda un impulso en bajo durante unos 500 µs. (El protocolo permite entre 480
;   y 960 µs).
; 2º.    El PIC pasa a modo entrada, espera 20 µs. (El protocolo fija entre 15 y 60 µs).
; 3º.    El PIC lee la línea de entrada y si es bajo está correcto (pulso de "Presence").
;   Se interpreta como que el procedimiento está correctamente inicializado.

Bus1Linea_Reset
   call   Bus1Linea_AltaImpedancia   ; Empieza en alto para conseguir el flanco de
               ; bajada con la siguiente instrucción.
   call   Bus1Linea_Bajo      ; El bus de 1 línea en bajo durante 500 µs.
   call   Retardo_500micros
   call   Bus1Linea_AltaImpedancia   ; Permanece en alta impedancia (nivel alto por
   call   Retardo_20micros      ; las resistencias de Pull-Up) durante unos µs.
Bus1Linea_EsperaLeerBajo
   btfsc   Bus1Linea      ; Espera a que el dispositivo le envíe el pulso
   goto   Bus1Linea_EsperaLeerBajo   ; en bajo de "Presence".
Bus1Linea_EsperaLeerAlto
   btfss   Bus1Linea      ; Y ahora el dispositivo lo debe poner en alto.
   goto   Bus1Linea_EsperaLeerAlto
   return

; Subrutina "Bus1Linea_EscribeByte" -----------------------------------------------------
;
; El maestro escribe un byte al esclavo conectado al bus de 1 línea comenzando por el bit LSB.
; Consiste en enviar 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º   El PIC manda un impulso en bajo durante unos microsegundos. (El protocolo fija un
;   mínimo de 1 µs y sin exceder con lo que viene a continuación de 60 µs) A continuación:
;   - Si va a enviar un "0" permanece en bajo durante 50 µs.
;   - Si va a escribir un "1" se pone en alta impedancia durante 50 µs. (El protocolo
;     permite unos valores entre 15 y 60 µs para ambos casos).
; 2º    Para escribir otro bit se pone en alta impedancia durante unos µs. (El protocolo
;   establece un mínimo de 1 µs).
;
; Entrada:   En (W) el dato a enviar.

Bus1Linea_EscribeByte
   movwf   Bus1Linea_Dato      ; Guarda el byte a transmitir.
   movlw   0x08         ; 8 bits a transmitir.
   movwf   Bus1Linea_ContadorBits
   call   Bus1Linea_AltaImpedancia   ; Empieza en alta impedancia.
Bus1Linea_EnviaBit
   call   Bus1Linea_Bajo      ; Flanco de bajada.
;
; Pregunta por el valor del bit a transmitir.
;
   rrf   Bus1Linea_Dato,F      ; Lleva el bit de menor peso LSB al Carry.
   btfss   STATUS,C      ; ¿Es un "1" el bit a transmitir?.
   goto   Bus1Linea_EnviaCero   ; No, pues envía un "0".   
Bus1Linea_EnviaUno
   call   Bus1Linea_AltaImpedancia   ; Transmite un "1".
   goto   Bus1Linea_Espera50us
Bus1Linea_EnviaCero
   call   Bus1Linea_Bajo      ; Transmite un "0".
Bus1Linea_Espera50us
   call   Retardo_50micros
   call   Bus1Linea_AltaImpedancia   ; Flanco de subida.
   decfsz   Bus1Linea_ContadorBits,1   ; Comprueba que es el último bit.
   goto   Bus1Linea_EnviaBit   ; Como no es el último bit repite la operación.
   return
;
; Subrutina "Bus1Linea_LeeByte" ---------------------------------------------------------
;
; El microcontrolador maestro lee un byte del dispositivo esclavo conectado al bus de
; 1 línea. Consiste en leer 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º   El PIC manda un pulso en bajo durante unos µs. (El protocolo fija un mínimo de 1 µs).
; 2º    El PIC se pone en entrada (alta impedancia) durante otros 10 µs (con un total de 15 µs
;   desde el flanco de bajada) para proceder a la lectura de la línea.
; 3º   El PIC espera 50 µs para realizar la siguiente lectura (total unos 65 µs desde el
;   flanco de bajada). El protocolo fija que las lecturas se harán cada 60 µs ó más.
;
; Salida:   En (W) el dato leído.

Bus1Linea_LeeByte
   movlw   0x08         ; 8 bits a recibir.
   movwf   Bus1Linea_ContadorBits
   call   Bus1Linea_AltaImpedancia   ; Empieza en alta impedancia.
Bus1Linea_LeeBit
   call   Bus1Linea_Bajo      ; Flanco de bajada.
   call   Bus1Linea_AltaImpedancia
   call   Retardo_10micros      ; Añadiendo las instrucciones anteriores, supone
               ; un total de 15 µs desde el flanco de bajada.
   bcf    STATUS,C      ; Ahora lee el pin. En principio supone que es 0.
   btfsc   Bus1Linea      ; ¿Realmente es cero?.
   bsf       STATUS,C      ; No, pues cambia a uno.
   rrf    Bus1Linea_Dato,1      ; Introduce el bit en el registro.
   call   Retardo_50micros      ; Espera.
   call   Bus1Linea_AltaImpedancia   ; Flanco de subida del pulso positivo.
   decfsz    Bus1Linea_ContadorBits,1   ; Comprueba que es el último bit.
   goto   Bus1Linea_LeeBit      ; Si no es el último bit pasa a leer el siguiente.
   movf   Bus1Linea_Dato,W      ; El resultado en el registro W.
   return
   
;**************************** Librería "DS1820.INC" ***********************************
; Estas subrutinas permiten realizar las tareas de manejo del sensor de temperatura DS1820.
; Este sensor transmite la información vía serie a través de un 1-Wire Bus.
; Subrutina "DS1820_Inicializa" ---------------------------------------------------------
;
; Inicializa el DS1820 para que comience la conversión de temperatura.
;
DS1820_Inicializa
   call   Bus1Linea_Reset      ; Primero los pulsos de Reset y Presence.
   movlw   DS1820_Skip_ROM_Command ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte   ; conectado un único dispositivo al bus.
   movlw   DS1820_Convert_T_Command ; Para que comience la conversión de temperatura.
   call   Bus1Linea_EscribeByte
   return

; Subrutina "DS1820_LeeTemperatura" -----------------------------------------------------
;
; El DS1820 lee la temperatura en un formato ejemplarizado como sigue:
;
; +125,0 ºC   00000000 11111010
; + 25,5 ºC   00000000 00110011
; + 25,0 ºC   00000000 00110010
; +  0,5 ºC   00000000 00000001
; +  0,0 ºC   00000000 00000000
; -  0,5 ºC   11111111 11111111
; - 25,0 ºC   11111111 11001110
; - 55,0 ºC   11111111 10010010
;
; Se observa que:
;     -   El formato es de dos bytes. El primer byte es el de signo.
;     -   Las temperaturas positivas comienzan con 1 byte todo a cero: "00000000 xxxxxxxx".
;     -   Las temperaturas negativas comienzan con 1 byte todo a uno : "11111111 xxxxxxxx".
;     -   Las temperaturas "xx.0 ºC" terminan en cero: "xxxxxxx0".
;     -   Las temperaturas "xx.5 ºC" terminan en uno : "xxxxxxx1".
;     -   El valor de la temperatura está contenido en los 7 bits de mayor peso del byte bajo.
;   Por ejemplo: +25ºC = xxxxxxxx 0011001x = 25 en decimal. Por tanto, para obtener el
;   valor de la temperatura habrá que desplazar un lugar hacia la derecha los bits del
;   byte bajo.
;     -   Las temperaturas negativas vienen dadas en complemento a 2. Por tanto para obtener
;   su valor absoluto habrá que negarlas.
;
; Esta subrutina lee la temperatura proporcionando tres datos:
;
; Salida:   - En el registro DS1820_Temperatura, el valor de la temperatura en valor absoluto.
;   - En el registro DS1820_TemperaturaDecimal, la parte decimal del valor de la temperatura.
;   - En (DS1820_TemperaturaSigno)=b'11111111' si la temperatura es negativa y
;     (DS1820_TemperaturaSigno)=b'00000000' si es positiva.
;
DS1820_LeeTemperatura
   call   Bus1Linea_Reset      ; Primero los pulsos de "Reset" y "Presence".
   movlw   DS1820_Skip_ROM_Command ; Salta los comandos de ROM ya que hay
   call   Bus1Linea_EscribeByte   ; conectado un único dispositivo al bus.
   movlw   DS1820_Read_Scratchpad_Command ; Va a leer la primera posición de memoria,
   call   Bus1Linea_EscribeByte   ; donde se localiza el valor de la temperatura.
   call   Bus1Linea_LeeByte      ; Lee la temperatura en
   movwf   DS1820_Temperatura   ; complemento a 2.
   call   Bus1Linea_LeeByte      ; Ahora lee el segundo byte que indica el signo
   movwf   DS1820_TemperaturaSigno   ; de la temperatura.
   call   Bus1Linea_Reset      ; Y para terminar, resetea el dispositivo.
;
; Ahora deduce si la temperatura es positiva o negativa y halla su valor absoluto.
;
   btfss   DS1820_TemperaturaSigno,7   ; Si cualquier bit es "1": temperatura negativa.
   goto   DS1820_FinLeeTemperatura   ; La temperatura es positiva y salta.
DS1820_TemperaturaNegativa
   movf   DS1820_Temperatura,W   ; La niega para convertirla a su valor
   sublw   0x00         ; absoluto. Para ello, simplemente le resta de
   movwf   DS1820_Temperatura   ; cero.
DS1820_FinLeeTemperatura
   bcf    STATUS,C      ; Para no corromper luego el MSB.
   rrf    DS1820_Temperatura,F   ; Obtiene el valor absoluto de la temperatura.
   movlw   .5
   btfss   STATUS,C      ; Si el bit LSB es "1", la temperatura
   clrw            ; medida es "xx.5ºC" sino "xx.0ºC".
   movwf   DS1820_TemperaturaDecimal
   movf   DS1820_Temperatura,W   ; En (W) la parte entera del valor absoluto de la
   return            ; temperatura.
   
     END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #7 en: 01 de Noviembre de 2017, 08:46:08 »
Gracias por responder KILLERJC.Soy nuevo en esto de la programacion solo e echo pequeños programas para el 16F84 y quiero ver si puedo completar este proyecto a ver si con vuestra ayuda soy capaz.
El programa no lo pude enviar completo porque en pdf me ocupa mas de 300 kb.ysolo se puede enviar 200.El I2C lo tengo por software porque el modulo MSSP lo tengo ocupado con la comunicacion SPI para controlar el panel de 8 matrix de led de 8x8.Si tu crees que con el FSR se puede hacer mucho mas facil,por fabor explicamelo toda la ayuda es bien recibida gracias de antemano.
A ver si puedo enviarlo completo ,saludos.

Como ando falto de tiempo voy a ir escribiendo apenas tengo un tiempo. Asi que no esperes una respuesta ya completa. Pero que te va a ayudar.
El otro consejo es que busques siempre primero un micro que cumpla tus requerimientos, por ejemplo un micro con 2 MSSP hubiera sido lo mejor, y tambien tener 2 FSR, obviamente esto es lo mejor, se hace con lo que se tiene/puede, pero si tu proyecto es nuevo por ahi conviene gastar un poco mas y solucionarte la vida en el programa.

Como te decia antes, si el codigo se repite, significa que de alguna forma se puede modificar. Veamos este codigo:

Código: ASM
  1. UnidadesHoras
  2.          movf      Colun_1,W
  3.          bsf       STATUS,RP0
  4.          bcf       STATUS,RP1
  5.          movwf     0XA8
  6.          bcf       STATUS,RP0
  7.          movf      Colun_2,W
  8.          bsf       STATUS,RP0
  9.          movwf     0XA9
  10.          bcf       STATUS,RP0
  11.          movf      Colun_3,W
  12.          bsf       STATUS,RP0
  13.          movwf     0XAA
  14.          bcf       STATUS,RP0
  15.          movf      Colun_4,W
  16.          bsf       STATUS,RP0
  17.          movwf     0XAB
  18.          bcf       STATUS,RP0
  19.          movf      Colun_5,W
  20.          bsf       STATUS,RP0
  21.          movwf     0XAC
  22.          bcf       STATUS,RP0
  23.          movf      Colun_6,W
  24.          bsf       STATUS,RP0
  25.          movwf     0XAD
  26.          bcf       STATUS,RP0
  27.          movf      Colun_7,W
  28.          bsf       STATUS,RP0
  29.          movwf     0XAE
  30.          bcf       STATUS,RP0
  31.          movf      Colun_8,W
  32.          bsf       STATUS,RP0
  33.          movwf     0XAF
  34.          bcf       STATUS,RP0
  35.          return
  36. DosPuntosHoras
  37.          movf      Colun_1,W
  38.          bsf       STATUS,RP0
  39.          bcf       STATUS,RP1
  40.          movwf     0XB0
  41.          bcf       STATUS,RP0
  42.          movf      Colun_2,W
  43.          bsf       STATUS,RP0
  44.          movwf     0XB1
  45.          bcf       STATUS,RP0
  46.          movf      Colun_3,W
  47.          bsf       STATUS,RP0
  48.          movwf     0XB2
  49.          bcf       STATUS,RP0
  50.          movf      Colun_4,W
  51.          bsf       STATUS,RP0
  52.          movwf     0XB3
  53.          bcf       STATUS,RP0
  54.          movf      Colun_5,W
  55.          bsf       STATUS,RP0
  56.          movwf     0XB4
  57.          bcf       STATUS,RP0
  58.          movf      Colun_6,W
  59.          bsf       STATUS,RP0
  60.          movwf     0XB5
  61.          bcf       STATUS,RP0
  62.          movf      Colun_7,W
  63.          bsf       STATUS,RP0
  64.          movwf     0XB6
  65.          bcf       STATUS,RP0
  66.          movf      Colun_8,W
  67.          bsf       STATUS,RP0
  68.          movwf     0XB7
  69.          bcf       STATUS,RP0
  70.          return

Si observas el codigo es lo mismo, la unica diferencia es a donde van a parar los datos. Y encima son todos seguidos lo cual lo hace mas facil. El FSR es un registro indirecto, vos cargas la direccion y luego en el registro INDF tenes acceso al mismo, es decir si yo cargo 0xB0 en FSR, cuando opere en INDF es lo mismo que operar sobre 0xB0,  y lo otro genial de este acceso es que tiene su propios bits de banco ( y que es 1 solo ) que solo pasas a tener banco 0 y 1 o 2 y 3 (bit IRP de STATUS).
Entonces el codigo anterior lo podemos resumir:

Código: ASM
  1. TraerDeColumnas:
  2.          movf      Colun_1,W
  3.          movwf   INDF                 ; Direccion inicial dada + 0
  4.          INCF      FSR, F                 ; Direccion inicial dada + 1
  5.          movf      Colun_2,W
  6.          movwf   INDF
  7.          INCF      FSR, F                 ; Direccion inicial dada + 2
  8.          movf      Colun_3,W
  9.          movwf   INDF
  10.          INCF      FSR, F                 ; Direccion inicial dada +3
  11.          movf      Colun_4,W
  12.          movwf   INDF
  13.          INCF      FSR, F                 ; Direccion inicial dada + 4
  14.          movf      Colun_5,W
  15.          movwf   INDF
  16.          INCF      FSR, F                 ; Direccion inicial dada + 5
  17.          movf      Colun_6,W
  18.          movwf   INDF
  19.          INCF      FSR, F                 ; Direccion inicial dada + 6
  20.          movf      Colun_7,W
  21.          movwf   INDF
  22.          INCF      FSR, F                 ; Direccion inicial dada + 7
  23.          movf      Colun_8,W
  24.          movwf   INDF
  25.          return

Y por supuesto ahora para llamarlo lo hacemos mas simple:

Código: ASM
  1. DecenasHoras:
  2.          MOVLW 0xA0
  3.          MOVWF FSR
  4.          BCF       STATUS,IRP       ;Me aseguro de que este en los bancos 0 y 1
  5.          CALL TraerDeColumnas
  6.          RETURN
  7. UnidadesHoras:
  8.          MOVLW 0xA8
  9.          MOVWF FSR
  10.          bcf       STATUS,IRP      
  11.          CALL TraerDeColumnas
  12.          RETURN
  13. DosPuntosHoras:
  14.          MOVLW 0xB0
  15.          MOVWF FSR
  16.          bcf       STATUS,IRP      
  17.          CALL TraerDeColumnas
  18.          RETURN
  19. DecenasMinutos:
  20.          MOVLW 0xB8
  21.          MOVWF FSR
  22.          bcf       STATUS,IRP      
  23.          CALL TraerDeColumnas
  24.          RETURN
  25. UnidadesMinutos:
  26.          MOVLW 0xC0
  27.          MOVWF FSR
  28.          bcf       STATUS,IRP      
  29.          CALL TraerDeColumnas
  30.          RETURN
  31.  
  32. ;Aca sigue lo mismo con los demas

Esto hubiera sido MUCHO mas facil con 2 FSR, ya que las Columnas tambien las tomaria un con FSR y lo guardaria con otro FSR... Tambien si te das cuenta, ahi ya tengo 5 casos, y el codigo que copie eran solo 2 casos, ocupando casi el mismo lugar.
Hasta ahora es medio inentendible, pero uno puede mejorarlo para la lectura si define los valores base con un nombre:


Código: ASM
  1. DECENASHORAS_BASE  EQU  0xA0
  2. UNIDADESHORAS_BASE EQU  0xA8
  3. DOSPUNTOSHORAS_BASE  EQU  0xB0

Asi luego lo usas asi:

Código: ASM
  1. DecenasHoras:
  2.          MOVLW DECENASHORAS_BASE
  3.          MOVWF FSR
  4.          BCF       STATUS,IRP       ;Me aseguro de que este en los bancos 0 y 1
  5.          CALL TraerDeColumnas
  6.          RETURN
  7. UnidadesHoras:
  8.          MOVLW UNIDADESHORAS_BASE
  9.          MOVWF FSR
  10.          bcf       STATUS,IRP      
  11.          CALL TraerDeColumnas
  12.          RETURN
  13. DosPuntosHoras:
  14.          MOVLW DOSPUNTOSHORAS_BASE
  15.          MOVWF FSR
  16.          bcf       STATUS,IRP      
  17.          CALL TraerDeColumnas
  18.          RETURN
« Última modificación: 01 de Noviembre de 2017, 08:52:34 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #8 en: 01 de Noviembre de 2017, 08:50:08 »
Otra cosa que deberias hacer tambien es resumir todas las letras y numeros usado DT, ponerlas en orden alfabetico y los numeros primero. La idea es achicar el programa que es tan extenso debido a que se repiten muchas cosas, luego de resumido procedes a depurarlo, ya que gran parte van a ser tablas.

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #9 en: 02 de Noviembre de 2017, 09:31:12 »
Muchas gracias veo que eres un crak en esto .Voy a cambiar lo que me dices y a ver como queda y si tu crees que deberia usar otro pic cual me recomendarias ,gracias.Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #10 en: 03 de Noviembre de 2017, 00:09:56 »
Respecto al PIC, depende de la disponibilidad de donde compres... Generalmente los mas nuevos tienen mas prestaciones y mejores precios que micros mas viejos, incluso pasandote a la gama de los PIC18

Respecto al programa podemos seguir achicando lo que hiciste, el tema esta que por ahora vamos acortando el programa. Pero sigo usando TU programa, es decir hace lo mismo que tu programa. Por lo tanto el error persiste. Pero al ser mas compacto se puede saber realmente que se esta haciendo, y no revisar muchas paginas para saber cual es el error o como es el flujo del programa.

Cambiemos esta parte:

Código: ASM
  1. ENVIA_DATO_SPI_1DIG;Digito numero uno
  2.          bsf       SSPCON,SSPEN           ; Quitarlo fuera.
  3.          bcf       PORTC,2                ; PORTC,2 = 0
  4.          movf      DATO_HIT,W             ; Envia DATO_HIT
  5.          movwf     SSPBUF    
  6.          bsf       STATUS,RP0
  7.          bcf       STATUS,RP1
  8. BUCLE_1DIG_H
  9.          btfss     SSPSTAT,BF             ; Espera una recepcion ????
  10.          goto      BUCLE_1DIG_H
  11.          bcf       STATUS,RP0             ; Envia DATO_LOW
  12.          movf      DATO_LOW,W
  13.          movwf     SSPBUF
  14.          bsf       STATUS,RP0
  15. BUCLE_1DIG_L
  16.          btfss     SSPSTAT,BF             ; Espera recepcion ?
  17.          goto      BUCLE_1DIG_L
  18.          bcf       STATUS,RP0
  19.          movlw     0X07;Envia siete no_op  ; Envia 7 veces 0x0000
  20.          movwf     CONTA_NO_OP_D1
  21. N_NO_OP_D1
  22.          movlw     0X00
  23.          movwf     SSPBUF
  24.          bsf       STATUS,RP0
  25. BUCLE_NO_OP_H
  26.          btfss     SSPSTAT,BF
  27.          goto      BUCLE_NO_OP_H
  28.          bcf       STATUS,RP0
  29.          movlw     0X00
  30.          movwf     SSPBUF
  31.          bsf       STATUS,RP0
  32. BUCLE_NO_OP_L
  33.          btfss     SSPSTAT,BF
  34.          goto      BUCLE_NO_OP_L
  35.          bcf       STATUS,RP0
  36.          decfsz    CONTA_NO_OP_D1
  37.          goto      N_NO_OP_D1
  38.          bsf       PORTC,2
  39.          bcf       SSPCON,SSPEN
  40.          return

Por lo que observo, segun el numero de digito ya que son 8 de esas llamadas, es donde envias el dato... el problema es que necesitas 8. Si pudieras agregar un registro mas que indique el numero de digito es posible aglomerar todas las opciones, por ejemplo si pasas el digito 2, que el programa verifique que primero debe enviar un 0x0000, luego el dato, y finalmente 6 0x0000 mas. Algo asi:


Código: ASM
  1. ;Recibe:
  2. ; - DATO_HIT
  3. ; - DATO_LOW
  4. ; - NUMERO_DIG: Numero de digito al cual enviar los datlos HIT y LOW
  5.  
  6. ENVIA_DATO_SPI_DIG:
  7.     CLRF  CONTADOR
  8. CHECK_CONTADOR:    
  9.     DECF  NUMERO_DIG, W       ;Verifico si el numero de digito es ese para enviar el dato
  10.     SUBWF CONTADOR, W
  11.     BTFSC STATUS, Z
  12.     GOTO  ENVIA_SPI_DATO_DIG
  13.     BCF   PIR1, SSPIF
  14.     MOVLW 0X00          ; Aca envio 0x0000
  15.     MOVWF SSPBUF
  16.     BTFSS PIR1, SSPIF
  17.     GOTO  $-1
  18.     BCF   PIR1, SSPIF
  19.     MOVLW 0X00
  20.     MOVWF SSPBUF
  21.     BTFSS PIR1, SSPIF
  22.     GOTO  $-1
  23.     ;Aca procedo a incrementar el CONTADOR
  24. CHECK_LOOP:
  25.     INCF CONTADOR, F
  26.     MOVF CONTADOR, W
  27.     XORLW 0x08
  28.     BTFSS STATUS, Z
  29.     GOTO  CHECK_CONTADOR    ; Paso al siguiente numero
  30.     RETURN                  ; Se completo entonces vuelvo
  31. ENVIA_SPI_DATO_DIG:
  32.     BCF   PIR1, SSPIF
  33.     MOVF  DATO_HIT, W          ; Aca envio 0x0000
  34.     MOVWF SSPBUF
  35.     BTFSS PIR1, SSPIF
  36.     GOTO  $-1
  37.     BCF   PIR1, SSPIF
  38.     MOVF  DATO_LOW, W
  39.     MOVWF SSPBUF
  40.     BTFSS PIR1, SSPIF
  41.     GOTO  $-1
  42.     GOTO  CHECK_LOOP

Son 40 lineas para 1 digito, asi que multiplicalo por 8 o tal ves 9 ya que el primer digito es el codigo mas simple, supongamos 8, eso son 360 lineas versus 36 lineas capaz de manejar cualquier digito. Una reduccion importante de codigo. Por eso digo que si ves algo repetitivo entonces hay formas de mejorarlo.

Ese codigo nos vale por todos los que tenias antes, y la pregunta es ... porque lo hice ? por que vi otra funcion extremadamente larga que tenia el mismo problema y era "Encender_otra_ves" Ese codigo nuevamente es muy reptitivo. DATO_HIT no se modifica y luego comenzabas de 0xA0 avanzando en 0x08 unas cuentas veces. Luego DATO_HIT corresponde al numero de digito. Por ende vamos a crear una funcion que reemplace a esta, por una mas corta.
Pero eso lo dejo para el proxima respuesta que ya no tengo mas tiempo.
« Última modificación: 03 de Noviembre de 2017, 00:12:06 por KILLERJC »

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #11 en: 03 de Noviembre de 2017, 14:25:24 »
Empiezo a ver claras algunas cosas ,este fin de semana voy a cambiar todo lo que pueda a ver si conseguimos que funcione con el 16F 876A ,y si se resiste abra que cambiar de pic .En verdad el proyecto es mas ambicioso,ademas de la hora y la fecha la idea es que tambien muestre la temperatura y los dias  señalados como aniversarios,dias del santo de cada uno de la familia,etc,grabados previamente en una eeprom.No se si sera demasiado ambicioso,pero eso ya se ira viendo, espero que con tu inestimable ayuda.Ya enviare el programa con los cambios para que los veas. Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #12 en: 03 de Noviembre de 2017, 15:42:33 »
Se puede hacer tranquilamente con el 16F876A, solo que hay que mejorar el codigo para que sea mas entendible y encontrar el problema.

En realidad.. lo que uno espera del codigo o del bucle principal y que este bien separado es:

Loop principal:
- Leer el flag de RB0
- Tomar datos del RTC
- Darle Formato para que sea mas facil manejar en el PIC
- Incrementar el segundo
- Verificar si paso el minuto
- Dar formato para el LCD/matrix, dependiendo si era el minuto o no cambiara el mensaje a mostrar
- Envio al LCD/matrix


Si observas son puntos muy simples, pero que no se ven por la cantidad de codigo y porque seguramente este todo junto. Ese loop principal siempre deberia ser bien claro lo que hace y si observas cada punto es idependiente del otro. Es decir que se pueden programar por separado.
« Última modificación: 03 de Noviembre de 2017, 16:14:46 por KILLERJC »

Desconectado ManuelTS

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #13 en: 16 de Noviembre de 2017, 15:55:08 »
Hola ya estoy aqui de nuevo.He estado unos dias fuera y no he podido hacer nada con el programa, pero ayer le dedique un buen rato,cambie todo lo que pude pero sigue con el mismo problema,cuando la subrrutina es mayor que un segundo de tiempo se cuelga el programa,a ver si tienes alguna idea del porque y me puedes dar una solucion,gracias.
Hay envio el programa retocado
Código: ASM
  1.  

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con un programa para relog-calendario en matrix de led con pic 16F876A
« Respuesta #14 en: 19 de Noviembre de 2017, 10:59:49 »
Bueno voy a intentar evitar ver todos los demas problemas de codigo y voy a intentar enfocarme en el problema...

Citar
cuando la subrrutina es mayor que un segundo de tiempo se cuelga el programa

A que subrutina te referis?


 

anything