Autor Tema: [Ayuda] Contador pulsos TMR0 display 7 segmentos  (Leído 4819 veces)

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

Desconectado Crimson

  • PIC10
  • *
  • Mensajes: 4
[Ayuda] Contador pulsos TMR0 display 7 segmentos
« en: 06 de Octubre de 2012, 21:05:43 »
Hola, soy nuevo en el foro, el tema expresado ya lo eh buscado, eh encontrado parecidos pero no los comprendo del todo, quisiera me ayuden orienten.

Tengo que realizar un contador 00-99 por interrupciones en RA4 utilizando el timer0, tengo el programa que cuenta al 9 y no logro hacer contar las decenas solo muestra el 0 (en decenas). Les muestro el ASM y espero me puedan ayudar y me aclaren en donde me equivoque, si tienen otro modo de escribir este programa, también lo agradecería.

Es con el pic 16f877a

   #include <p16f877a.inc>
CONF_ADCON1 equ b'00000110' ;PA entrada digital
CONF_OPT equ 0xF8 ;Valor al TMR0
LIMITE equ   0x0A ;Limite de display
TEMP equ 0x21 ;Variable
TEMP2 equ 0x22
conta equ 0x23
   org   00
   nop
   nop
ini   bsf   STATUS,RP0
   bcf   STATUS,RP1
   movlw CONF_ADCON1   ;PA como entrada digital
    movwf ADCON1
    movlw   0xFF
    movwf   TRISA    ;PA entrada
    clrf   TRISC    ;PD salida
   clrf   TRISD   ;PC salida
    movlw   CONF_OPT
    movwf   OPTION_REG   ;Configuracion del TMRO
   bcf   STATUS,RP0
   bcf   STATUS,RP1
   clrf   TMR0
   clrf   conta
bucle   movf   TMR0,W
   movwf   TEMP
   movlw   LIMITE
   xorwf   TEMP,W
   btfss   STATUS,Z
   goto   sigue
   goto   dece
sigue   movf   TEMP,W
   call   tabla   ;Decodifica el valor de DISPLAY
   movwf   PORTC   ;Escribe el valor en PORTC
   goto   bucle   ;Salta a la etiqueta bucle
dece   clrf   TMR0
   clrf   TEMP
   movf   conta,W
   movwf   TEMP2
   incf   TEMP2,W
   movlw   LIMITE
   xorwf   TEMP2,W    ;W XOR TEMP
    btfss   STATUS,Z   ;EL resultado de la anterior instruccion es 0?
    goto   sigue2    ;Z=0, NO es diferente de 0, TMRO = 0,1,2,3,4,5,6,7,8,9
    clrf   TMR0 ;Z=1, SI vale 10, TMRO > 9, TMR0=0
    clrf   TEMP ;Temp=0
sigue2   movf   TEMP,W
   call   tabla   ;Decodifica el valor de DISPLAY
   movwf   PORTD   ;Escribe el valor en PORTD
   goto   bucle   ;Salta a la etiqueta bucle   
tabla   addwf PCL,f
    retlw   3Fh ;0
    retlw   06h ;1
    retlw   5Bh ;2
    retlw   4Fh ;3
    retlw   66h ;4
    retlw   6Dh ;5
    retlw   7Dh ;6
    retlw   07h ;7
    retlw   7Fh ;8
    retlw   67h ;9
   end
el programa es de: http://www.alos.5u.com/pic16f877/Modulo2.html

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: [Ayuda] Contador pulsos TMR0 display 7 segmentos
« Respuesta #1 en: 06 de Octubre de 2012, 22:05:59 »
Hola. Hay un par de errores para que las decenas se incrementen correctamente. Fijate que nunca se guarda un incremento del registro TEMP2, y ademas el sigue2 me parece que deberia empezar con movf TEMP2,W.

Personalmente lo haría así, aunque no lo probé, y hace bastante que no programo PICs en assembler:

Código: ASM
  1. #include <p16f877a.inc>
  2.  
  3. CONF_ADCON1     equ     b'00000110'     ;PA entrada digital
  4. CONF_OPT        equ     0xF8            ;Valor al TMR0
  5.  
  6. unidades        equ     0x20            ;Variable
  7. decenas                 equ     0x21
  8.  
  9.         org     0x000
  10.         clrf    STATUS
  11.         clrf    PCLATH
  12.         goto    ini
  13.  
  14.         org     0x004           ;ISR ira aqui luego
  15.         nop
  16.  
  17. ini
  18.         bsf     STATUS,RP0
  19.         bcf     STATUS,RP1
  20.         movlw   CONF_ADCON1     ;PA como entrada digital
  21.         movwf   ADCON1
  22.         movlw   0xFF
  23.         movwf   TRISA           ;PA entrada
  24.         clrf    TRISC           ;PD salida
  25.         clrf    TRISD           ;PC salida
  26.         movlw   CONF_OPT
  27.         movwf   OPTION_REG      ;Configuracion del TMRO
  28.         bcf     STATUS,RP0
  29.         bcf     STATUS,RP1
  30.         clrf    TMR0
  31.         clrf    conta
  32. loop
  33.         movf    TMR0,W
  34.         call    calcularDigitos
  35.  
  36.         movf    unidades,W
  37.         movwf   PORTC
  38.  
  39.         movf    decenas,W
  40.         movwf   PORTD
  41.         goto    loop
  42.  
  43. ;*****************************
  44. ;SUBRUTINAS
  45. ;*****************************
  46.  
  47. calcularDigitos
  48.         movwf   unidades
  49.         clrf    decenas
  50. otraDecena
  51.         movlw   .10
  52.         subwf   unidades,f
  53.         btfss   STATUS,C
  54.         goto    done
  55.  
  56.         incf    decenas,F
  57.         xorwf   decenas,W
  58.         btfsc   STATUS,Z
  59.         clrf    decenas
  60.  
  61.         goto    otraDecena
  62.  
  63. done
  64.         addwf   unidades,f
  65.         return
  66.  
  67.         END
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Crimson

  • PIC10
  • *
  • Mensajes: 4
Re: [Ayuda] Contador pulsos TMR0 display 7 segmentos
« Respuesta #2 en: 06 de Octubre de 2012, 22:21:30 »
Antes que nada muchas gracias, lo eh simulado y funciona al 100 te luciste, solo unas dudas...

que es o para que es PCLATH?, y como es que lograste incrementar las decenas, no logro entender  :?, de nuevo gracias

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: [Ayuda] Contador pulsos TMR0 display 7 segmentos
« Respuesta #3 en: 07 de Octubre de 2012, 16:33:46 »
Hola,

PCLATH se limpia sólo como precaución. Hay bastante información en el foro del rol que cumple PCLATH, especialmente cuando lidiamos frente a la paginación que poseen estos uC en su ROM.

Esa subrutina que he creado básicamente lo que hace es una restar de a 10 veces por vez el valor actual del TMR0. Si luego de la resta el valor sigue siendo positivo o cero, vuelvo a realizar otra resta. Básicamente funciona como una división por 10, pero sin meterse en mayor complejidad. Una vez que el valor de menor a cero, el resto será el valor que corresponda a las unidades.

Si lo vemos análogamente en análisis matemático, haciendo una división entera tenemos:
 
87 / 10 = 8 y resto 7. Entonces 8 serán las decenas y 7 las unidades.

El algorítmo hace sucesivas restas: 87 - 10, 77 - 10, 67 - 10, ..., 17 - 10, 7 - 10. El resultado de 7 - 10 es menor a cero. En ese momento es que el algorítmo deja de restar y el resto (7) será el valor asignado a las unidades.

Ojo que hay una discontinuidad cuando TMR0 pasa de valer internamente 255(el display mostrará 55 en dicho momento, ya que descarta las centenas(2)) y el TMR se incremente y desborde, pasando a valer 0, el display va a pasar de 55 a 00 de golpe, no respetando la lógica.

Podés agregar código que impida que el timer supere los 100 (o 200)

Código: ASM
  1. #include <p16f877a.inc>
  2.  
  3. CONF_ADCON1     equ     b'00000110'     ;PA entrada digital
  4. CONF_OPT        equ     0xF8            ;Valor al TMR0
  5.  
  6. unidades        equ     0x20            ;Variable
  7. decenas                 equ     0x21
  8.  
  9.         org     0x000
  10.         clrf    STATUS
  11.         clrf    PCLATH
  12.         goto    ini
  13.  
  14.         org     0x004           ;ISR ira aqui luego
  15.         nop
  16.  
  17. ini
  18.         bsf     STATUS,RP0
  19.         bcf     STATUS,RP1
  20.         movlw   CONF_ADCON1     ;PA como entrada digital
  21.         movwf   ADCON1
  22.         movlw   0xFF
  23.         movwf   TRISA           ;PA entrada
  24.         clrf    TRISC           ;PD salida
  25.         clrf    TRISD           ;PC salida
  26.         movlw   CONF_OPT
  27.         movwf   OPTION_REG      ;Configuracion del TMRO
  28.         bcf     STATUS,RP0
  29.         bcf     STATUS,RP1
  30.         clrf    TMR0
  31.         clrf    conta
  32. loop
  33.         movlw   .100
  34.         subwf   TMR0,W
  35.         btfsc   STATUS,C
  36.         movwf   TMR0
  37.  
  38.         btfsc   STATUS,C
  39.         goto    loop
  40.  
  41.         movf    TMR0,W
  42.         call    calcularDigitos
  43.  
  44.         movf    unidades,W
  45.         movwf   PORTC
  46.  
  47.         movf    decenas,W
  48.         movwf   PORTD
  49.         goto    loop
  50.  
  51. ;*****************************
  52. ;SUBRUTINAS
  53. ;*****************************
  54.  
  55. calcularDigitos
  56.         movwf   unidades
  57.         clrf    decenas
  58. otraDecena
  59.         movlw   .10
  60.         subwf   unidades,f
  61.         btfss   STATUS,C
  62.         goto    done
  63.  
  64.         incf    decenas,F
  65.         xorwf   decenas,W
  66.         btfsc   STATUS,Z
  67.         clrf    decenas
  68.  
  69.         goto    otraDecena
  70.  
  71. done
  72.         addwf   unidades,f
  73.         return
  74.  
  75.         END
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PALMIRANO

  • PIC10
  • *
  • Mensajes: 12
Re: [Ayuda] Contador pulsos TMR0 display 7 segmentos
« Respuesta #4 en: 14 de Abril de 2013, 18:07:11 »
Y como sería en un caso donde haya que contar pulsos mayores a 255 o mayores a 511, o mayores a 1023 ............???  pero usando micros de 8 bits....?  :oops:


 

anything