Autor Tema: contador sin multiplexar de 4 cifras 16f877  (Leído 2355 veces)

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

Desconectado YDAVID

  • PIC10
  • *
  • Mensajes: 3
contador sin multiplexar de 4 cifras 16f877
« en: 10 de Junio de 2005, 09:39:00 »
Contador sin multiplexar de 4 cifras.
Desarrolle un contador de 4 cifras multiplexado basado en un codigo asm para 16f84 de internet y me funciono a la perfeccion, y ahora me lo piden que no este multiplexado, entonces para eso estoy utilizando un 16f877 que nunca habia utilizado antes, los puertos b,c,d los conecto directamente a los digitos y cada pin de los puertos anteriores practicamente controla uno de los 7 segmentos en cada digito, el puerto (a) lo conecto al digito a travez de un decodificador BCD 74LS47 para compensar los pines que le hacen falta al puerto para trabajar directamente el digito, el asm lo modifique quizas hay esta el problem o en el conexionado del pic ummm no se.... bueno.....lo que hago es o lo que trato de hacer es, por medio de la entrada E0 del puerto E incrementar la cuenta no es nada mas, y esto ocurre, cuando enciende,osea que a veces no enciende, cuenta exactamente hasta 100 y se detiene, y despues de un rato se apaga, quizas sea algun detalle en la conexion o en el asambler el codigo asm que utilice es este:

agradezco cualquier ayuda que me deseen prestar.
   
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _RC_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF


;***** VARIABLE DEFINITIONS

;Contador de 4 digitos.

indo    equ     00h             ;registro de indireccion
pc      equ     02h             ;contador de programa
status  equ     03h             ;registro de estado
fsr     equ     04h             ;registro de seleccion

ptoa    equ     05h             ;puerto a
ptob    equ     06h             ;puerto b
ptoc   equ   07h
ptod   equ   08h
ptoe   equ   09h

trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
trisc   equ     87h             ;configuracion puerto c
trisd   equ     88h             ;configuracion puerto d
trise   equ     89h             ;configuracion puerto e

dig1    equ     22h             ;acumulador miles
dig2    equ     23h             ;acumulador centenas
dig3    equ     24h             ;acumulador decenas
dig4    equ     25h             ;acumulador unidades

limit   equ   28h
z       equ     02h             ;flag de cero
 
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo




;**********************************************************************
      ORG     0x000             ; processor reset vector
      clrf    PCLATH            ; ensure page bits are cleared
        goto    main              ; go to beginning of program


      

retar   movlw   0b1h
   movwf   limit
bucle   nop
   nop   
   nop
   decfsz   limit
   goto   bucle
   retlw   0


s1000                           ;rutina de incremento x 1000
        clrf    dig2            ;pone a cero las centenas
        incf    dig1            ;incrementa el contador de miles  
        movf    dig1, w         ;carga en work el conteo de los miles  
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        clrf    dig1            ;inicializa los miles  
        return
s100                            ;rutina de incremento x 100
        clrf    dig3            ;pone a cero las decenas
        incf    dig2            ;incrementa el contador de centenas
        movf    dig2, w         ;carga en work el conteo de las centenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s1000           ;incrementa los miles  
        return

s10                             ;rutina de incremento x 10
        clrf    dig4            ;pone a cero las unidades
        incf    dig3            ;incrementa el contador de decenas
        movf    dig3, w         ;carga en work el conteo de las decenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call   s100
   return

subir                           ;rutina de incremento
        incf    dig4            ;incrementa el contador de unidades
        movf    dig4, w         ;carga en work el conteo de las unidades
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s10             ;incrementa las decenas
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b"11000000"     ;genera el 0
        retlw   b"11100111"     ;genera el 1
        retlw   b"10001001"     ;genera el 2
        retlw   b"10000011"     ;genera el 3
        retlw   b"10100110"     ;genera el 4
        retlw   b"10010010"     ;genera el 5
        retlw   b"10010000"     ;genera el 6
        retlw   b"11000111"     ;genera el 7
        retlw   b"10000000"     ;genera el 8
        retlw   b"10000010"     ;genera el 9

main

; remaining code goes here
   
inicio                          ;programa principal
        bcf     status, 06h     ;selecciona el banco 1 donde
        bsf   status, 05h     ;estan las instr trisx    
        movlw   b"0"      ;configura el puerto a
        movwf   trisa           ;como salidas.
        movlw   b"0"        ;configura el puerto b
        movwf   trisb           ;como salidas
        movlw   b"0"      ;configura el puerto c
        movwf   trisc           ;como salidas.
        movlw   b"0"        ;configura el puerto d
        movwf   trisd           ;como salidas
        movlw   b"111"       ;configura el puerto e
        movwf   trise           ;como input

        bcf     status, 06h     ;
        bcf   status, 05h

        clrf    dig4
        clrf    dig3
        clrf    dig2
        clrf    dig1
   
empe       btfss   ptoe, 0         ;chequea el pulsador
   call    retar
   btfss   ptob, 0
   call   retar
   btfss   ptob, 0
   call   subir           ;llama la rutina de incremento

disp          movf    dig4, w      
   call   tabla
   movwf   ptoc            
   movf   dig3, w
   call   tabla
   movwf   ptod
   movf   dig2, w
   call   tabla
   movwf   ptob
   movf   dig1, w
   movwf   ptoa
   call    retar
       
               goto    empe            ;digito a mostrar
   END                       ; directive "end of program"
   

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: contador sin multiplexar de 4 cifras 16f877
« Respuesta #1 en: 10 de Junio de 2005, 12:47:00 »
El fallo esta cuando chekeas el pulsador. Mezclas puerto c,0 con puerto b,0 por esta razón la cuenta llega a 100 y se detiene y además la cuenta aumentará independientemente del pulsador.

Aqui tienes la modificación:

Codigo:
empe btfsc ptoe, 0 ;chequea si el pulsador se ha soltado
goto empe

call retar ; retardo antirrebotes

empe2 btfss ptoe, 0 ; chequea si el pulsador se ha pulsado
goto empe2

call retar ; retardo antirrebotes

call subir ;llama la rutina de incremento

disp movf dig4, w
call tabla
movwf ptoc
movf dig3, w
call tabla
movwf ptod
movf dig2, w
call tabla
movwf ptob
movf dig1, w
movwf ptoa

goto empe



Si necesitas ayuda dilo.

Desconectado YDAVID

  • PIC10
  • *
  • Mensajes: 3
RE: contador sin multiplexar de 4 cifras 16f877
« Respuesta #2 en: 13 de Junio de 2005, 12:34:00 »
Gracias antoniof, me voy inmediatamente a probarlo.....y te cuento....


 

anything