[PIC] Timer Using PIC16F628A and 4digit 7seg display common anode config - Page 1
Forum section: electronics / general

author: Ragnar22
author_rank: Newbie
timestamp: August 08, 2016, 01:57:58 pm
content: Hi everybody, this project was suppose to be easy but I gotta be honest with u guys, it's getting realy hard to finish!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 allCode:#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 contadorint 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 flagTMR0= 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 PORTBdigito_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 PORTBdigito_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 PORTBdigito_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 PORTBdigito_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 internosOPTION_REG = 0b10000001; // prescaler = 1: 2GIE_bit = 0x01; //Habilita a interrupção globalPEIE_bit = 0x01; //Habilita a interrupção por periféricosT0IE_bit = 0x01; //Habilita a interrupção por estoiro do TMR0TMR0 = 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 comparadoresTRISA=0b00000000; //PORTA é configurado como saidasTRISB=0b00000000; //PORTB configurado como saídasdigito_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 = {0b01000000,0b01111001,0b00100100,0b00110000,0b00011001,0b00010010,0b00000010,0b01111000,0b00000000,0b00011000} ;anode = SEGMENTO; //para retornar o cathodereturn(anode); //retorna o número BCD} //end display

author: dannyf
author_rank: Super Contributor
timestamp: August 08, 2016, 03:50:54 pm
content: 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.