Autor Tema: Display 7 segmentos Pic 16f628a  (Leído 24931 veces)

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

Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Display 7 segmentos Pic 16f628a
« en: 24 de Mayo de 2009, 05:34:44 »
Hola estoy buscando un ejemplo para guiarme de un contador digital de 0 -9 segundo. y que del 9 se reinicie al 0.
necesito crear el programa en asm para el pic 16f628a
Ojala puedan darme un guia gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Display 7 segmentos Pic 16f628a
« Respuesta #1 en: 24 de Mayo de 2009, 13:43:14 »
http://www.todopic.com.ar/foros/index.php?topic=24720.0

Ahi lo tienes para el 16f84, en el mismo hilo un poco mas adelante tienes ejemplos con el 1f628, solo tienes que adaptarlo un poco. Espero que no solo lo copies, y que trates de aprender como se hace, te sera de mas utilidad.

tapi8

Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Re: Display 7 segmentos Pic 16f628a
« Respuesta #2 en: 24 de Mayo de 2009, 19:46:21 »
        Brother porque no puedo almacenar y leer en la eeprom ?
   
    list p=16f628a
                 include p16f628a.inc

                 cblock 0x20
                  NUMERO
   CONT1
   CONT2
   CONT3
   endc

   ;Inicio 
   org 0x00
   goto Inicio

   org 0x05
Inicio
   bcf    STATUS, RFC
                  clrf     EEADR
   bsf EECON1,R0
   movf EEDATA, W
   bsf STATUS,RP0

Principal
   clrf    NUMERO

Ciclo   movf    NUMERO, w
   call   Despliega
   movwf   PORTB
   call   Retardo
   incf   NUMERO, f
   movf   NUMERO, w
   sublw   0x10
   btfss   STATUS, Z
   goto   Ciclo
   goto   Principal

Despliega
   addwf   PCL, f
   retlw   b'0000'   
   retlw   b'0001'   
   retlw   b'0010'   
   retlw   b'0011'   
   retlw   b'0100'   
   retlw   b'0101'   
   retlw   b'0110'   
   retlw   b'0111'   
   retlw   b'1000'
Retardo
   
   movlw   d'50'
   movwf   CONT3
Ciclo3 movlw d'100'
   movwf   CONT2
Ciclo2 movlw d'33'
   movwf   CONT1
Ciclo1 decfsz CONT1 ,f
   goto   Ciclo1
   decfsz   CONT2, f
   goto   Ciclo2   
   decfsz   CONT3, f
   goto   Ciclo3
   return
   end




Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Display 7 segmentos Pic 16f628a
« Respuesta #3 en: 24 de Mayo de 2009, 21:05:03 »
Porque usas Tabla? Si no estas conectando el Display directamente al Puerto y usas un decodificador BCD como el 74LS47, el 74LS249, o el CD4511 puedes cargar la variable Numero directamente al puerto.
No contesto mensajes privados, las consultas en el foro

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Display 7 segmentos Pic 16f628a
« Respuesta #4 en: 25 de Mayo de 2009, 08:06:22 »
En que puerto tienes el decodificador? No lo tienes configurado como salida.
Porque solo cuentas hasta 8 y no hasta 9. Aparte lo que te dice suki para quieres tabla si haces el conteo directamente?
Para que quieres leer la EEPRON?

tapi8

Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Re: Display 7 segmentos Pic 16f628a
« Respuesta #5 en: 26 de Mayo de 2009, 02:05:48 »
Mi programa tiene que almacenar en la eeprom.
 list p=16f628a
    #include p16f628a.inc

   org 00h
   bsf status, rp0
   clrf eeadr
   bsf eecon1,rd
   movf eedata,w
   bcf status,rp0
   bsf status,rp0
   incf eeadr,f
   bcf status, rp0
   movlw 0ah
   xorwf eeadr,w
   btssf status,z
   bsf intcon gie

ciclo 
   bsf status rp
   bsf eecon1,rd
   movf eedata,w
   bcf status,rp0
   incf eeadr,f
   movlw 0ah
   call delay
   bsf status rp0
   incf eeadr,f
   movlc 0ah
   xorwf eeadr,w
   bcf status, rp0
   goto ciclo
   delay  clrf tmr0
    bsf tmr0,toie
   desborda  movf cont,w
   btfss status,z
   goto desborda
   movlw 07h
   movwf cont
   bcf tmr0,toie
   return
   end
este programa lo escribi yo se que esta repleto de errores estoy muy novato en ensamblador. ojala me de a entender, de ante mano gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Display 7 segmentos Pic 16f628a
« Respuesta #6 en: 26 de Mayo de 2009, 06:52:07 »
Si tienes que almacenar en la EEPROM la solucion que veo es por direccionamiento indirecto.
Ejemplo de suki:


; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador   equ      0x0C   ; Seleccionamos posición en la memoria RAM (GPR) para guardar
               ; registro utilizado para demora.-
Contador1   equ      0x0D   ; Registro utilizado en demora.-
Contador2   equ      0x0E



Reset      
   org   0x00         ; Aquí comienza el micro.-
   goto   Inicio         ; Salto a inicio de mi programa.-
;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio
   bsf   STATUS,RP0    ; Pasamos de Banco 0 a Banco 1.-
   clrf   TRISB      ; PORTB como salida.-
   bcf   STATUS,RP0   ; Paso del Banco 1 al Banco 0
   call   Config_Tabla   ; Cargamos registros con Codigo de 7 segmentos.-   
   movfw   INDF      ; Leemos codigo de 7 Segmentos para el CERO.-
   movwf   PORTB      ; Mostramos el CERO.-
;**** Testeo de Pulsador ****
Bucle
   call   Demora_190ms      ; Demora para visualizar Display
   incf   FSR,1         ; Incrementamos Puntero.-
   movlw   0x1A         ; Consulamos si se pide codigo para mostrar "10",
   subwf   FSR,0         ; si es asi reseteamos FSR, apunta a 0x10--> "0".-
   btfss   STATUS,Z      ; Si Z=1 --> 0x1A - FSR = 0.-
   goto   Muestro_Display      ; No, muestro display.-
   movlw   0x10         ; Si reseteo puntero.-
   movwf   FSR            ;
Muestro_Display
   movfw   INDF         ; Leo Registro que apunta FSR.-
   movwf   PORTB         ; Lo cargo en PORTB.-
   goto   Bucle         ; Continuo conteo.-

      
;**** Demora ****
Demora_190ms
   movlw   0xFF         ;
   movwf   Contador1      ; Iniciamos contador1.-
Repeticion1
   movlw   0xFF         ;
   movwf   Contador2      ; Iniciamos contador2
Repeticion2
   decfsz   Contador2,1      ; Decrementa Contador2 y si es 0 sale.-      
   goto   Repeticion2      ; Si no es 0 repetimos ciclo.-
   decfsz   Contador1,1      ; Decrementa Contador1.-
   goto   Repeticion1      ; Si no es cero repetimos ciclo.-
   return            ; Regresa de la subrutina.-
;**** Cargamos tabla en memoria ****
Config_Tabla
   movlw   0x10   ;
   movwf   FSR   ; Direccionamos el registro 0x10 de la memoria RAM (GPR).-
   movlw   0x3F   ; Cargamos el codigo para mostrar el CERO.-
   movwf   INDF   ; Lo guardamos donde apunta FSR --> 0x10.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x11.-
   movlw   0x06   ; Cargamos codigo para UNO.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x12.-
   movlw   0x5B   ; Cargamos codigo para DOS.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x13.-
   movlw   0x4F   ; Cargamos codigo para TRES.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x14.-
   movlw   0x66   ; Cargamos codigo para CUATRO.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x15.-
   movlw   0x6D   ; Cargamos codigo para CINCO.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x16.-
   movlw   0x7D   ; Cargamos codigo para SEIS.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x17.-
   movlw   0x07   ; Cargamos codigo para SIETE.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x18.-
   movlw   0xFF   ; Cargamos codigo para OCHO.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x19.-
   movlw   0x6F   ; Cargamos codigo para NUEVE.-
   movwf   INDF   ; Lo guardamos donde apunta FSR.-
;....................
   movlw   0x10   ;
   movwf   FSR      ; Direccionamos Registro del CERO.-
   return         ; Cargado los valores, retornamos.-   
;..................................................................
   end

lo simule en el MPLAB y los GPR son igual en la RAM que en la EEPROM de hecho aunque se escribe en RAM, se reflejan en la EEPROM.
Es un trabajo para la facultad?. Por que os mandan hacer cosas complicadas sin enseñaros lo basico? La segunda pregunta es para tu profesor :lol:

tapi8

Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Re: Display 7 segmentos Pic 16f628a
« Respuesta #7 en: 26 de Mayo de 2009, 09:14:22 »
Gracias por tu respuesta.
Lo simule en el PicSimulator y ciertamente arroja lo que comentas.
Una pregunta mas.. Como lo adapto al 628a?
y Ultima podrian subir un diagrama para armar la protoboard?


Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Display 7 segmentos Pic 16f628a
« Respuesta #8 en: 26 de Mayo de 2009, 14:10:18 »
Esta puede ser una configuracion para los FUSES con reloj interno

list   p=16f628A   ;    
#include   <p16f628A.inc>      
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON

Cambia tambien las EQUS, en vez de 0C, 0D, 0E, ponlas en 0x20, 0x21, 0x22. Asi ya deberia ir.

El eqsuema lo tienes en la primera direccion que te di, fijate que es un catodo comun, si lo cambias te cambia la tabla.
RBO->A
RB1->B
RB2->C
RB3->D
RB4->E
RB5->F
RB6->G
Para esa tabla tienen que ir asi, con resistencias de 220 ohm a 330 ohm.


Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Re: Display 7 segmentos Pic 16f628a
« Respuesta #9 en: 26 de Mayo de 2009, 17:13:40 »
;O   :-)
Ty
Eso es.. ^^

Desconectado Kikeynuri

  • PIC10
  • *
  • Mensajes: 11
Re: Display 7 segmentos Pic 16f628a
« Respuesta #10 en: 27 de Mayo de 2009, 01:39:19 »
Brother.. adapte y compile como me comentaste y va bien..
pero me ocasiona un problema en el simulador hace esto.
0 1 2 5 6 7 8 9 , el 3 y 4 no aparecen..
Que puedo hacer?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Display 7 segmentos Pic 16f628a
« Respuesta #11 en: 27 de Mayo de 2009, 01:54:02 »
Cambia la Tabla a la forma siguiente:
Código: ASM
  1. ;**** Cargamos tabla en memoria ****
  2. Config_Tabla
  3.    movlw   0x30   ;
  4.    movwf   FSR   ; Direccionamos el registro 0x30 de la memoria RAM (GPR).-
  5.    movlw   0x3F   ; Cargamos el codigo para mostrar el CERO.-
  6.    movwf   INDF   ; Lo guardamos donde apunta FSR --> 0x10.-
  7. ;....................
  8.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x31.-
  9.    movlw   0x06   ; Cargamos codigo para UNO.-
  10.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  11. ;....................
  12.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x32.-
  13.    movlw   0x5B   ; Cargamos codigo para DOS.-
  14.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  15. ;....................
  16.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x33.-
  17.    movlw   0x4F   ; Cargamos codigo para TRES.-
  18.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  19. ;....................
  20.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x34.-
  21.    movlw   0x66   ; Cargamos codigo para CUATRO.-
  22.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  23. ;....................
  24.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x35.-
  25.    movlw   0x6D   ; Cargamos codigo para CINCO.-
  26.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  27. ;....................
  28.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x36.-
  29.    movlw   0x7D   ; Cargamos codigo para SEIS.-
  30.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  31. ;....................
  32.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x37.-
  33.    movlw   0x07   ; Cargamos codigo para SIETE.-
  34.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  35. ;....................
  36.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x38.-
  37.    movlw   0xFF   ; Cargamos codigo para OCHO.-
  38.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  39. ;....................
  40.    incf   FSR,1   ; Incrementamos FSR, ahora apunta a 0x39.-
  41.    movlw   0x6F   ; Cargamos codigo para NUEVE.-
  42.    movwf   INDF   ; Lo guardamos donde apunta FSR.-
  43. ;....................
  44.    movlw   0x30   ;
  45.    movwf   FSR      ; Direccionamos Registro del CERO.-
  46.    return             ; Cargado los valores, retornamos.-  
  47. ;..................................................................
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Display 7 segmentos Pic 16f628a
« Respuesta #12 en: 27 de Mayo de 2009, 01:58:22 »
Y también esto:  :mrgreen:
Código: ASM
  1. Bucle
  2.    call   Demora_190ms      ; Demora para visualizar Display
  3.    incf   FSR,1         ; Incrementamos Puntero.-
  4.    movlw   0x3A         ; Consulamos si se pide codigo para mostrar "10",
  5.    subwf   FSR,0         ; si es asi reseteamos FSR, apunta a 0x30--> "0".-
  6.    btfss   STATUS,Z      ; Si Z=1 --> 0x1A - FSR = 0.-
  7.    goto   Muestro_Display      ; No, muestro display.-
  8.    movlw   0x30         ; Si reseteo puntero.-
  9.    movwf   FSR            ;
  10. Muestro_Display
  11.    movfw   INDF         ; Leo Registro que apunta FSR.-
  12.    movwf   PORTB         ; Lo cargo en PORTB.-
  13.    goto   Bucle         ; Continuo conteo.-

Por ser un 16F628 :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Display 7 segmentos Pic 16f628a
« Respuesta #13 en: 27 de Mayo de 2009, 07:16:39 »
Pues claro, me di cuenta de las EQUS, pero que no de correr tambien la tabla, ¡que fallo!, gracias.
Por cierto suki que ventajas tiene este tipo de tablas?. Es que estoy haciendo un proyecto donde utilizo 5 displays, los uso como pasamensajes, muestro numeros, etc; lo hago con tablas "normales", o bien cargando los codigos directamente a los reg. que controlan los displays, era para saber si tendrian aplicacion en esto y me simpificarian el trabajo.

saludos tapi8

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Display 7 segmentos Pic 16f628a
« Respuesta #14 en: 27 de Mayo de 2009, 09:28:14 »
Ninguna ventaja, fíjate que usa más memoria de programa en cargar la tabla y aparte la tabla se carga en la memoria RAM. Como explique que era el direccionamiento indirecto, di este ejemplo para ver su uso.
No contesto mensajes privados, las consultas en el foro