Autor Tema: Contador de 0 a 99 con 4 display 7 segmentos  (Leído 7767 veces)

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

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Contador de 0 a 99 con 4 display 7 segmentos
« en: 15 de Febrero de 2016, 01:20:42 »
hola amigos  :-/

Quiero consultarles, como poder corregir un programa, el sistema consiste en programar dos contadores de 0-99 con 4 display de 7 segmentos , ejemplo:
                                              _       _                                                  _    _
CONTADOR 1_RB0==1        |_|   |_|      CONTADOR 2_RB1==1     |_| |_|                                                                         
DEL 0 AL 99                          |_|   |_|      DEL 0 AL 99                       |_| |_|
                                             D1    D2                                                 D3  D4
detalle
CONTROLO LOS SEGMENTOS
con el PORTA: usando 4 bits
CONTROLO LOS TRANSISTORES
RB4 DISPLAY 1
RB5 DISPLAY 2
RB6 DISPLAY 3
RB7 DISPLAY 4


Hasta ahora pude lograr hacer un contador con solo un pulsador y controlo solo dos Display (d1-d2), cargue el programa en la tarjeta física
y cuando la encendí me di cuenta que el programa se queda pegado mostrando 88:88, después de unos minutos comienza un parpadeo y luego
muestra : 00:00 y ahí recién tengo el control de la placa... realmente no se que pasa..por que se queda pegado..

alguien me podria ayudar a solucionar este gran problema, por favor
envio el programa.. para ver si otra forma de hacerlo mas simple o de corregir el programa



Código: C
  1. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  2.     #define display_1     PIN_B6
  3.     #define display_2     PIN_B5 // ok
  4.     #define display_3     PIN_B4
  5.     #define display_4     PIN_B7
  6.    
  7.  
  8.     int8 unidades,decenas,uni,dec;                     //Variables de conteo
  9.     void alarma(void);  
  10.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  11.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  12.     int tiempo = 20;
  13.    
  14.  
  15.    void visualiza()
  16.  {
  17.    
  18.    output_a(Numeros[decenas]);
  19.    output_b(0x53);
  20.    delay_ms(1);
  21.    output_a(Numeros[unidades]);
  22.    output_b(0xA3);
  23.    delay_ms(1);  
  24.  
  25. }
  26.  
  27. void teclas(){
  28.  
  29.   if(!input(pin_b0)){                     //Esta cerrado el pulsador?
  30.     delay_ms(5);                          //Si, elimina rebotes
  31.     unidades++;                           //incrementa unidades
  32.     if (unidades>9){                      //hasta que sea 9
  33.       unidades=0;                         //borra unidades e
  34.       decenas++;                          //incrementa las decenas
  35.         if(decenas>9){                    //hasta 9
  36.           decenas=0;                      //borra las decenas
  37.         }
  38.     }
  39.   }
  40.   while (input(pin_b0)==0){           //Espera visualizando datos
  41.   visualiza();                            //mientras la tecla esta presionada
  42.   }
  43.      
  44.      }
  45.  
  46.  
  47.  
  48. void main(void){                          //Programa principal
  49.  
  50. output_low(display_1);//RA0 y RA1 entradas
  51. output_low(display_2);
  52. output_low(display_3);
  53. output_low(display_4);
  54. disable_interrupts(GLOBAL);               //activadas interrupciones
  55. enable_interrupts(INT_RDA);   //Activa interrupción en la recepción
  56. do{                                       //bucle...
  57.      visualiza();                         //visualiza datos
  58.      teclas();
  59.      //verifica estado de teclas
  60. }while(TRUE);                             //...infinito
  61. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #1 en: 15 de Febrero de 2016, 20:59:48 »
Bueno personalmente no me gusta como lo estas realizando.. Te voy a pedir que hagas un programa ya que no uso CCS, asi queda bien esto.

- Quita la interrupcion y la USART si no la usas, como veo, no la estas usando, asi que quita el #use RS232 y quita las lineas habilitando las interrupciones cuando no tenes ninguna funcion de interrupcion definida.

Es decir, saca esto:

Código: [Seleccionar]
enable_interrupts(INT_RDA);   //Activa interrupción en la recepción
#use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)

- Crea una interrupcion de un timer ( timer0 / 1 / 2 el que tengas ) de unos 5 ms.
En la interrupcion vas a Activar un comun y poner el dato de salida, cuando llega la otra interrupcion debes activar cambiar el valor de salida y activar el otro comun, asi para los 4 displays

Los valores los vas a tomar de estas variables:

DecenaDispl1
UnidadDispl1
DecenaDispl2
UnidadDispl2

Eso es todo lo que pido que hagas. Una ves que tengas eso trae el codigo y lo demas va a ser super facil.

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #2 en: 16 de Febrero de 2016, 09:47:09 »
Aqui te presento el programa para realizar un contador automatico que cuenta de 0 a 99 , puedes modificarlo a gusto para lo que necesites , lo que si esta en xc8 para pic 16f88 , se puede alterar facilmente .

Saludos

Código: [Seleccionar]
/*
 * File:   2Segmentedisplay.c
 * Author: nahueldiaz
 *
 * Created on 9 de septiembre de 2015, 09:38
 */

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

// CONFIG1
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)

#define _XTAL_FREQ 8000000

unsigned char s,j,i ;


unsigned char display (unsigned char no){
    unsigned char patern;
    unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    patern = segment[no];
    return (patern);
}

unsigned char cnt,msb,lsb ;

void main ()
{
   
   
    ANSEL = 0x00 ;
    TRISA = 0x00 ;
    TRISB = 0x00 ;
    PORTA = 0x00 ;
    PORTB = 0x00 ;
    for(;;){
        for (cnt=0;cnt<99;cnt++){
   
        msb = cnt /10 ;
        PORTB = display(msb);
        PORTAbits.RA0 = 1 ;
        __delay_ms(50);
        PORTAbits.RA0 = 0 ;
       
        lsb = cnt % 10;
        PORTB = display(lsb);
        PORTAbits.RA1 = 1;
        __delay_ms(50);
        PORTAbits.RA1 = 0;
       
       
        __delay_ms(50);
       
   
        }}}

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #3 en: 17 de Febrero de 2016, 11:14:11 »
KILLERJC, gracias por responder , pero me enrede mas con lo que me pediste y  nahueldiaz1992, voy a ver lo que me enviaste pero nuna he programado con xc8..si que voy a veer si puedo decifrar este programa

..si es necesario hacer el programa desde 0 , igual me pueden dar opiones

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #4 en: 17 de Febrero de 2016, 12:26:30 »
Te pedi que hicieras un programa con una sola interrupcion de un Timer cada 5ms

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #5 en: 17 de Febrero de 2016, 12:50:52 »
????

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #6 en: 17 de Febrero de 2016, 13:29:12 »
Eso... era un programa simple y te enredaste xD, eran 4/5 lineas me imagino, + una funcion que es la de la interrupcion.. Pense que no me habias entendido.

La aplicacion que te paso nahuel te va a servir para mostrar los digitos y cuando trates de ponerle los botones vas a tener problemas.. por eso te dije que hicieras el programa que te dije y luego le agregabamos las cosas.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #7 en: 17 de Febrero de 2016, 14:03:47 »
killerjc, arregle el programa mira esto es lo que hice, me funciona , pero cuando deje presionado el pulsador se incrementa solo, la idea es que incremente cuando lo suelte,  y cuando pulso se incementa como de 5 de una...la idea es que sea de 1 en 1

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     //#use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B6
  15.     #define display_2     PIN_B5 // ok
  16.     #define display_3     PIN_B4
  17.     #define display_4     PIN_B7
  18.    
  19.                    //Variables de conteo
  20.     void visualiza(void);  
  21.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  22.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  23.   int unidades= 0;
  24.   int decenas = 0;
  25.   int uni  = 0;
  26.   int dece = 0;
  27.   int tiempo = 1;
  28.   void visualiza()
  29.  {
  30.    
  31.   output_low(display_4);
  32.   output_high(display_1);
  33.   output_a(Numeros[decenas]);
  34.   delay_ms(tiempo);
  35.   output_low(display_1);
  36.   output_high(display_2);
  37.   output_a(Numeros[unidades]);
  38.   delay_ms(tiempo);  
  39.   output_low(display_2);
  40.   output_high(display_3);
  41.   output_a(Numeros[dece]);
  42.   delay_ms(tiempo);
  43.   output_low(display_3);
  44.   output_high(display_4);
  45.   output_a(Numeros[uni]);
  46.   delay_ms(tiempo);  
  47.  
  48.  
  49. }
  50.  
  51.  
  52.     void main ()  
  53.  {                    
  54.  
  55.  
  56.  while (true)
  57.  {
  58.  
  59.  if(input(PIN_B0)==1)
  60.  {
  61.  
  62.   unidades++;
  63.   if(unidades>9)
  64.   {
  65.   decenas++;
  66.   unidades=0;
  67.   }
  68.   if(decenas>9)
  69.   {
  70.   decenas=0;
  71.   unidades=0;
  72.   }
  73.   }  
  74.   else
  75.    {
  76.  
  77.   visualiza();
  78.   }
  79.   if(input(PIN_B1)==1)
  80.   {
  81.   delay_ms(5);
  82.   uni++;
  83.    if(uni>9)
  84.   {
  85.   dece++;
  86.   uni=0;
  87.   }
  88.   if(dece>9)
  89.   {
  90.   dece=0;
  91.   uni=0;
  92.   }
  93.   }  
  94.   else
  95.    {
  96.   delay_ms(5);
  97.   visualiza();
  98.   }
  99.  
  100.         }              
  101.         }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #8 en: 17 de Febrero de 2016, 14:19:58 »
Me explico para que quiero el timer...

Vos en estos momentos estas intentado "mostrar" en la rutina principal. El problema es que cuando tenes botones no podes poner un while() y esperar que se suelte por que dejaria de mostrar en el display.
Yo intentaba llevar la muestra a los displays a la interrupcion del timer, es decir que la rutina de interrupcion sea la encargada de poner el valor en el puerto y activar el display que corresponde. De esa forma si vos en tu main ponias un while() esperando que se suelte el boton no afectaba a la muestra, o mejor aun, podes hacer lo que quieras en el while(true) del main, poniendo delays, etc que no va a afectar a como se muestran los valores en los displays, incluso por mas grande que sea el main.

Eso intentaba hacer.

Si queres seguir por el camino que estas siguiendo, entonces la unica solucion es que guardes el valor de los botones. Supongamos que los botones los tenes en RA0 a RA3. Entonces haces esto:

Código: C
  1. botones_ahora = input_a() & 0x0F;       // Solo dejo de RA0 a RA3
  2. if(botones_ahora != botones_previo )
  3. {
  4.         switch(botones_ahora){
  5.         case RA0:
  6.                 Sumo xx
  7.                 break;
  8.         case RA1:
  9.                 Sumo yy
  10.                 break;
  11.         case RA2:
  12.                 Sumo x, Resto y
  13.                 break;
  14.         case RA3:
  15.                 Sumo...
  16.                 break;
  17.         default:
  18.                 break; ( Se presionaron varios o ninguno )
  19.         }
  20.         botones_previo = botones_ahora;
  21.  
  22. }

Y luego mostras en el display. Los delays al mostrarlo te van a servir de anti-rebote. Pero si se excede vas a tener una respuesta un poco mas pobre de los botones. En esta aplicacion tal ves no lo notes, pero si tenes una rutina principal mucho mas grande lo vas a ver seguro. Especialmente si se agregan mas delays lo cual va a afectar tambien a la muestra en los displays.
« Última modificación: 17 de Febrero de 2016, 14:22:26 por KILLERJC »

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #9 en: 17 de Febrero de 2016, 14:56:30 »
GRAcias por los consejos, igual mi idea es hcarlo como dices tu, pero para salir del paso esto y terminando este,,,despues lo hare de formas mas ideales..es poco lo que domino el ccs estoy aprendiendo..

te mando este nueva acctualizacion, funciona mejor, pero incorpore el while en un pulsador para que confirme que se solto para mostrar los displaey...hasta ahi perfecto,,,pero lo malo es que tengo dos pulsadores y no puedo colocar while por que bloqueo al otro... me puedes ayudar con ese detallito , despues lo estudio tu otra forma que puede ser mas eficiente pero por ahora quiero salir del paso.. porfa

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     //#use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B6
  15.     #define display_2     PIN_B5 // ok
  16.     #define display_3     PIN_B4
  17.     #define display_4     PIN_B7
  18.    
  19.                    //Variables de conteo
  20.     void visualiza(void);  
  21.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  22.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  23.   int unidades= 0;
  24.   int decenas = 0;
  25.   int uni  = 0;
  26.   int dece = 0;
  27.   int tiempo = 1;
  28.   void visualiza()
  29.  {
  30.    
  31.   output_low(display_4);
  32.   output_high(display_1);
  33.   output_a(Numeros[decenas]);
  34.   delay_ms(tiempo);
  35.   output_low(display_1);
  36.   output_high(display_2);
  37.   output_a(Numeros[unidades]);
  38.   delay_ms(tiempo);  
  39.   output_low(display_2);
  40.   output_high(display_3);
  41.   output_a(Numeros[dece]);
  42.   delay_ms(tiempo);
  43.   output_low(display_3);
  44.   output_high(display_4);
  45.   output_a(Numeros[uni]);
  46.   delay_ms(tiempo);  
  47.  
  48.  
  49. }
  50.  
  51.  
  52.     void main ()  
  53.  {                    
  54.  
  55.  
  56.  while (true)
  57.  {
  58.  
  59.  if(!input(pin_b0))
  60.  {
  61.   delay_ms(5);
  62.   unidades++;
  63.   if(unidades>9)
  64.   {
  65.   decenas++;
  66.   unidades=0;
  67.   }
  68.   if(decenas>9)
  69.   {
  70.   decenas=0;
  71.   unidades=0;
  72.   }
  73.     while(input(pin_b0)==0)
  74.    
  75.    {
  76.    
  77.    visualiza();
  78.    }
  79.    
  80.    }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.   if(!input(pin_b1))
  87.   {
  88.   delay_ms(5);
  89.   uni++;
  90.    if(uni>9)
  91.   {
  92.   dece++;
  93.   uni=0;
  94.   }
  95.   if(dece>9)
  96.   {
  97.   dece=0;
  98.   uni=0;
  99.   }
  100.    
  101.    while(input(pin_b1)==0)
  102.    {
  103.    
  104.    visualiza();
  105.    }
  106.    }
  107.  
  108.                        
  109.         }
  110.         }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #10 en: 17 de Febrero de 2016, 15:58:59 »
Ya que estas aprendiendo, intenta acostumbrarte a otras cosas:

- Comentar
- Usar nombres que sean descriptivos y ayuden rapidamente solo leyendo el nombre a saber de que se trata, para variables y funciones, ( obviamente para el for se puede usar i,j,k,etc )
- Identa tu codigo


Ahora respecto a tu programa, intenta hacer que cada rutina sea separa de la otra. Si por ejemplo en tu programa yo quito lo del teclado (botones) no funcionaria mas el tema de mostrar en los displays.
En fin te dejo el codigo, tal ves no funciona exactamente como esperabas., le faltan un par de cosas como el setup de las entradas, pasarlas de analogicas a digitales.

Código: C
  1. #include <16f628A.H>
  2.  
  3. // Fuses
  4.  
  5. #fuses NOMCLR
  6. #fuses INTRC_IO
  7. #FUSES NOWDT                    //No Watch Dog Timer
  8. //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  9. #FUSES NOPUT                    //No Power Up Timer
  10. #FUSES NOPROTECT                //Code not protected from reading
  11. #FUSES NOBROWNOUT               //No brownout reset
  12. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  13. #FUSES NOCPD                    //No EE protection
  14. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  15.  
  16. // Set de clock para que el compilador calcule correctamente los delays
  17. // OJO no es que el valor que pongamos aca es la frecuencia que va a tener el PIC
  18. // Solo se usa para calcular los delays
  19.  
  20. #use delay (clock=4000000)
  21.  
  22. // Define para simplificar la lectura
  23.  
  24. #define display_1     PIN_B6
  25. #define display_2     PIN_B5 // ok
  26. #define display_3     PIN_B4
  27. #define display_4     PIN_B7
  28.  
  29. // Prototipos de funcion    
  30.  
  31. void visualiza(void);  
  32. void Teclado(void);
  33.  
  34. //Variables de conteo
  35.  
  36. unsigned int UnidadesDisp1= 0;
  37. unsigned int DecenasDisp1 = 0;
  38. unsigned int UnidadesDisp2  = 0;
  39. unsigned int DecenasDisp2 = 0;
  40. unsigned int tiempo = 1;
  41. unsigned int botones_ahora;
  42. unsigned int botones_previo = 0;
  43.  
  44. // Programa Principal
  45.  
  46. void main(void)  
  47. {                    
  48.  
  49.         //Aca el setup poner todos los pines como digitales
  50.  
  51.         while (true)
  52.         {
  53.                 Teclado();              // Un solo lugar de desde donde se toma los datos
  54.                 visualiza();            //Un solo lugar de desde dond ese visualiza
  55.         }
  56. }
  57.  
  58. // Rutina para mostrar los datos en los displays
  59.  
  60. void visualiza(void)
  61. {
  62.    
  63.         output_low(display_4);
  64.         output_a(DecenasDisp1);
  65.         output_high(display_1);
  66.         delay_ms(tiempo);
  67.  
  68.         output_low(display_1);
  69.         output_a(UnidadesDisp1);
  70.         output_high(display_2);
  71.         delay_ms(tiempo);  
  72.  
  73.         output_low(display_2);
  74.         output_a(DecenasDisp2);
  75.         output_high(display_3);
  76.         delay_ms(tiempo);
  77.  
  78.         output_low(display_3);
  79.         output_a(UnidadesDisp2);
  80.         output_high(display_4);
  81.         delay_ms(tiempo);  
  82. }
  83.  
  84. // Rutina que lee los botones y incrementa los valores
  85.  
  86. void Teclado(void){
  87.  
  88.         botones_ahora = input_b() & 0x03;
  89.  
  90.         // Pregunto por si cambio , y si estan presionado ambos. de esa forma si ambos estan presionados no le doy importancia.
  91.  
  92.         if((botones_ahora != botones_previo) && (botones_ahora != 0x03) )
  93.         {
  94.                 switch(botones_ahora){
  95.                 case 0x00:                      // Se soltaron todos no hago nada
  96.                         break;
  97.                 case 0x01:                      // Presionado RB0
  98.                         UnidadesDisp1++;
  99.                         break;
  100.                 case 0x02:                      // Presionado RB1
  101.                         UnidadesDisp2++;
  102.                         break;
  103.                 default:                        // Por si las dudas
  104.                         break;
  105.                 }
  106.                 botones_previo = botones_ahora; // Guardo como estaban los botones ahora
  107.                 if(UnidadesDisp1>9) DecenasDisp1++;             // Corrijo unidades si se necesita
  108.                 if(UnidadesDisp2>9) DecenasDisp2++;
  109.                 if(DecenasDisp1>9) DecenasDisp1=0;              // Corrijo decenas
  110.                 if(DecenasDisp2>9) DecenasDisp2=0;
  111.         }
  112. }
« Última modificación: 17 de Febrero de 2016, 16:08:11 por KILLERJC »

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #11 en: 18 de Febrero de 2016, 10:47:01 »
gracias , funciona pero  cuando supera 09, se pone loco...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #12 en: 18 de Febrero de 2016, 11:36:07 »
Ya vi donde le erre, para que veas como solucionarlo:

- La rutina que muestra los valores funciona es independiente de lo demas. Y eso funciona bien
- El teclado por lo que comentas funciona tambien.

Es como si la parte del contador no funcionara y la unica parte de eso es esto:

Código: C
  1. if(UnidadesDisp1>9) DecenasDisp1++;             // Corrijo unidades si se necesita
  2.                 if(UnidadesDisp2>9) DecenasDisp2++;
  3.                 if(DecenasDisp1>9) DecenasDisp1=0;              // Corrijo decenas
  4.                 if(DecenasDisp2>9) DecenasDisp2=0;

El problema es que me olvide poner a 0 las unidades :P. Asi que cambialo asi:

Código: C
  1. if(UnidadesDisp1>9) { DecenasDisp1++; UnidadesDisp1 = 0;}            // Corrijo unidades si se necesita
  2.                 if(UnidadesDisp2>9) { DecenasDisp2++; UnidadesDisp2 = 0;}
  3.                 if(DecenasDisp1>9) { DecenasDisp1=0; }             // Corrijo decenas
  4.                 if(DecenasDisp2>9) { DecenasDisp2=0; }

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #13 en: 19 de Febrero de 2016, 18:21:15 »
gracias Killer, te pasaste

ok ,colocare esa parte , demás que anda perfecto.. por mi parte le coloque esta parte y anda perfecto
 
Código: C
  1. botones_previo = botones_ahora; // Guardo como estaban los botones ahora
  2.                 if(UnidadesDisp1>9){ DecenasDisp1++; UnidadesDisp1=0;}
  3.                 if(DecenasDisp1>9) { DecenasDisp1=0; UnidadesDisp1=0;}
  4.                 if(UnidadesDisp2>9){ DecenasDisp2++; UnidadesDisp2=0;}
  5.                 if(DecenasDisp2>9) { DecenasDisp2=0; UnidadesDisp2=0;}

gracias por la ayuda, queria comentarte sobre una parte del programa, que me podria serer para varios mas , es como declarar la primera parte de la estructura por ejemplo:

Código: C
  1. void main(void)  
  2. {                    
  3.  
  4.         //Aca el setup poner todos los pines como digitales
  5.  
  6.         while (true)
  7.         {
  8.                 Teclado();              // Un solo lugar de desde donde se toma los datos
  9.                 visualiza();            //Un solo lugar de desde dond ese visualiza
  10.         }
  11. }

en esta parte si bien lo que se esta ocupando es lo siguiente:

Puerto A:
RA0,RA1,RA2,RA3 : output
RA4 : no lo ocupo
RA5 : MCLR
RA6,RA7 : no lo ocupo, por que ocupo el cristal interno // si en este caso ocupo el cristal interno, como los puedo
                  configurar para ocuparlos como (I/O), al igual que RA5

Puerto B:
RB0,RB1 : input
RB2,RB3 : NO LO OCUPO
RB4,RB5,RB6,RB7 : OUTPUT

//// lo que hago yo siempre es :
input_b(0b00000011);
outpu_a(0b00000000);


Desconectado ciberik

  • PIC10
  • *
  • Mensajes: 33
Re:Contador de 0 a 99 con 4 display 7 segmentos
« Respuesta #14 en: 20 de Febrero de 2016, 01:26:43 »
Saludos


 

anything