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 all
#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