Autor Tema: contador ascendente de 0 a 99 con pic16f1937  (Leído 1826 veces)

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

Desconectado jjserna

  • PIC10
  • *
  • Mensajes: 2
contador ascendente de 0 a 99 con pic16f1937
« en: 25 de Febrero de 2018, 02:55:32 »
cordial saludo estoy programando un contador de 0 a 99 con display de 7seg , pero no se como hacer el ciclo para que este lo realice

este es el código, necesito orientacion por favor  Gracias

#INCLUDE <16f1937.h>
#fuses INTRC_IO,NOWDT,PUT,MCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOCLKOUT
#fuses NOIESO,NOFCMEN,NOWRT,NOVCAP,NOSTVREN,NODEBUG,NOLVP
#use delay(internal,clock=4000000)
#USE  RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
//Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
 Byte CONST display_a[10]= {0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0};
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 porta,0

//////////////////////////////
/// definición de variables
//////////////////////////////
int8 n,pulsos,i, j,k=0;

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////
void mostrar(int8 pulsos)
      {
       int8 unidades,decenas;
       decenas=pulsos/10;
       unidades=pulsos%10;
       portc=display_a[decenas];
       bit_set(AN0);
       bit_clear(AN1);
       delay_ms(1);
       portc=display_a[unidades];
       bit_clear(AN0);
       bit_set(AN1);
       delay_ms(1);
      }
   void main ()
   {
      ////////////////////////////////
      // configuracion de fusibles
      ////////////////////////////////
      setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF); // Apagar el PLL
      setup_adc_ports(NO_ANALOGS);              // Puertos digitales
     
      //////////////////////////////////
      /// Configuración de puertos
      //////////////////////////////////
      TRISA = 0B00000001; //RA0 Entrada, los demás como salida
      TRISB = 0B11111111; // Puerto B como entrada
      TRISC = 0B10000000; // Puerto C como Salida
      TRISD = 0B00000000; // Puerto D como Salida
      TRISE = 0B00000000; // Puerto E como Salida
     
      //////////////////////////////////////// 
      // Inicialización de puertos
      ///////////////////////////////////// 
      PORTE = 0;
      PORTA = 0;
      PORTC = 0;
      /////////////////////////
      // Bucle infinito
      /////////////////////////
      while (true)
      {
       pulsos=0;
       mostrar(pulsos);
       
       
        }
   
          }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:contador ascendente de 0 a 99 con pic16f1937
« Respuesta #1 en: 25 de Febrero de 2018, 11:39:09 »
Vamos a hacer un paso a paso, y tal ves esto te ayude.

Tenemos el Loop While, que se ejecuta siempre. Dentro del Loop debemos:

- Encender los displays (suponete cada 20ms)
- Aumentar la cuenta  ( cada 0.5s)

El problema viene cuando tenemos varios tiempos como los que acabo de nombrar. Si ponemos un delay de 500ms los displays tendrian un momento con 520ms apagado o encendido dependiendo de como se dejen. Entonces deberiamos pensar en otra forma de hacerlo. Lo mejor es poner solo 1 delay en este caso. y que sea el de 20ms... Entonces como sabemos cuando aumentar la cuenta?,
Utilizamos un contador, cuando paso 25 veces por el delay de 20ms (o se repita 25 veces el loop del while), quiere decir que pasaron 500ms, y es alli donde actuamos.
Entonces el codigo seria algo asi:

Código: [Seleccionar]
int contador = 0;
int pulsos;

void main(void)
{
   // Aca configuracion inical

   // Condicion inicial
   pulsos = 0;
   // Apago todos los digitos

   while(1)
   {
       Mostrar_Display();
       Aumentar_variable();
       delay_ms(20);
   }
}


Donde Mostrar_Display sea:

Código: [Seleccionar]
  Esta encendido la unidad? (usar algun int1 para indicarlo)
  Si->
       Apago unidad
       Envio Decena al puerto
       Enciendo Decena
  No->
       Apago Decena
       Envio Unidad al puerto
       Enciendo Unidad

Si observas al mostrar, no calculo el valor ni nada mas, la funcion de mostrar unicamente MUESTRA sobre el display.
Y Aumentar_variable seria:

Código: [Seleccionar]
    contador = contador + 1
    Contador mayor o igual a 25 ?
    Si ->
           contador = 0
           pulsos = pulso + 1
           calculo unidad
           calculo decena

Y ahi estariamos con el programa, si quisiera que aumente cada 1 segundo entonces deberia contar 1000ms/20ms = 50 veces y no 25.
Cambiar el delay tambien afectaria a la cuetna, si lo bajas a 10ms, entonces para 0.5s serian 50 veces y para 1s serian 100

Desconectado jjserna

  • PIC10
  • *
  • Mensajes: 2
Re:contador ascendente de 0 a 99 con pic16f1937
« Respuesta #2 en: 25 de Febrero de 2018, 17:49:41 »
// estee s el programa solo que no se como hacer el ciclo para que me muestre los numeros del 0 al 99 , seria un ciclo for ? pero no se com realizarlo soy nuevo programando
gracias de antemano

#INCLUDE <16f1937.h>
#fuses INTRC_IO,NOWDT,PUT,MCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOCLKOUT
#fuses NOIESO,NOFCMEN,NOWRT,NOVCAP,NOSTVREN,NODEBUG,NOLVP
#use delay(internal,clock=4000000)
#USE  RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
//Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
 Byte CONST display_a[10]= {0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0};
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE   = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 porta,0

//////////////////////////////
/// definición de variables
//////////////////////////////
int8 n,pulsos,i, j,k=0;

///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////
void mostrar(int8 pulsos)
      {
       int8 unidades,decenas;
       decenas=pulsos/10;
       unidades=pulsos%10;
       portc=display_a[decenas];
       bit_set(AN0);
       bit_clear(AN1);
       delay_ms(1);
       portc=display_a[unidades];
       bit_clear(AN0);
       bit_set(AN1);
       delay_ms(1);
      }
   void main ()
   {
      ////////////////////////////////
      // configuracion de fusibles
      ////////////////////////////////
      setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF); // Apagar el PLL
      setup_adc_ports(NO_ANALOGS);              // Puertos digitales
     
      //////////////////////////////////
      /// Configuración de puertos
      //////////////////////////////////
      TRISA = 0B00000001; //RA0 Entrada, los demás como salida
      TRISB = 0B11111111; // Puerto B como entrada
      TRISC = 0B10000000; // Puerto C como Salida
      TRISD = 0B00000000; // Puerto D como Salida
      TRISE = 0B00000000; // Puerto E como Salida
     
      //////////////////////////////////////// 
      // Inicialización de puertos
      ///////////////////////////////////// 
      PORTE = 0;
      PORTA = 0;
      PORTC = 0;
      /////////////////////////
      // Bucle infinito     /////////////////////////
      while (true)
      {
       pulsos=0;
       mostrar(pulsos);
        }
   
          }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:contador ascendente de 0 a 99 con pic16f1937
« Respuesta #3 en: 25 de Febrero de 2018, 18:16:20 »
Hola jjserna, te acabo de contestar todas tus dudas y de como resolverlas y lo único que hiciste fue copiar el programa de nuevo y pegarlo. La solución si no queres aprender es esta, reemplaza:

Código: C
  1. while (true)
  2.       {
  3.        pulsos=0;
  4.        mostrar(pulsos);
  5.         }

por:
Código: C
  1. int16 contador  = 0;
  2.       while (true)
  3.       {
  4.        if (contador == 250)
  5.        {
  6.              pulsos++;
  7.              if(pulsos > 99) pulsos = 0;
  8.        }
  9.        mostrar(pulsos);
  10.         }