Autor Tema: Ayuda 7 segments Multiplexe  (Leído 3184 veces)

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

Desconectado maryenita

  • PIC10
  • *
  • Mensajes: 5
Ayuda 7 segments Multiplexe
« en: 06 de Marzo de 2016, 10:51:12 »
A ver si me podes echar una mano resulta que tengo que hacer un programa que cuente de 0000 hasta 9999
De momento solo empieza a contar el display 1(bit0) pero cuando llega a 9 salta al siguiente display(bit1) y apaga el
el primer display,lo quiero es que permanezca encencendido los 4 Display
Ej:

0000,0001,0002,0003,0004,0004,0005,0006,0007,0008,0009,0010,0011 etc.

De momento es este el codigo que tengo:

;
; The following line embeds configuration data into the PICmicro
   LIST P=16F88
;   __CONFIG H'2007', H'3F7A'          ; RC mode
   __CONFIG H'2008', H'3FFC'          ; Clock Fail-Safe disabled
   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
            
; using aliases, bit names and conditional loops
            
#DEFINE   PAGE0   BCF   STATUS,5
#DEFINE   PAGE1   BSF   STATUS,5
            
STATUS   EQU   H'03'      ; STATUS register
TRISB   EQU   H'86'      ; Port B direction register
PORTB   EQU   H'06'      ; Port B data register
TRISA   EQU   H'85'      ; Port A direction register
PORTA   EQU   H'05'      ; Port A data register
PCL   EQU   H'02'
W   EQU   0      ; Working register flag
F   EQU   1      ; File register flag
C   EQU   0      ; Carry flag
Z   equ   2            
COUNT   equ   h'37'      ; Use File h'30' as a loop counter
COUNT5   equ   h'38'
COUNT1   equ   h'30'      ; Use File h'30' as a loop counter
COUNT2   equ   h'31'
COUNT3   equ   h'32'
COUNT4   equ   h'37'
DIGIT1   EQU   h'33'
DIGIT2   EQU   h'34'
DIGIT3   EQU   h'35'
DIGIT4   EQU   h'36'

N   equ   H'50'      ; Delay parameter computed in the text

   ORG   0      ; Reset vector
   GOTO   5      ; Goto start of program
   ORG   4      ; Interrupt vector
   GOTO   5      ; Goto start of program
   ORG   5      ; Start of program memory

START   CLRF   PORTA      ; clear Port B data register
   CLRF   PORTB
   PAGE1         ; PAGE1
   
   CLRF   H'9B'      ; Clear the ANSEL register
   CLRF   TRISA      ; Port A direction register for output
   CLRF   TRISB      ; Port B direction register for output
   
   PAGE0         ; PAGE0
   movlw   d'0'      ;
   movwf   DIGIT1      
   movlw   d'0'      ;
   movwf   DIGIT2   
   movlw   d'0'      ;
   movwf   DIGIT3   
   movlw   d'0'      ;
   movwf   DIGIT4


MAIN   NOP
   CLRF   COUNT1
   CLRF   COUNT2
   CLRF   COUNT3
   CLRF   COUNT4

   CLRF    COUNT1
   MOVF   COUNT1, W
   CALL   TABLE
   MOVWF   PORTB
   BSF   PORTA,0
   BSF   PORTA,1
   BSF   PORTA,2
   BSF   PORTA,3
   CALL    DELAY
   
   CLRF   COUNT1
LoopD1   ;CLRF   TRISA   
   ;CLRF   TRISB
   MOVF   COUNT1,W
   CALL   TABLE
   MOVWF   PORTB
   BSF   PORTA,3
   CALL   DELAY
   INCF   COUNT1
   MOVF   COUNT1
   CLRF   PORTA
   ADDLW   H'F6'
   BTFSS   STATUS,Z
   GOTO    LoopD1

   MOVF   COUNT2,W
   CALL   TABLE
   MOVWF   PORTB
   BCF   PORTA,2
   BSF   PORTA,2

   MOVF   COUNT3,W
   CALL   TABLE
   MOVWF   PORTB
   BCF   PORTA,1
   BSF   PORTA,1

   MOVF   COUNT4,W
   CALL   TABLE
   MOVWF   PORTB
   BCF   PORTA,0
   BSF   PORTA,0
   

   CALL   DELAY
   INCF   COUNT1
   MOVF   COUNT1
   CLRF   PORTA
   ADDLW   H'F6'
   BTFSS   STATUS,Z
   GOTO    LoopD1
   
   ;CLRF   COUNT2
LoopD2    MOVF   COUNT2,W
   CALL   TABLE
   MOVWF   PORTB
   BSF   PORTA,2
   CALL   DELAY

   
   INCF   COUNT2
   MOVF   COUNT2
   GOTO   LOOPD1
   ;CLRF   PORTA
   ADDLW   H'F6'
   BTFSS   STATUS,Z
   GOTO    LoopD2
   
   CLRF   COUNT3
LoopD3   MOVF   COUNT3,W
   CALL   TABLE
   MOVWF   PORTB
   BSF   PORTA,1
   CALL   DELAY
   INCF   COUNT3
   MOVF   COUNT3
   CLRF   PORTA
   ADDLW   H'F6'
   BTFSS   STATUS,Z
   GOTO    LoopD3

   CLRF   COUNT4
LoopD4   MOVF   COUNT4,W
   CALL   TABLE
   MOVWF   PORTB
   BSF   PORTA,0
   CALL   DELAY
   INCF   COUNT4
   MOVF   COUNT4
   CLRF   PORTA
   ADDLW   H'F6'
   BTFSS   STATUS,Z
   GOTO    LoopD4
   
   GOTO   MAIN
;==========================================================================================
;TABLE ROUTINE GOES HERE
TABLE   ADDWF PCL,F   
    RETLW B'11000000'   ;0
    RETLW B'11111001'   ;1
    RETLW B'10100100'   ;2
    RETLW B'10110000'   ;3
    RETLW B'10011001'   ;4
    RETLW B'10010010'   ;5
    RETLW B'10000010'   ;6
    RETLW B'11111000'   ;7
    RETLW B'10000000'   ;8
    RETLW B'10010000'   ;9
     ; common anode codes

;==========================================================================================
;FUCTION:'Dummy' Delay
;==========================================================================================

DELAY      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      

      RETURN

; final statement

END


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda 7 segments Multiplexe
« Respuesta #1 en: 06 de Marzo de 2016, 13:41:36 »
Se donde esta el error pero te voy a pedir que hagas algunas cosas (la idea es que no tengas mas estos problemas):

Primero podrias usar el .inc que provee el MPLAB de esa forma tenes definido STATUS,TRISB, etc.

Te voy a pedir lo siguiente. Vas a tener que hacer 2 "subrutinas" cada una hace algo simple. Tu programa quedaria asi:

Código: ASM
  1. ;
  2. ; The following line embeds configuration data into the PICmicro
  3.    LIST P=16F88
  4. ;   __CONFIG H'2007', H'3F7A'          ; RC mode
  5.    __CONFIG H'2008', H'3FFC'          ; Clock Fail-Safe disabled
  6.    
  7. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8.            
  9. ; using aliases, bit names and conditional loops
  10.            
  11. #DEFINE   PAGE0   BCF   STATUS,5
  12. #DEFINE   PAGE1   BSF   STATUS,5
  13.            
  14. STATUS   EQU   H'03'      ; STATUS register
  15. TRISB   EQU   H'86'      ; Port B direction register
  16. PORTB   EQU   H'06'      ; Port B data register
  17. TRISA   EQU   H'85'      ; Port A direction register
  18. PORTA   EQU   H'05'      ; Port A data register
  19. PCL   EQU   H'02'
  20. W   EQU   0      ; Working register flag
  21. F   EQU   1      ; File register flag
  22. C   EQU   0      ; Carry flag
  23. Z   equ   2            
  24. COUNT   equ   h'37'      ; Use File h'30' as a loop counter
  25. COUNT5   equ   h'38'
  26. COUNT1   equ   h'30'      ; Use File h'30' as a loop counter
  27. COUNT2   equ   h'31'
  28. COUNT3   equ   h'32'
  29. COUNT4   equ   h'37'
  30. DIGIT1   EQU   h'33'
  31. DIGIT2   EQU   h'34'
  32. DIGIT3   EQU   h'35'
  33. DIGIT4   EQU   h'36'
  34.  
  35. N   equ   H'50'      ; Delay parameter computed in the text
  36.  
  37.    ORG   0      ; Reset vector
  38.    GOTO   5      ; Goto start of program
  39.    ORG   4      ; Interrupt vector
  40.    GOTO   5      ; Goto start of program
  41.    ORG   5      ; Start of program memory
  42.  
  43. START   CLRF   PORTA      ; clear Port B data register
  44.    CLRF   PORTB
  45.    PAGE1         ; PAGE1
  46.    
  47.    CLRF   H'9B'      ; Clear the ANSEL register
  48.    CLRF   TRISA      ; Port A direction register for output
  49.    CLRF   TRISB      ; Port B direction register for output
  50.    
  51.    PAGE0         ; PAGE0
  52.    movlw   d'0'      ;
  53.    movwf   DIGIT1      
  54.    movlw   d'0'      ;
  55.    movwf   DIGIT2  
  56.    movlw   d'0'      ;
  57.    movwf   DIGIT3  
  58.    movlw   d'0'      ;
  59.    movwf   DIGIT4
  60.  
  61.  
  62. MAIN
  63.         CALL    INCREMENTAR_NUMERO
  64.         CALL    MOSTRAR_DISPLAY
  65.         GOTO   MAIN
  66.  
  67. ;==========================================================================================
  68. ;TABLE ROUTINE GOES HERE
  69.  
  70. TABLE   ADDWF PCL,F  
  71.     RETLW B'11000000'   ;0
  72.     RETLW B'11111001'   ;1
  73.     RETLW B'10100100'   ;2
  74.     RETLW B'10110000'   ;3
  75.     RETLW B'10011001'   ;4
  76.     RETLW B'10010010'   ;5
  77.     RETLW B'10000010'   ;6
  78.     RETLW B'11111000'   ;7
  79.     RETLW B'10000000'   ;8
  80.     RETLW B'10010000'   ;9
  81.      ; common anode codes
  82.  
  83. ;==========================================================================================
  84. ;FUCTION:'Dummy' Delay
  85. ;==========================================================================================
  86.  
  87. DELAY      NOP
  88.       NOP
  89.       NOP
  90.       NOP
  91.       NOP
  92.       NOP
  93.       NOP
  94.      
  95.  
  96.       RETURN
  97.  
  98. ; final statement
  99.  
  100. END

Como veras lo unico que hice fue quitar todo el main y poner 2 CALL.
Tu trabajo ahora es crear esas subrutinas. Y te voy a comentar que deben hacer cada una

La primera subrutina, aumentara en 1 a DIGIT4, luego preguntara si llego a 10 para asi aumentar DIGIT3 y poner a 0 DIGIT4, si no llego a 10 sale con un RETURN.
Obviamente esto sigue con DIGIT2 y DIGIT1. Dejo un poquito, lo demas es identico nomas que lo hace para los demas digitos

Código: ASM
  1. INCREMENTAR_NUMERO:
  2.         INCF    DIGIT4, F
  3.         MOVLW   0xF6
  4.         ADDWF   DIGIT4, W
  5.         BTFSS   STATUS,Z
  6.         RETURN
  7.         CLRF    DIGIT4
  8.         INCF    DIGIT3, F
  9.         ...... ; Lo mismo que arriba pero para DIGIT3,2 y 1.

Y luego la otra subrutina, lo unico que hace es mostrar en el display. Es decir tomar el valor de DIGIT4 a DIGIT1, ponerlos en el PORTx y activar los comunes.

Código: ASM
  1. MOSTRAR_DISPLAY:
  2.         ; Apago todos los displays
  3.         MOVF    DIGIT4, W
  4.         CALL    TABLE
  5.         MOVWF   PORTx
  6.         ; Enciendo el display4
  7.         CALL    DELAY
  8.  
  9.         ;Repito para los demas displays

De esta forma tu problema se simplifica, cada subrutina hace algo y si por ejemplo quisiera probar la ruutina de MOSTRAR_DISPLAY, podria simplimente reemplazar el main por esto:

Código: ASM
  1. MAIN
  2.         MOVLW   0x04
  3.         MOVWF   DIGIT4
  4.         MOVLW   0x07
  5.         MOVWF   DIGIT3
  6.         MOVLW   0x05
  7.         MOVWF   DIGIT2
  8.         MOVLW   0x08
  9.         MOVWF   DIGIT1
  10.  
  11.         CALL    MOSTRAR_DISPLAY
  12.         GOTO   MAIN

Ya que MOSTRAR_DISPLAY lo unico que hace es tomar los DIGITx y ponerlos en el puerto. Sin importar si hay alguna otra cosa antes.
« Última modificación: 06 de Marzo de 2016, 19:56:13 por KILLERJC »

Desconectado maryenita

  • PIC10
  • *
  • Mensajes: 5
Re:Ayuda 7 segments Multiplexe
« Respuesta #2 en: 06 de Marzo de 2016, 18:36:19 »
Te agradezco mucho KILLERJC, manana lo pruebo y te digo como me va, lastimosamente nunca he usado el MPLAB,de momento utilizo
un programa que se llama ASM4PICsV4 ,gracias nuevamente.

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda 7 segments Multiplexe
« Respuesta #3 en: 06 de Marzo de 2016, 19:58:08 »
Te recomiendo el MPLAB X si vas a programar en ASM, es el software del propietario, no tiene limites ni restricciones en ASM, asi que lo podes usar tranquilamente y podes usarlo en cualquier micro tambien.

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:Ayuda 7 segments Multiplexe
« Respuesta #4 en: 08 de Marzo de 2016, 10:17:13 »
puedes ayudarme con el CCS, querio cambiar mi lcd por 3 display de 7 segmentos y un solo pic, ya logre hacer q contara de 1 a 9 pero cuando quiero que muestre 10 me tira 11 22 33 44 55 66, no puedo hacer q el 2 display cambie.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda 7 segments Multiplexe
« Respuesta #5 en: 08 de Marzo de 2016, 13:12:01 »
El diagrama que pusiste esta mal, el NPN te va a servir para 7 segmentos de catodo comun, Si queres usar de anodo comun, vas a tener que usar un PNP + NPN para poder usarlo con el micro.

Respecto a CCS, deberias buscar ejemplos de codigo en el foro, deberia haber, aunque en realidad es demasiado facil como para que te lo pase, pero te voy a decir que hacer:


Desactivar todos los comunes
Poner dato en el puerto
Activar el comun del display a mostrar
Delay 5ms

Repetir para los 2 display restantes.

Listo terminaste tu multiplexacion

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:Ayuda 7 segments Multiplexe
« Respuesta #6 en: 08 de Marzo de 2016, 13:27:51 »
El diagrama que pusiste esta mal, el NPN te va a servir para 7 segmentos de catodo comun, Si queres usar de anodo comun, vas a tener que usar un PNP + NPN para poder usarlo con el micro.

Respecto a CCS, deberias buscar ejemplos de codigo en el foro, deberia haber, aunque en realidad es demasiado facil como para que te lo pase, pero te voy a decir que hacer:


Desactivar todos los comunes
Poner dato en el puerto
Activar el comun del display a mostrar
Delay 5ms

Repetir para los 2 display restantes.

Listo terminaste tu multiplexacion

gracias pude resolverlo parece ser que lo primero era mi gran poblema

Desconectado maryenita

  • PIC10
  • *
  • Mensajes: 5
Re:Ayuda 7 segments Multiplexe
« Respuesta #7 en: 10 de Marzo de 2016, 06:49:25 »
Te agradezco mucho KILLERJC, manana lo pruebo y te digo como me va, lastimosamente nunca he usado el MPLAB,de momento utilizo
un programa que se llama ASM4PICsV4 ,gracias nuevamente.

Gracias

Hola Killerjc, no me trabaja con las 2 rutinas que me mencionas, segun lo que he leido tengo que usar el metodo de ISR(Interruptor service Routine)
Por lo que poco tengo conociemiento el ISR se encargaria de hacer update en X tiempo los Display.

Seguire investigando,gracias por tu ayuda.

Tengo que poner esta parte de codigoOPSHUN   EQU   H'81'      ;
STATUS   EQU   H'03'      ;
PORTB   EQU   H'06'      ;
TRISB   EQU   H'86'      ;
INTCON   EQU   H'0B'      ;
W   EQU   0      ;
F   EQU   1      ;
C   EQU   0      ;
DC   EQU   1      ;
Z   EQU   2      ;
            
CLKCNT   EQU   H'20'      ;clock division counter
CLKSEC   EQU   H'21'      ;clock seconds counter
            
   ORG   0      ; Reset vector
   GOTO   5      ; Goto start of program
   ORG   4      ; Interrupt vector
   GOTO   ISR_RT      ; Goto start of program
   ORG   5      ; Start of program memory

   CLRF   PORTB      ;
   PAGE1         ; PAGE1
   CLRF   H'9B'      ; Clear the ANSEL register
   CLRF   TRISB      ;Port B0-B7 as output
   MOVLW   B'00000111'   ;set timer ratio 1:128 (TMRO rate)
   MOVWF   OPSHUN      
   PAGE0         ; PAGE0   
   MOVLW   D'75'      ;set CLKCNT to 150
   MOVWF   CLKCNT      
   CLRF   CLKSEC      ;clear seconds
   BCF   INTCON,2      ;clear time-out flag

   BSF   INTCON,7
   BSF   INTCON,5
;=========================================================================================================
MAIN   NOP
   NOP
   NOP
   GOTO   MAIN   ;no
;=========================================================================================================
ISR_RT   BCF   INTCON,2      ;yes, clear flag
   DECFSZ   CLKCNT,F      ;dec CLKCNT (1/150 divider), is it zero?
   GOTO   FIN_ISR
      ;no
   MOVLW   D'75'      ;yes, reset it to 150
   MOVWF   CLKCNT      
   
   INCF   CLKSEC      ;yes, move new val to secs
   
OUTPUT   MOVF   CLKSEC,W      ;get secs val
   MOVWF   PORTB      ;send to PORTB
FIN_ISR   RETFIE   ;go back to reading time-out bit

   END         ;final line

A ver si tu tienes una mejor idea.

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda 7 segments Multiplexe
« Respuesta #8 en: 10 de Marzo de 2016, 13:37:36 »
En realidad lo MEJOR es hacerlo por ISR, pero eso es si tenes que hacer muchas cosas mas, Al menos con lo que tenes podes hacerlo tranquilamente como te decia yo. Por lo que veo te faltan varias cosas para una interrupcion. Empiezo por los errores de este codigo:

Código: ASM
  1. ORG   0      ; Reset vector
  2.    GOTO   5      ; Goto start of program
  3.    ORG   4      ; Interrupt vector
  4.    GOTO   ISR_RT      ; Goto start of program
  5.    ORG   5      ; Start of program memory

Nunca hagas eso. Hay PICs que los GOTO ocupan 2 espacios. Dejalo que el mismo linker acomode como el desea.

Código: ASM
  1. ORG   0x00                     ; Reset vector
  2.    GOTO   Configuracion      ; Goto start of program
  3.    ORG   0x04                     ; Interrupt vector
  4.    GOTO   ISR_RT               ; Goto start of program
  5.  
  6. Configuracion:


Código: ASM
  1. ISR_RT   BCF   INTCON,2      ;yes, clear flag
  2.    DECFSZ   CLKCNT,F      ;dec CLKCNT (1/150 divider), is it zero?
  3.    GOTO   FIN_ISR
  4.       ;no
  5.    MOVLW   D'75'      ;yes, reset it to 150
  6.    MOVWF   CLKCNT      
  7.    
  8.    INCF   CLKSEC      ;yes, move new val to secs
  9.    
  10. OUTPUT   MOVF   CLKSEC,W      ;get secs val
  11.    MOVWF   PORTB      ;send to PORTB
  12. FIN_ISR   RETFIE   ;go back to reading time-out bit

En parte esta bien y te va a funcionar por que tu programa no hace mas que NOPs en la rutina principal, pero cuando agregues alguna otra instruccion vas a tener problemas. El funcionamiento paso a paso seria asi:

Corriendo el loop principal ( STATUS => Z=1 C=0 ) ( W = 0x10 )
Antes de ejecutar una instruccion por ejemplo: BTFSS STATUS,Z ocurre una interrupcion.
El micro guarda la direccion donde estaba ( la de la instruccion que debe ejecutar cuando vuelva, pensalo como un CALL/RETURN )
Entra a la interrupcion, hace lo que debe hacer y sale.
Comienza a ejecutar la instruccion en la cual quedo : BTFSS STATUS,Z

Si no lo notaste hay un problema, de la forma que lo tenes realizado esas banderas de STATUS pueden cambiar y W puede cambiar en tu interrupcion haciendo que tal ves el BTFSS que era un salto termine no saltando, cuando vuelva el resultado de STATUS va a depender de lo que hiciste en la interrupcion, para eso uno debe apenas entra a la interrupcion guardar STATUS,W y en caso de ser grande el programa PCLATH, Al salir de la interrupcion uno deberia volver a poner esos valores en donde estaban. los datasheet proveen siempre un codigo para esto, pagina 140 del datasheet del PIC16F88 ( o busca en el PDF siempre por W_TEMP )


 

anything