Author Topic: [PIC] Timer Using PIC16F628A and 4digit 7seg display common anode config  (Read 1762 times)

0 Members and 1 Guest are viewing this topic.

Offline Ragnar22Topic starter

  • Newbie
  • Posts: 1
  • Country: pt
Hi everybody, this project was suppose to be  easy but I gotta be honest with u guys, it's getting realy hard to finish! |O The main point here is that when I simulate the code in ISIS PROTEUS it's all ok but in real world the digits are all messed up, some say it's due to the RMW problem but I tried putting these whiles as u can see in the code and no success. Any ideias are welcome. Thank you all












Code: [Select]

#define digito_minutos1 RA3_bit
#define digito_minutos2 RA2_bit
#define digito_horas1 RA1_bit
#define digito_horas2 RA0_bit
#define atraso1 500
#define atraso2 500
#define atraso3 1



// --- Protótipo das Funções Auxiliares ---
int display(int num);                          //Exibe o valor correspondente no display de catodo comum



// --- Variávei Globais ---
int tempo  = 0x00;                           //Inicializa contador
int control = 1;                           //Variável de controle (para saber qual display está ativo)
int segundos, minutos1,horas1,minutos2,horas2 = 0;


// --- Rotina de Interrupção ---
void interrupt()
{
     if(T0IF_bit)                            //Houve o estouro do TMR0?       (256-6)*prescaler*1us =
     {
        T0IF_bit = 0x00;                     //Sim, limpa a flag
        TMR0= 6;
        tempo++;


             if(digito_horas2 && control==1){
                              control = 2;
                             
                             
                              digito_minutos1  = 1;
                              digito_horas1 = 1   ;
                              digito_minutos2 = 1 ;
                             
                              while(digito_horas1 != 1 || digito_minutos2 != 1 || digito_minutos1 != 1){

                              }

                             PORTB   = 0b11111111;                   //LIMPA PORTB
                             

                              digito_horas2  = 0;
                              while(digito_horas2!=0){
                             
                              }

                              PORTB  = display(horas2);


              }else if(digito_horas1 && control==2){


                    control = 3;
                    digito_minutos2 = 1;
                    digito_minutos1   = 1 ;
                    digito_horas2    = 1;

                     while(digito_horas2 !=1 || digito_minutos2 !=1 || digito_minutos1 != 1){

                              }

                    PORTB   = 0b11111111;                   //LIMPA PORTB
                   

                    digito_horas1 = 0;
                     
                    while(digito_horas1 != 0){

                    }

                    PORTB  = display(horas1);



                    }else if(digito_minutos2 && control==3){



                          control = 4;
                          digito_minutos1 = 1 ;
                          digito_horas1   = 1 ;
                          digito_horas2    = 1;

                          while(digito_horas2!=1  || digito_horas1 !=1 || digito_minutos1!= 1){

                              }

                          PORTB   = 0b11111111;                   //LIMPA PORTB
                         

                          digito_minutos2 =  0;
                          while(digito_minutos2!=0){

                    }

                          PORTB  = display(minutos2);


                          }else if(digito_minutos1 && control == 4){

                                control = 1;
                                digito_minutos2 = 1 ;
                                digito_horas1   = 1 ;
                                digito_horas2    = 1;

                                while(digito_horas2!=1  || digito_horas1 !=1 || digito_minutos2 != 1){

                              }

                                PORTB   = 0b11111111;                  //LIMPA PORTB
                               

                                digito_minutos1 = 0;
                               
                                    while(digito_minutos1!=0){

                    }

                                PORTB  = display(minutos1);


        }

     } //end if (teste de estouro)

} //end interrupt


// --- Função Principal ---
void main()
{

                                         //Desabilita os resistores de pull-up internos
       OPTION_REG = 0b10000001;                 // prescaler = 1: 2
       GIE_bit    = 0x01;                //Habilita a interrupção global
       PEIE_bit   = 0x01;                //Habilita a interrupção por periféricos
       T0IE_bit   = 0x01;                //Habilita a interrupção por estoiro do TMR0

       TMR0       = 6;                //Inicia neste valor para dar contagem precisa (250*4*1 us cada estoiro ou seja 1 ms cada estoiro do Timer0)*/





       CMCON = 0x07;      // desabilita os comparadores
       TRISA=0b00000000; //PORTA é configurado como saidas
       TRISB=0b00000000; //PORTB configurado como saídas


       digito_minutos2 = 1 ;
       digito_horas1   = 1 ;
       digito_minutos1 = 1 ;
       digito_horas2   = 1 ;
// -- Loop infinito --
     while(1)
     {
        if(tempo == 1000)              // 1 us * 99 * 64 = 10048 us =~ 10 ms
       {
          segundos++;
          tempo = 0x00;

       }

      if(segundos == 60)
       {

          minutos1++;
          segundos = 0;
       }

        if(minutos1 == 10)
       {

          minutos2++;
          minutos1 = 0;
       }
        if(minutos2 == 6)
       {

          horas1++;
          minutos2 = 0;
       }
        if(horas1 == 10)
       {

          horas2++;
          horas1 = 0;
       }






     } //end while

} //end main


//Esta função acha o bit pertinente a cathode (matrix de bits) para ser enviado
//para o PORTC e mostrar um número no display de 7 segmentos. O número
//é passado como um parâmetro para a função.
int display(int num)
{
    int anode;                               //armazena código BCD

// -- Vetor para o código BCD --
    int SEGMENTO[10] = {0b01000000,0b01111001,0b00100100,0b00110000,0b00011001,0b00010010,0b00000010,0b01111000,0b00000000,0b00011000}    ;

    anode = SEGMENTO[num];                   //para retornar o cathode

    return(anode);                           //retorna o número BCD

} //end display

« Last Edit: August 08, 2016, 01:59:40 pm by Ragnar22 »
 

Offline dannyf

  • Super Contributor
  • ***
  • Posts: 8221
  • Country: 00
Your code is quite disorganized.

The whole thing is simple: write a routine that will light up the right digits specified in a ram buffer.

You can then call that routine from the timer isr.

I would also write the code so that it is portable: in a modular way so you can use it in future projects.
================================
https://dannyelectronics.wordpress.com/
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf