Ahoj, prosím o radu s tímto kódem: (Čítače pulzů v TIMER0 fungují, problém je někde v TIMER2=zobrazování čísel)
Budu moc vděčný za odhalení problému! Díky!
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <math.h>
volatile unsigned int cislice;
volatile unsigned int cislo;
volatile unsigned char T1;
volatile unsigned char T2;
volatile unsigned char T3;
//////////////////////////////////////////////////////////////////////////
// TIMER 0
//////////////////////////////////////////////////////////////////////////
ISR (TIMER0_OVF_vect)
{
TCNT0 = 180; // preruseni po 19,2ms
T1++;
T2++;
//////////////////////////////////////////////////////////////////////////
// FCE PRICITANI PULZU - (PB3)
//////////////////////////////////////////////////////////////////////////
switch (T1)//kazdejch 19,2s scannuje pulz
{
case 1:
if ((!(PINB&0b00001000))==1){ //pokud neprisel pulz
T1=0;
}
break;
case 4:
if ((!(PINB&0b00001000))==0){
cislo=cislo+5;
}
else{
T1=0;
}
break;
case 8:
T1=0;
break;
}
//////////////////////////////////////////////////////////////////////////
// ODECITANI PULZU -(PB2)
//////////////////////////////////////////////////////////////////////////
switch (T2)//kazdejch 19,2s scannuje pulz
{
case 1:
if ((!(PINB&0b00000100))==1){
T2=0;
}
break;
case 2:
if ((!(PINB&0b00000100))==0){ //pokud prisel pulz if ((!(PINB&0b00000100))==0)
cislo--;
}
else { //pokud tady neni pulz, tak neceka do konce, ale jde na zacatek cekani
T2=0;
}
break;
case 3:
T2=0;
break;
}
}
//////////////////////////////////////////////////////////////////////////
// TIMER 2
//////////////////////////////////////////////////////////////////////////
ISR (TIMER2_OVF_vect)
{
TCNT0 = 205; //preruseni po 12,8ms
T3++;
switch (T3)
{
case 1:
PORTC|= (0 << PC2); PORTC|= (1 << PC5);//PC5 -ANODA TISICE
if (cislo>=1000){
cislice=cislo/1000;
cislo=cislo-(cislice*1000);
}
else{
cislice=10; //zobrazi se -
}
break;
case 2:
PORTC|= (0 << PC5);PORTC|= (1 << PC4);//PC4 -ANODA STOVKY
if (cislo>=100){
cislice=cislo/100;
cislo=cislo-(cislice*100);
}
else{
cislice=10; //zobrazi se -
}
break;
case 3:
cislice=cislo/100;
PORTC|= (0 << PC4);PORTC|= (1 << PC3);//PC3 -ANODA DESITKY
if (cislo>=10){
cislice=cislo/10;
cislo=cislo-(cislice*10);
}
else{
cislice=10; //zobrazi se -
}
break;
case 4:
PORTC|= (0 << PC3);PORTC|= (1 << PC2); //PC2 -ANODA JEDNOTKY
cislice=cislo;
T3=0;//vymaze casovaci promennou
break;
}
ukazC(cislice);
}
//////////////////////////////////////////////////////////////////////////
// ZOBRAZOVANI CISEL
//////////////////////////////////////////////////////////////////////////
void ukazC (char cislice)
{
switch (cislice)
{
case 0: PORTD = 0b11000000; break;
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11011000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
default: PORTD = 0b10111111; break; //prostredni vodorovna cara
//0b01111111, //tecka
//0b11111111 //nic
}
}
//////////////////////////////////////////////////////////////////////////
// HLAVNI FUNKCE
//////////////////////////////////////////////////////////////////////////
int main (void)
{
DDRB=0b00110010; //1=vystup, 0=vstup ///F7=>preklad programu
DDRC=0b00111100; //C2-C5 jsou spolecny anody
DDRD=0xff; //sedmisegment-vse vystupy
//PORTB|= (1 << PB1); //zapnuti proudu nafurt
PORTD = 0b11111111;
while(1)
{
TCCR0 |= (1 << CS02) | (1 << CS00); // preddelicka /1024 //TCCR0 = 0b00000101;TIMSK = 0b00000011;
TIMSK|= (1 << TOIE0);// prerušenie pri pretečení TCNT0
//TIMER2
TCCR2 |= (1 << CS22) | (1 << CS21)| (1 << CS20); // preddelicka /1024 //TCCR0 = 0b00000101;TIMSK = 0b00000011;
TIMSK|= (1 << TOIE2);// prerušenie pri pretečení TCNT2
sei(); //povol globálne prerušenia
PORTB=0b00110000;
_delay_ms(40);
PORTB ^= (1 << PB5);
_delay_ms(100);
}
}