Codigo de cronometro con interrupciones en ccs compiler

Buenas estoy empezando a practicar y estoy haciendo un codigo de ccs compiler en el cual hago un cronometro con un display 7 segmentos , esto es lo que llevo
Código:
#include <18F47J53.h>

#device ADC=8

#FUSES NOWDT         //WDT disabled (enabled by SWDTEN bit)                    
#FUSES PLL3          //Divide by 3 (12 MHz oscillator input)            
#FUSES NOPLLEN       //PLL Disabled
#FUSES NOSTVREN      //stack overflow/underflow reset enabled                
#FUSES NOXINST       //Extended instruction set disabled            
#FUSES NOCPUDIV      //No CPU system clock divide         
#FUSES NOPROTECT     //Program memory is not code-protected          
#FUSES HSPLL         //HS oscillator, PLL enabled, HSPLL used by USB           
#FUSES SOSC_HIGH     //High Power T1OSC/SOSC circuit selected
#FUSES CLOCKOUT      //CLKO output enabled on the RA6 pin 
#FUSES NOFCMEN       //Fail-Safe Clock Monitor disabled
#FUSES NOIESO        //Two-Speed Start-up disabled
#FUSES WDT32768      //Watchdog Postscaler 1:32768
#FUSES DSWDTOSC_INT  //DSWDT uses INTOSC/INTRC as clock
#FUSES RTCOSC_INT    //RTCC uses INTRC as clock
#FUSES NODSBOR       //Zero-Power BOR disabled in Deep Sleep
#FUSES NODSWDT       //Deep Sleep Watchdog Timer Disabled
#FUSES DSWDT8192     //Deep Sleep Watchdog Postscaler: 1:8,192 (8.5 seconds)   
#FUSES NOIOL1WAY     //IOLOCK bit can be set and cleared
#FUSES ADC12         //ADC 10 or 12 Bit Select:12 - Bit ADC Enabed 
#FUSES MSSPMSK7      //MSSP 7 Bit address masking
#FUSES NOWPFP        //Write Protect Program Flash Page 0
#FUSES NOWPCFG       //Write/Erase last page protect Disabled
#FUSES WPDIS         //WPFP[5:0], WPEND, and WPCFG bits ignored 
#FUSES WPEND         //Start protection at page 0
#FUSES LS48MHZ       //Low Speed USB mode with 48 MHz System clock at 48 MHz USB CLKEN divide-by is set to 8 
#use delay(clock=48000000)

#pin_select U2TX=PIN_D2 //Selecciona hardware UART2
#pin_select U2RX=PIN_D3 //Selecciona hardware UART2




#define LOADER_END   0xFFF                        
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)   //Protege posiciones de memoria desde la 0x0000 hasta la 0x1000   
#org 0, LOADER_END {}

#bit PLLEN = 0xf9b.6

#use  rs232(baud=9600,parity=N,UART1,bits=8,timeout=30)
/********************************************************/
/*------- Espacio para declaracion de constantes  ------*/
/********************************************************/
#define d_unidad  PIN_B0   // Pin seleccionado para el control del 7segmento Unidad
#define d_decena  PIN_B6   // Pin seleccionado para el control del 7segmento Decena
#define d_centena PIN_B5   // Pin seleccionado para el control del 7segmento Centena
#define d_umil    PIN_B7   // Pin seleccionado para el control del 7segmento Unidad de Mil
 
/********************************************************/
/*--- Espacio para declaracion de variables globales  --*/
/********************************************************/

unsigned int16 i,j,z;
char leds1[9]=  {0,1,2,4,8,16,32,64,128};
unsigned char hora=0,minuto=0,segundo=0,milseg=0,bcd_unid,bcd_dec=0,bcd_cent=0,bcd_umil=0;
 char unidad=0,decena=0,centena=0,umil=0;
      //PGFEDCBA
char display[16]=  {0b01011111,0b01000010,0b10011011,0b11010011,0b11000110,0b11010101,0b11011101,0b01000011,0b11011111,0b11000111
                     0b01110111,//A
                     0b01111100,//B
                     0b01011000,//C
                     0b01011110,//D
                     0b01111011,//E
                     0b01110001,//F
                   }; // La anterior Tabla contiene los valores binarios para la visualización de los
                      // números en los segmentos

/********************************************************/
/********************************************************/
/*-------------- Espacio para funciones  ---------------*/
/********************************************************/

#include <stdlib.h> // for atoi32

#INT_TIMER0
void interrupcion (void){
//! if(input(pin_b3)){              
  set_timer0(60530);
 output_toggle(PIN_b3);
  if(++unidad==10){
  unidad=0;
  if(++decena==10){
  decena=0;
   if(++centena==10){
  centena=0;
   if(++umil==10){
  umil=0;
  
  }  
  }
  }
  }
//! }
}
                
 
void conver_bcd (unsigned char x){
umil=0,centena=0,decena=0,unidad=0;
         while(x>=1000){
          x= x-1000;
          ++umil;
}
         while(x>=100){
          x= x-100;
          ++centena;
}
          while(x>=10){    // este procedimiento convirte los datos de binario a bcd 
          x= x-10;
          ++decena;
}
         unidad=x;
}
void mostrar(void){
//! conver_bcd (segundo);
          output_d(display[unidad]);
       output_low(d_unidad);
         delay_ms(2);
       output_high(d_unidad);
          
       output_d(display[decena]); 
       output_low(d_decena); 
         delay_ms(2);
       output_high(d_decena); 
         
       output_d(display[centena]);   
       output_low(d_centena);
         delay_ms(3);
       output_high(d_centena);  
         
       output_d(display[umil]);   
       output_low(d_umil);
         delay_ms(3);
       output_high(d_umil);   
         

               }
/******************************************************************************/
/******************************************************************************/
/*--------------------- Espacio de codigo principal --------------------------*/
/******************************************************************************/ 
#zero_ram
void main(){
PLLEN = 1;          //Habilita PLL para generar 48MHz de oscilador*/\\ 


 
 enable_interrupts(INT_TIMER0);
 enable_interrupts(GLOBAL);
 set_timer0(60530);
 setup_timer_0(RTCC_DIV_256 | RTCC_INTERNAL);
 
 for(;;){
 
mostrar();
}
}//end main
Intente muchas cosas perdon por el desorden , pero hasta ahora eso es lo mejor que he podido hacer , no entiendo porque no me cuenta los numeros :( muchas gracias de ante mano. ...
 
Creo que el error está en que declaras el vector Display[16] como una variable tipo char, por ahi debes usar el tipo int, creo, no estoy seguro de lo que te voy a decir, la instrucción output_d() no maneja char y por eso no te funciona, proba con int a ver si mejora.
 
Hola, gracias por la ayuda , ya lo había usado asi para hacer una calculadora y no me generó problemas , igual lo cambié como aconsejaste pero tampoco funcionó :( , no se que pueda ser la verdad.

Se que tiene que ver con las interrupciones porque quito todo lo que tenga que ver con interrupciones y funciona perfecto pero tan pronto la pongo ya solo muestra 0000 y titilea a los 4 segundos .


Bueno les cuento como me fue, busque mucho y cambié y cambié códigos , he tenido muchos fallos durante estas cuatro horas pero creo que obtuve un progreso o al menos aprendí mucho de como escribir varias cosas de distintas maneras, bueno esto es lo que llevo
Código:
#include <18F47J53.h>
#device ADC=8

#FUSES NOWDT         //WDT disabled (enabled by SWDTEN bit)                    
#FUSES PLL3          //Divide by 3 (12 MHz oscillator input)            
#FUSES NOPLLEN       //PLL Disabled
#FUSES NOSTVREN      //stack overflow/underflow reset enabled                
#FUSES NOXINST       //Extended instruction set disabled            
#FUSES NOCPUDIV      //No CPU system clock divide         
#FUSES NOPROTECT     //Program memory is not code-protected          
#FUSES HSPLL         //HS oscillator, PLL enabled, HSPLL used by USB           
#FUSES SOSC_HIGH     //High Power T1OSC/SOSC circuit selected
#FUSES CLOCKOUT      //CLKO output enabled on the RA6 pin 
#FUSES NOFCMEN       //Fail-Safe Clock Monitor disabled
#FUSES NOIESO        //Two-Speed Start-up disabled
#FUSES WDT32768      //Watchdog Postscaler 1:32768
#FUSES DSWDTOSC_INT  //DSWDT uses INTOSC/INTRC as clock
#FUSES RTCOSC_INT    //RTCC uses INTRC as clock
#FUSES NODSBOR       //Zero-Power BOR disabled in Deep Sleep
#FUSES NODSWDT       //Deep Sleep Watchdog Timer Disabled
#FUSES DSWDT8192     //Deep Sleep Watchdog Postscaler: 1:8,192 (8.5 seconds)   
#FUSES NOIOL1WAY     //IOLOCK bit can be set and cleared
#FUSES ADC12         //ADC 10 or 12 Bit Select:12 - Bit ADC Enabed 
#FUSES MSSPMSK7      //MSSP 7 Bit address masking
#FUSES NOWPFP        //Write Protect Program Flash Page 0
#FUSES NOWPCFG       //Write/Erase last page protect Disabled
#FUSES WPDIS         //WPFP[5:0], WPEND, and WPCFG bits ignored 
#FUSES WPEND         //Start protection at page 0
#FUSES LS48MHZ       //Low Speed USB mode with 48 MHz System clock at 48 MHz USB CLKEN divide-by is set to 8 
#use delay (clock=4M)   // Frecuencia del Crystal


#pin_select U2TX=PIN_D2 //Selecciona hardware UART2
#pin_select U2RX=PIN_D3 //Selecciona hardware UART2




#define LOADER_END   0xFFF                        
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)   //Protege posiciones de memoria desde la 0x0000 hasta la 0x1000   
#org 0, LOADER_END {}

#bit PLLEN = 0xf9b.6


#byte TRISA = 0x85      // Direccion del TRISA
#byte PORTA = 0x05      // Direccion del PORTA
#use  rs232(baud=9600,parity=N,UART1,bits=8,timeout=30)
#define d_unidad  PIN_B0   // Pin seleccionado para el control del 7segmento Unidad
#define d_decena  PIN_B6   // Pin seleccionado para el control del 7segmento Decena
#define d_centena PIN_B5   // Pin seleccionado para el control del 7segmento Centena
#define d_umil    PIN_B7   // Pin seleccionado para el control del 7segmento Unidad de Mil
//!void Mostrar();         // Funcion para mostrar datos en el display
char display[16]=  {0b01011111,0b01000010,0b10011011,0b11010011,0b11000110,0b11010101,0b11011101,0b01000011,0b11011111,0b11000111
                     0b01110111,//A
                     0b01111100,//B
                     0b01011000,//C
                     0b01011110,//D
                     0b01111011,//E
                     0b01110001,//F
                   }; // La anterior Tabla contiene los valores binarios para la visualización de los
                      // números en los segmentos
char unidad=0,decena=0,centena=0,umil=0;
char  i,j;
long con;
void Mostrar(){
    output_d(display[i]);
       output_low(d_unidad);
         delay_ms(1);
       output_high(d_unidad);
          
       output_d(display[j]); 
       output_low(d_decena); 
         delay_ms(1);
       output_high(d_decena); 
         
       output_d(display[centena]);   
       output_low(d_centena);
         delay_ms(1);
       output_high(d_centena);  
         
       output_d(display[umil]);   
       output_low(d_umil);
         delay_ms(1);
       output_high(d_umil);  
}
#int_timer0    // Interrupcion para 1S
void timer0(){
   con++;
    if(con == 1850){
      i--;
      Mostrar();
      con = 0;
      if(i == -1){ i = 9; j--; }
   }
   Mostrar();
   SET_TIMER0(131);

              }
void main(){

TRISA = 0b1111110;
setup_timer_0(RTCC_INTERNAL |RTCC_DIV_4 );

i=j=0;

for(;;){
   Mostrar();
  if(input(PIN_A1) == 1) { while(input(PIN_A1) == 1){Mostrar();} i++; if(i == 10){ i = 0; j++; }}
  if(input(PIN_A2) == 1) { while(input(PIN_A2) == 1){Mostrar();}  i--;if(i == -1){ i = 9; j--; }}
  if(input(PIN_A3) == 1) { while(input(PIN_A3) == 1){Mostrar();} set_timer0(131); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL);  }
  if(input(PIN_A5) == 1) { while(input(PIN_A5) == 1){Mostrar();} disable_interrupts(GLOBAL); }
  if(i==0 && j==0 ){disable_interrupts(GLOBAL);}
  }
  }

Pienso que debería funcionar pero pues al menos en la simulacion no hace lo que deberia hacer , solo aumenta o disminuye los numeros (hasta ahora solo lo estoy probando con los dos primeros displays 7 segmentos por eso tambien con esos utilizo i y j para acordarme que son solo esos) pero al momento de empezar la primera vez se queda un tiempo en el numero que deje y despues pasa a 0, y la segundo sin importar el numero que pongo de una vez se va a 0.

Entonces tengo tres conclusiones de porque puede estar fallando
-la primera que es la que veo menos posible es que algo en el codigo este haciendo algo que no debe , pero lo revise mucho tiempo y creo que entiendo lo que hace y me parece que esta bien
-La segundo que es la que veo como media posibilidad es que estoy simulando mal en proteus.
-Y la tercera que es la que creo que es mas posible es que como no entiendo #fuses o #pin_select o #build etc... alguno esta creando problemas que no se y siendo sincero esa parte me la dio un profesor pero dijo que era algo general pero que no siempre aplicaba , entonces mañana averiguare sobre eso.

Igual voy a seguir investigando mañana les dire mis avances , les dejo una foto de donde estoy simulando(si preguntan los otros pines es por lo de la calculadora que comentaba mas arriba pero igual pienso que no afecta en nada con el codigo que estoy usando) y muchas gracias si alguno quiere ayudarme.
 

Adjuntos

  • Captura2.jpg
    Captura2.jpg
    109.1 KB · Visitas: 16
Última edición por un moderador:
Hola fanta007, se te ha olvidado poner las unidades y las decenas? o se las ha comido el gato? jejeje es broma, repasa tu codigo y ponlas, si te fijas, al compilar, te pregunta por esas dos variables con sendos warnings, venga un saludo.
 
Atrás
Arriba