Pic16f84a contador de 00 a 99

lo que pasa es que quiero aser un contador de 00 a 99 pero no me sale me guie en una practica que ya habia echo de 0 a 9 pero no me funciona este es mi programa espero y alguien me pueda ayudar thanks
 

Adjuntos

  • PRACTICA 26.txt
    2.5 KB · Visitas: 89
lo que pasa es que quiero hacer un contador de 00 a 99 pero no me sale me guie en una practica que ya habia hecho de 0 a 9 pero no me funciona este es mi programa espero y alguien me pueda ayudar thanks
Saludos.
Mira este ejemplo que adjunto.
Te puede servir como referencia para ese tipo de programas.

Suerte.
 

Adjuntos

  • Contador 0-999.rar
    18.2 KB · Visitas: 201
Hola amigos del foro, tengo un problema, estoy realizando un contador automático del 0 al 999 y cuando simulo en proteus parpadea los displays, pero si incrementa y no entiendo cual es problema.
Por favor ayúdenme, necesito terminarlo.
Muchas gracias.
Acá les dejo el programa.

Código:
list p=16F628A
        #include P16F628A.inc
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON  &_INTOSC_OSC_NOCLKOUT& _MCLRE_OFF & _LVP_OFF
;**** Definicion de variables ****
    CBLOCK    0X20
    Unidad      ;Guardamos conteo unidad
    Decena      ;Guardamos conteo DECENA
    Centena      ;Guardamos conteo CENTENA
    Contador1 ;Registro utilizado en demora.-
    Contador2 ;Registro utilizado en demora.-
    Contador     ;registro contador
    ENDC     ; 
#DEFINE    VNIDADES     PORTA,2
#DEFINE    DECENAS    PORTA,1
#DEFINE    CENTENAS    PORTA,0
;**** Inicio del Micro ****
    org     0x00 ; Aquí comienza el micro.-     
    goto    Inicio
;**** Tabla de conversion BCD a 7 Segmentos ****
BCD7SEG 
    addwf PCL,1 ; Se incrementa el contador del programa.-
    DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
 
;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio
    bsf     STATUS,RP0     ; Pasamos de Banco 0 a Banco 1.-
    clrf     TRISA         ; PORTA como salida
    clrf     TRISB         ; PORTB como salida.-
    bcf     STATUS,RP0    ; Paso del Banco 1 al Banco 0
    movlw    07h        ;pines digitales
    movwf    CMCON        ;
    clrf     PORTA         ; Desactivo todos los Displays
    clrf     Unidad         ; Comienza en cero --> 0 0 0.-
    clrf     Decena    
    clrf     Centena
    goto     Actualizo_Display ; Esta rutina multiplexa los displays.-
;**** Testeo de Pulsador ****
Bucle
    incf     Unidad,1         ; Incremeto Unidad.
    movlw     d\'10\'         ; Si es 10 reseteo e incremento Decena
    subwf     Unidad,0 ;
    btfss     STATUS,Z ;
    goto     Actualizo_Display     ; no es 10
    clrf     Unidad         ; Si, reseteo.-
    incf     Decena,1        ; Incremento Decena.-
    movlw     d\'10\'         ; Si Decena = 10, reseteo e incremento Centena
    subwf     Decena,0 
    btfss     STATUS,Z 
    goto     Actualizo_Display     ; No es 10.-
    clrf     Decena         ; Si, reseteo.-
    incf     Centena,1     ; Incremento Centena.-
    movlw     d\'10\'         ; Si es 10 Reseteo.-
    subwf     Centena,0
    btfss     STATUS,Z
    goto     Actualizo_Display     ; No es 10.-
    clrf     Centena         ; Si, reseto
;**** Se multiplexan los Display ****
Actualizo_Display
    movlw     d\'10\'         ; Cargo Contador = 20
    movwf     Contador         ; Para repeticiones de visualizacion del mismo valor
Refresco
    movf     Unidad,W         ;Obtengo codigo de 7 Segmentos para Unidad.-
    call     BCD7SEG         ;
    movwf     PORTB        ;y se mvestra por el PVERTOB
    bsf      VNIDADES         ;  prendemos vnidades
    call     Demora_5ms    ; 

    movf     Decena,W         ;
    call     BCD7SEG        ;Obtengo codigo de 7 Segmentos para DECENAS.-
    movwf     PORTB         ; y se mvestra por el PVERTOB
    bsf     DECENAS         ;prendemos dencas
    bcf     VNIDADES         ; Apago Display de Unidad.-
    call     Demora_5ms

    movf    Centena,W         ; 
    call     BCD7SEG        ;Obtengo codigo de 7 Segmentos para Centena.
    movwf    PORTB         ;y se mvestra por el PVERTOB 
    bcf     DECENAS        ;apagamos decenas
    bsf     CENTENAS         ;prendemos centenas 
    call     Demora_5ms    ;tiempo
    decfsz    Contador,1    ;decrementamos contador para k se repita el nvmero
    goto    Refresco        ; no es 0,por lo tanto sigve el ciclo
    goto     Bucle        ;si es 0 sigve incrementado
;**** Demora ****
Demora_5ms
    movlw 0xFF ;
    movwf Contador1         ; Iniciamos contador1.-
Repeticion1
    movlw 0x05 ;
    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.-
 
    end
 
Última edición por un moderador:
Hola Josemendoza, te comento que en tu programa existen dos errores.
1) Utilizas una tabla (para los displays) que es para cátodo común, pero lo tratas como si fuera ánodo común.
2) Normalmente cuando multiplexas Displays primero mandas el dato por el puerto, luego "enciendes" el segmento, se hace un retardo y "apagas el segmento".
Código:
    list p=16F628A
    #include P16F628A.inc
;__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON  &_INTOSC_OSC_NOCLKOUT& _MCLRE_OFF & _LVP_OFF
__CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
;***********************************************************************
;Definicion de variables
;***********************************************************************
CBLOCK    0X20
Unidad      ;Guardamos conteo unidad
Decena      ;Guardamos conteo DECENA
Centena      ;Guardamos conteo CENTENA
Contador1       ;Registro utilizado en demora.-
Contador2       ;Registro utilizado en demora.-
Contador     ;registro contador
ENDC
#DEFINE    VNIDADES     PORTA,2
#DEFINE    DECENAS     PORTA,1
#DEFINE    CENTENAS    PORTA,0
;***********************************************************************
;Inicio del Micro
;***********************************************************************
    org     0x00 ; Aquí comienza el micro.-
    goto    Inicio
;***********************************************************************
;Tabla de conversion BCD a 7 Segmentos
;***********************************************************************
BCD7SEG
    addwf PCL,1 ; Se incrementa el contador del programa.-
    DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
;***********************************************************************
;Programa principal
;Configuracion de puertos
;***********************************************************************
Inicio
    bsf     STATUS,RP0     ; Pasamos de Banco 0 a Banco 1.-
    clrf     TRISA         ; PORTA como salida
    clrf     TRISB         ; PORTB como salida.-
    bcf     STATUS,RP0    ; Paso del Banco 1 al Banco 0
    movlw    0x07        ;pines digitales
    movwf    CMCON        ;
    clrf     PORTA         ; Desactivo todos los Displays
    clrf     Unidad         ; Comienza en cero --> 0 0 0.-
    clrf     Decena
    clrf     Centena
    goto     Actualizo_Display ; Esta rutina multiplexa los displays.-
;**** Testeo de Pulsador ****
Bucle
    incf     Unidad,1         ; Incremeto Unidad.
    movlw     .10         ; Si es 10 reseteo e incremento Decena
    subwf     Unidad,0 ;
    btfss     STATUS,Z ;
    goto     Actualizo_Display     ; no es 10
    clrf     Unidad         ; Si, reseteo.-
    incf     Decena,1        ; Incremento Decena.-
    movlw     .10         ; Si Decena = 10, reseteo e incremento Centena
    subwf     Decena,0
    btfss     STATUS,Z
    goto     Actualizo_Display     ; No es 10.-
    clrf     Decena         ; Si, reseteo.-
    incf     Centena,1     ; Incremento Centena.-
    movlw    .10         ; Si es 10 Reseteo.-
    subwf    Centena,0
    btfss    STATUS,Z
    goto     Actualizo_Display     ; No es 10.-
    clrf     Centena         ; Si, reseto
;**** Se multiplexan los Display ****
Actualizo_Display
    movlw     .10             ; Cargo Contador = 20
    movwf     Contador        ; Para repeticiones de visualizacion del mismo valor
Refresco
    movf     Unidad,W         ;Obtengo codigo de 7 Segmentos para Unidad.-
    call     BCD7SEG         ;
    movwf     PORTB           ;y se mvestra por el PVERTOB
    bcf      VNIDADES         ;  prendemos vnidades
    call     Demora_5ms      ;
    bsf     VNIDADES

    movf     Decena,W        ;
    call     BCD7SEG         ;Obtengo codigo de 7 Segmentos para DECENAS.-
    movwf     PORTB           ; y se mvestra por el PVERTOB
    bcf     DECENAS         ;prendemos dencas
    call     Demora_5ms
    bsf     DECENAS

    movf    Centena,W         ;
    call     BCD7SEG         ;Obtengo codigo de 7 Segmentos para Centena.
    movwf    PORTB           ;y se mvestra por el PVERTOB
    bcf     CENTENAS         ;prendemos centenas
    call     Demora_5ms      ;tiempo
    bsf     CENTENAS

    decfsz    Contador,1      ;decrementamos contador para k se repita el nvmero
    goto    Refresco        ; no es 0,por lo tanto sigve el ciclo
    goto     Bucle        ;si es 0 sigve incrementado
;***********************************************************************
;Demora
;***********************************************************************
Demora_5ms
    movlw 0xFF ;
    movwf Contador1         ; Iniciamos contador1.-
Repeticion1
    movlw 0x05 ;
    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.-
;**********************************************************************
    end
 

Adjuntos

  • Dibujo.JPG
    Dibujo.JPG
    54.9 KB · Visitas: 53
Buenas tardes, estoy realizando un contador para una materia de la facu y me da un error en la librería stdlib, quisiera que me ayuden. Muchas gracias y un saludo, les adjunto el código y el mensaje de error del mismo. Lo que debe hacer dicho contador es, contar del 0 al 9, volver de 9 a 0 y luego generar 9 números aleatorios.

Codigo:
Código:
//////////////////////////////////////////////////////////////////////
//                       NOMBRE DEL PIC                             //
//////////////////////////////////////////////////////////////////////
#include <16f84a.h>
#include <stdlib.h>  //Libreria que contiene la funcion random
#RAND_MAX 9 // Numero máximo al que llegara random
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES XT              // Oscilador de Cristal
#FUSES NOPUT           // No Tiempo de espera de Encendido
#FUSES NOPROTECT       // No proteger el codigo
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=4000000)     // Frecuencia de 4Mhz
#BYTE PORTB = 0x06    // Configuramos el PORTB
#use fast_io(A)      //Configuracion para optimizar código
#use fast_io(B)

void main(){
   set_tris_a(0x02);
   set_tris_b(0x00);
   int Numero[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
   int i=0;
   while(1)
   {
      for(i=0; i<10; i++)
      {
         PORTB = Numero[i];
         delay_ms(100);
      }
      for (i=10; i>0; i--)
      {
         PORTB = Numero[i];
         delay_ms(100);
      }
      
      for(i=0; i<10; i++)
      {
         PORTB = Numero[rand()];
         delay_ms(100);
      }
   }
}

Mensaje de Error:

P.D.: Les agradezco la ayuda y disculpe las molestias
 

Adjuntos

  • errpr.png
    errpr.png
    2.3 KB · Visitas: 24
Buenas tardes, esa parte del código funciona, la que no es :
Código:
#RAND_MAX 9 // Numero máximo al que llegara random
Pero si omito esa parte no me generaría números del 0 al 9, sino que los números que trae por defecto, ¿como haría para que me genere números de 0 a 9 en tal caso?
 
A ver... por partes.

Si no ponemos el define del RAND_MAX, el valor que tomará rand() como límite de generación será el que indique la biblioteca stdlib.h. En mi máquina Linux, por ejemplo, es 2^31-1 = 2 147 483 647.

Lo que podemos hacer es una función que genere un valor al azar a partir de esa cifra (no probado):
PHP:
int aleatorio(int limite) {
    return rand() % limite; // devuelve un valor entre 0 y limite-1
}
Hay más formas...

En cambio, si pones un nuevo valor de RAND_MAX, entonces solo tienes que llamar a rand() para generar un valor entre 0 y RAND_MAX.
 
Atrás
Arriba