Autor Tema: contador 2 digitos PIC  (Leído 10680 veces)

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

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
contador 2 digitos PIC
« en: 14 de Junio de 2006, 10:19:21 »
hola necesito ayuda, quiero hacer un contador de dos digitos con transitores, tngo el programa hehco pero en la practica se queda a 00 los displays ayuda porfavor.

tngo el .HEX q alguien me ayude muchas gracias.....

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: contador 2 digitos PIC
« Respuesta #1 en: 14 de Junio de 2006, 10:59:38 »
Hola. Bueno...con transistores???
Si tenes el .hex va a ser bastante mas complicado modificar el programa que si tuvieses el .asm...
Saludos.
"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 aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: contador 2 digitos PIC
« Respuesta #2 en: 14 de Junio de 2006, 13:22:09 »
Hola amigo!

Seria posible que pases el esquema del circuito? Por ahi podemos sugerir algo si lo vemos.....

Saludos!  :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #3 en: 15 de Junio de 2006, 16:22:42 »
hola amigos muchas gracias, estoy desesperado mñn viernes tngo q entregarlo y os agradeceira q me ayudarais, tngo el circuito y el .asm, estoy q me tiro de los pelos no tngo ni idea porqeu no me cuenta bien. mi programa es el siguiente(lo saque de internet, y es para 4 transistores, pero lo quiero para 2)

;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
rota    equ     0fh             ;variable para desplazamiento de display
trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
dig1    equ     10h             ;acumulador miles
dig2    equ     11h             ;acumulador centenas
dig3    equ     12h             ;acumulador decenas
dig4    equ     13h             ;acumulador unidades
loops   equ     1dh             ;variables usadas en retardos
loops2  equ     1eh
z       equ     02h             ;flag de cero
ram     equ     05h             ;bit de seleccion de pagina de memoria
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo

reset   org     00
        goto    inicio
        org     05h

retardo                         ;subrutina de retardo
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   d'110'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2          ;controla si termina 1mS
        goto    top
        decfsz  loops           ;controla si termina el retardo completo
        goto    top2
        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            ;incrementa las centenas
        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
        movlw   d'250'          ;retardo de 100ms
        call    retardo
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1
        retlw   b'01110110'     ;genera el 2
        retlw   b'01111100'     ;genera el 3
        retlw   b'01011001'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01101111'     ;genera el 6
        retlw   b'00111000'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01111101'     ;genera el 9

inicio                          ;programa principal
        bsf     status, ram     ;selecciona el banco de memoria alto
        movlw   b'00010000'     ;configura el puerto a
        movwf   trisa           ;bit 4 entrada, demas bits salidas.
        movlw   00h             ;configura el puerto b
        movwf   trisb           ;como salidas
        bcf     status, ram     ;selecciona el banco de memoria bajo
        clrf    dig1            ;inicializa acumuladores
        clrf    dig2
        clrf    dig3
        clrf    dig4
        movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays

empe    btfss   ptoa, 4         ;chequea el pulsador
        call    subir           ;llama la rutina de incremento
        movlw   08h             ;iniciar un 1 en el registro de rotacion
        movwf   rota           
        movlw   dig1            ;con el registro selector (fsr) se apunta
        movwf   fsr             ;al primer dato que se va a mostrar
disp    movlw   00h             ;colocar en cero el dato del display
        movwf   ptob            ;para apagarlos
        movf    rota, w         ;pasa rotacion del 1 a la variable work
        movwf   ptoa            ;enciende el transistor (display)
        movf    indo, w         ;lee el dato del registro apuntado por fsr
        call    tabla           ;genera el digito de 7 segmentos
        movwf   ptob            ;envia el digito al puerto b
        movlw   03h             ;retardo de 3ms para visualizacion
        call    retardo
        btfsc   rota, 0         ;controla si terminaron las cuatro rotaciones
        goto    empe            ;si termino, vuelve desde el comienzo
        bcf     status, c       ;carry en cero para no afectar las rotaciones
        rrf     rota            ;desplaza el 1 que enciende los displays
        incf    fsr             ;incrementa el puntero. Apunta el proximo
        goto    disp            ;digito a mostrar

        end



 y he hecho una modificacion para los antirebotes (( q es para q cuando mantenga pulsado el boton solo cuente un digito))

LIST P=16f84

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
rota    equ     0fh             ;variable para desplazamiento de display
trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
dig3    equ     12h             ;acumulador decenas
dig4    equ     13h             ;acumulador unidades
loops   equ     1dh             ;variables usadas en retardos
loops2  equ     1eh
z       equ     02h             ;flag de cero
ram     equ     05h             ;bit de seleccion de pagina de memoria
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo
Mm   equ   0x0c

reset   org     00
        goto    inicio
        org     05h

retardo                         ;subrutina de retardo
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   d'110'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2          ;controla si termina 1mS
        goto    top
        decfsz  loops           ;controla si termina el retardo completo
        goto    top2
        retlw   0

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
        clrf   dig3            ;incrementa las centenas
        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
        movlw   d'250'          ;retardo de 100ms
        call    retardo
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1
        retlw   b'01110110'     ;genera el 2
        retlw   b'01111100'     ;genera el 3
        retlw   b'01011001'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01101111'     ;genera el 6
        retlw   b'00111000'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01111101'     ;genera el 9

inicio                          ;programa principal
        bsf     status, ram     ;selecciona el banco de memoria alto
        movlw   b'00010000'     ;configura el puerto a
        movwf   trisa           ;bit 4 entrada, demas bits salidas.
        movlw   00h             ;configura el puerto b
        movwf   trisb           ;como salidas
        bcf     status, ram     ;selecciona el banco de memoria bajo
        bsf   Mm,4
   bcf   ptoa,2
   bcf   ptoa,3
   clrf    dig3
        clrf    dig4
        movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays

       
empe    btfsc   ptoa,4         
     goto   cambiar_Mm
   btfsc   Mm,4
   goto   cuenta   
   goto   mov_rota

cuenta   call   subir
   bcf   Mm,4
   goto   mov_rota

cambiar_Mm   btfsc   Mm,4
      goto   mov_rota
      bsf   Mm,4
      goto   mov_rota

mov_rota   movlw   0x08   
           movwf   rota           
           movlw   dig3            ;con el registro selector (fsr) se apunta
           movwf   fsr             ;al primer dato que se va a mostrar

disp       movlw   00h             ;colocar en cero el dato del display
           movwf   ptob            ;para apagarlos
           movf    rota, w         ;pasa rotacion del 1 a la variable work
           movwf   ptoa            ;enciende el transistor (display)
           movf    indo, w         ;lee el dato del registro apuntado por fsr
           call    tabla           ;genera el digito de 7 segmentos
           movwf   ptob            ;envia el digito al puerto b
           movlw   03h             ;retardo de 3ms para visualizacion
           call    retardo
           btfsc   rota, 0         ;controla si terminaron las cuatro rotaciones
           goto    empe            ;si termino, vuelve desde el comienzo
           bcf     status, c       ;carry en cero para no afectar las rotaciones
           rrf     rota            ;desplaza el 1 que enciende los displays
           incf    fsr             ;incrementa el puntero. Apunta el proximo
           goto    disp            ;digito a mostrar

        end


Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Re: contador 2 digitos PIC
« Respuesta #4 en: 15 de Junio de 2006, 17:12:22 »
Hola, soy novato en esto, y la verdad que no me he leido todo tu programa, pero lo que veo mal es ésto:

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1

deberías poner addwf  pc,1 para guardarlo en el mismo registro, y así poder direccionar el registro al lugar adecuado.
Gracias y saludos.

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #5 en: 15 de Junio de 2006, 17:46:29 »
muchas gracias pero sige sin funcionar q :( madre mia...... no voy a poder presentarlo mñn.

si no es mucho pedir nadie sabe hacer un contador con 2 digitos, tienen dos transistores, para q se enciendan los displays,
 las patillas 1 y 2 son los transistores y la 3 es el pulsador , 4 es el reset y las patillas 11 10 9 8 7 6 12 son los segmentos del display.....


MUCHAS GRACIAS
« Última modificación: 15 de Junio de 2006, 17:50:48 por FrankPI »

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: contador 2 digitos PIC
« Respuesta #6 en: 15 de Junio de 2006, 17:55:59 »
Compañero el que has subido anteriormente es el programa completo?
¡¡¡Viva México cabrones!!!

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: contador 2 digitos PIC
« Respuesta #7 en: 15 de Junio de 2006, 18:01:00 »
bueno prueva este contador  para ver como te va. 

PROGRAMA DE CONTEO REGRESIVO DEL 99 HASTA 0

display de anodo comun
2 transistores 3904
colectares uno a cada  comun de display
Emisor a 5vdc
base a salida del puertoa
SI NO TE MULTIPLEZA VARIA EL RETARDO HASTA QUE TE VEA BIEN.

suerte """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""";;;;;;;
   LIST P=16F84A
      #INCLUDE<P16F84A.INC>

REG1   EQU   23
REG2   EQU   24
REG3   EQU   25
decenas   EQU   20
unidad   equ   21
   
   org   00

        goto    inicio
     
penate   ADDWF   PCL,1
      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'10011000'   9
      return



   


inicio   bsf   status,5
   movlw   b'000000'   ;para transistores
   movwf   porta
   clrf      portb
   bcf      status,5
   clrf      portb

coveñas

      movlw   .9
      movwf   decenas
fer      movlw   .9
      movwf   unidad
      call      ben
since      decfsz   unidad,1
      goto      sanmarc
      call          ben
             decf       decenas,1
      movf      decenas,0
      xorwf      .1,0
      btfss      status,2
      goto      fer
      clrf      decenas
      movlw   .9
      movwf   unidad
er      decfsz   unidad,1
      goto          etris     
      goto      coveñas
etris      call      ben
      goto      er
sanmarc    call      benito   
      goto      since   

ben   movf      unidad,0
      call      penate
      bcf      porta,2
      movwf   portb
      call      retardo
      bsf      porta,2
              movf      decenas,0
      call      penate
      bcf      porta,3
      movwf   portb
      call      retardo
      bsf      porta,3
      return

retardo   MOVLW   .9
   MOVWF   REG1
DEC3   MOVLW   .9
      MOVWF   REG2
DEC2   MOVLW   .5
      MOVWF   REG3
DEC1   DECFSZ   REG3,1
      GOTO   DEC1
      DECFSZ   REG2,1
      GOTO   DEC2
      DECFSZ   REG1,1
      GOTO   DEC3
      RETURN
      end

BUENO SIMULAR HABER SI
 
 
 
 

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #8 en: 15 de Junio de 2006, 18:08:28 »
si q es el programa completo pero nose porque no funciona, los transistores son 546B, pasara algo???? weno muchas gracias por todo, espero q salga bien.....


Microcom te pediria un favor podrias agregarme a fagoro18@hotmail.com, despues si queires me borras pero me gustaria que me ayudaras muchas gracias a todos!!

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #9 en: 15 de Junio de 2006, 18:21:53 »
mis displays son SC03-12HWA, creo q son de catodo comun, q hago para modificarlo en el programa??? muchas gracias a rtodos

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: contador 2 digitos PIC
« Respuesta #10 en: 15 de Junio de 2006, 18:59:26 »
loa emisores ban a tierra
los colectores ban los comunes del display
los segmentos ban al puertoB como dice la tabla.
para activar los transistores cambiar bcf por bsf y  quedaria =   bsf   porta,2   bsf porta,3
y despues tienes que desactivarlos con bcf porta,2   y bcf porta,3


peñate         ;siete segmentos display CATODO comun.
   ADDWF   PCL,1
   RETLW   B'00111111'   ;0      prende  segmentos fedcba   
   RETLW   B'00000110'   ;1   prende  segmentos cb   
   RETLW   B'01011011'   ;2   prende  segmentos gedba
   RETLW   B'01001111'   ;3   prende  segmentos gdcba
   RETLW   B'01100110'   ;4   prende  segmentos gfcb
   RETLW   B'01101101'   ;5   prende  segmentos gfdca
   RETLW   B'01111101'   ;6   ......
   RETLW   B'00000111'   ;7   ............
   RETLW   B'01111111'   ;7   ..................
   RETLW   B'01100111'   ;9   .......................

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: contador 2 digitos PIC
« Respuesta #11 en: 15 de Junio de 2006, 19:14:53 »
bueno prueva este contador  para ver como te va. 

PROGRAMA DE CONTEO REGRESIVO DEL 99 HASTA 0

display de catodo comun
2 transistores 3904 NPN       el transistor debe ser  npn
colectares uno a cada  comun de display
Emisor a tierra
la base del transistor va  a salida del puertoa
SI NO TE MULTIPLEZA VARIA EL RETARDO HASTA QUE TE VEA BIEN.

suerte """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""";;;;;;;
   LIST P=16F84A
      #INCLUDE<P16F84A.INC>

REG1   EQU   23
REG2   EQU   24
REG3   EQU   25
decenas   EQU   20
unidad   equ   21
   
   org   00

        goto    inicio
     
peñate         ;siete segmentos display CATODO comun.
   ADDWF   PCL,1
   RETLW   B'00111111'   ;0      prende  segmentos fedcba   
   RETLW   B'00000110'   ;1   prende  segmentos cb   
   RETLW   B'01011011'   ;2   prende  segmentos gedba
   RETLW   B'01001111'   ;3   prende  segmentos gdcba
   RETLW   B'01100110'   ;4   prende  segmentos gfcb
   RETLW   B'01101101'   ;5   prende  segmentos gfdca
   RETLW   B'01111101'   ;6   ......
   RETLW   B'00000111'   ;7   ............
   RETLW   B'01111111'   ;7   ..................
   RETLW   B'01100111'   ;9   .......................


   


inicio   bsf   status,5
   movlw   b'000000'   ;para transistores
   movwf   porta
   clrf      portb
   bcf      status,5
   clrf      portb

coveñas

      movlw   .9
      movwf   decenas
fer      movlw   .9
      movwf   unidad
      call      ben
since      decfsz   unidad,1
      goto      sanmarc
      call          ben
             decf       decenas,1
      movf      decenas,0
      xorwf      .1,0
      btfss      status,2
      goto      fer
      clrf      decenas
      movlw   .9
      movwf   unidad
er      decfsz   unidad,1
      goto          etris     
      goto      coveñas
etris      call      ben
      goto      er
sanmarc    call      benito   
      goto      since   

ben   movf      unidad,0
      call      penate
      movwf   portb
      bsf      porta,2          ;transistor de unidad
      bcf      porta,3
      call      retardo
      movf      decenas,0
      call      penate
     movwf   portb
     bsf      porta,3         ;transistor de decenas
      bcf     porta,2
      call      retardo
       bcf     porta,3
       bcf     porta,2
clrf    portb

      return

retardo   MOVLW   .9
   MOVWF   REG1
DEC3   MOVLW   .9
      MOVWF   REG2
DEC2   MOVLW   .5
      MOVWF   REG3
DEC1   DECFSZ   REG3,1
      GOTO   DEC1
      DECFSZ   REG2,1
      GOTO   DEC2
      DECFSZ   REG1,1
      GOTO   DEC3
      RETURN
      end

BUENO SIMULAR HABER SI
 

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #12 en: 16 de Junio de 2006, 07:09:59 »
no tira, muchas gracias

si no fuera mucho pedir, como cn 2 transistores nofunciona a ver si podeis ayudar solo cn uno q cuente del 0-9 y ya esta, asi no seria tan jaleoso.... muchas gracia!!!!

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: contador 2 digitos PIC
« Respuesta #13 en: 16 de Junio de 2006, 17:01:23 »
Este es un contador de 0 a 9 incrementa con un pulso por RA0 la salida es por el puertob . bebes dejar de presionar el pulsador y luego presionar de nuevo  para que siga incrementando. incrementa de uno en uno.
;no necesita decodificador display de cátodo

es.........................................................*

   list    p=16f84A
           include"p16f84A.INC"

con1      equ   0x0c
con2      equ   0x0d
con3      equ   0x0e
unidades   equ   0x0f
temp      equ   0x11
porta      equ   0x05
portb      equ   0x06
status      equ   0x03
pcl      equ   0x02     
intcon      equ   0x0b
z      equ   0x02
trisa      equ   85h
trisb      equ   86h
   

      org   0
      goto   inicio
      org   5

retardo      movlw   .1      ;30
      movwf   con3
c_con2      movlw   .1      ;100
      movwf   con2
repeat      decfsz   con2,f
      goto   repeat
      decfsz   con3,f
      goto   c_con2   
      return         ;termino subrutina de retardo

           

tabla    addwf   pcl,f
      retlw   b'00111111';0
      retlw   b'00000110';1
      retlw   b'01011011';2
      retlw   b'01001111';3
.      retlw   b'01100110';4
      retlw   b'01101101';5
      retlw   b'01111100';6
      retlw   b'00000111';7
      retlw   b'01111111';8
      retlw   b'01100111';9

visu      movf   unidades,w
      call   tabla
      movwf   portb
      call   retardo
return

inicio      bsf   status,5
      movlw   0x01        ;ra0  pulsador
      movwf   porta
      movlw   b'00000000'   portb     salida para segmentos del display
      movwf   portb   
      bcf   status,5   
      clrf   unidades
   
   
ciclo      call   visu
      btfss   porta,0
      goto   ciclo         ;comprobación de pulsador
      call   retardo   ;antirrebote
      btfss   porta,0
      goto   ciclo

           
      incf   unidades,1
      movlw   .10
      xorwf   unidades,w
      btfss   status,z
      goto   soltar
      clrf   unidades

soltar      call   visu
      btfsc   porta,0
      goto   soltar
      call   retardo
      btfsc   porta,0
      goto   soltar
      goto   ciclo

      end

Desconectado FrankPI

  • PIC10
  • *
  • Mensajes: 7
Re: contador 2 digitos PIC
« Respuesta #14 en: 17 de Junio de 2006, 08:28:36 »
hola ya tngo el programa q funciona 100% lo unico q pasa q mi placa, es de 2 transistores, y no se q tngo q quitar.....
el prgorama es para 4 transistores y yo solo quiero cojer 2.... pero no se q elegir y q quitarr del programa asi q si alguien puede ayudarme.... muchas gracias... ( patillas de salida la numero 2 y 1)


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
rota    equ     0fh             ;variable para desplazamiento de display
trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
dig1    equ     10h             ;acumulador miles
dig2    equ     11h             ;acumulador centenas
dig3    equ     12h             ;acumulador decenas
dig4    equ     13h             ;acumulador unidades
loops   equ     1dh             ;variables usadas en retardos
loops2  equ     1eh
z       equ     02h             ;flag de cero
ram     equ     05h             ;bit de seleccion de pagina de memoria
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo

reset   org     00
        goto    inicio
        org     05h

retardo                         ;subrutina de retardo
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   d'110'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2          ;controla si termina 1mS
        goto    top
        decfsz  loops           ;controla si termina el retardo completo
        goto    top2
        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            ;incrementa las centenas
        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
        movlw   d'250'          ;retardo de 100ms
        call    retardo
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1
        retlw   b'01110110'     ;genera el 2
        retlw   b'01111100'     ;genera el 3
        retlw   b'01011001'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01101111'     ;genera el 6
        retlw   b'00111000'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01111101'     ;genera el 9

inicio                          ;programa principal
        bsf     status, ram     ;selecciona el banco de memoria alto
        movlw   b'00010000'     ;configura el puerto a
        movwf   trisa           ;bit 4 entrada, demas bits salidas.
        movlw   00h             ;configura el puerto b
        movwf   trisb           ;como salidas
        bcf     status, ram     ;selecciona el banco de memoria bajo
        clrf    dig1            ;inicializa acumuladores
        clrf    dig2
        clrf    dig3
        clrf    dig4
        movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays

empe    btfss   ptoa, 4         ;chequea el pulsador
        call    subir           ;llama la rutina de incremento
        movlw   08h             ;iniciar un 1 en el registro de rotacion
        movwf   rota           
        movlw   dig1            ;con el registro selector (fsr) se apunta
        movwf   fsr             ;al primer dato que se va a mostrar
disp    movlw   00h             ;colocar en cero el dato del display
        movwf   ptob            ;para apagarlos
        movf    rota, w         ;pasa rotacion del 1 a la variable work
        movwf   ptoa            ;enciende el transistor (display)
        movf    indo, w         ;lee el dato del registro apuntado por fsr
        call    tabla           ;genera el digito de 7 segmentos
        movwf   ptob            ;envia el digito al puerto b
        movlw   03h             ;retardo de 3ms para visualizacion
        call    retardo
        btfsc   rota, 0         ;controla si terminaron las cuatro rotaciones
        goto    empe            ;si termino, vuelve desde el comienzo
        bcf     status, c       ;carry en cero para no afectar las rotaciones
        rrf     rota            ;desplaza el 1 que enciende los displays
        incf    fsr             ;incrementa el puntero. Apunta el proximo
        goto    disp            ;digito a mostrar

        end


 

anything