Chcę zaimplementowac RTC w mojej Atmedze. Mają to być przerwania od asynchronicznego Timera2. Coś nie działa, mam kilka pytań :
1. czy piny w porcie C (PC7 i PC6 które służa jako TOSC1 i TOSC2) trzeba ustawić jako we/wy ? czy wystarczy ustawienie bitu AS2 w ASSR ?
2. jakie powinno być napięcie na nich ( u mnie na obu pinach rezonatora jest 0.4 V).
3. Czy można zasymulować rezonator 32 768 w programie VMLAB ?
4. Czy jeżeli używam tez przerwań od Timera0 (do odczytu klawiatury) to musze to jakoś pogodzić ze sobą ?
Dołaczam istotne fragmenty kodu:
fragment f-cji main :
///////////// inicjalizacja kwarcu 32 768 //////////////////////////
TIMSK &=~((1<<TOIE2)|(1<<OCIE2));
ASSR=(1<<AS2);
TCNT2=0;
TCCR2=5;// ustawienie preskalera na /128 => przerwania co 1 sek
while(ASSR&0x07);
TIMSK=(1<<TOIE2);
////////// timer 0 do klawiatury: /////////////
TIMSK=(1<<TOIE0); //zezw na przerwania od Timera0
TCNT0=tau0;
TCCR0=5; //XTAL/1024
sei(); //zezwolenie globalne na przerwania
obsługa przerwania:
SIGNAL (SIG_OVERFLOW2)
{
if(c==0) {sbi(PORTA,0); c=1;}
else {cbi(PORTA,0); c=0;} //miganie diody co sekundę
if(++t.second==60)
{
t.second=0;
if(++t.minute==60)
{
t.minute=0;
if(++t.hour==24)
{
t.hour=0;
if (++t.date==32)
{
t.month++;
t.date=1;
}
else if (t.date==31)
{
if ((t.month==4)||(t.month==6)||(t.month==9)||(t.month==11))
{
t.month++;
t.date=1;
}
}
else if (t.date==30)
{
if (t.month==2)
{
t.month++;
t.date=1;
}
}
else if (t.date==29)
{
if((t.month==2)&&(not_leap()))
{
t.month++;
t.date=1;
}
}
if (t.month==13)
{
t.month=1;
t.year++;
}
}
}
}
}
char not_leap(void)
{
if(!(t.year%100))
return (char)(t.year%400);
else
return (char)(t.year%4);
}
z moich obserwacji wynika że przerwania od timera2 nie sa wogóle zgłąszane - dioda nie miga, minuty nie sa aktualizowane
1. czy piny w porcie C (PC7 i PC6 które służa jako TOSC1 i TOSC2) trzeba ustawić jako we/wy ? czy wystarczy ustawienie bitu AS2 w ASSR ?
2. jakie powinno być napięcie na nich ( u mnie na obu pinach rezonatora jest 0.4 V).
3. Czy można zasymulować rezonator 32 768 w programie VMLAB ?
4. Czy jeżeli używam tez przerwań od Timera0 (do odczytu klawiatury) to musze to jakoś pogodzić ze sobą ?
Dołaczam istotne fragmenty kodu:
fragment f-cji main :
///////////// inicjalizacja kwarcu 32 768 //////////////////////////
TIMSK &=~((1<<TOIE2)|(1<<OCIE2));
ASSR=(1<<AS2);
TCNT2=0;
TCCR2=5;// ustawienie preskalera na /128 => przerwania co 1 sek
while(ASSR&0x07);
TIMSK=(1<<TOIE2);
////////// timer 0 do klawiatury: /////////////
TIMSK=(1<<TOIE0); //zezw na przerwania od Timera0
TCNT0=tau0;
TCCR0=5; //XTAL/1024
sei(); //zezwolenie globalne na przerwania
obsługa przerwania:
SIGNAL (SIG_OVERFLOW2)
{
if(c==0) {sbi(PORTA,0); c=1;}
else {cbi(PORTA,0); c=0;} //miganie diody co sekundę
if(++t.second==60)
{
t.second=0;
if(++t.minute==60)
{
t.minute=0;
if(++t.hour==24)
{
t.hour=0;
if (++t.date==32)
{
t.month++;
t.date=1;
}
else if (t.date==31)
{
if ((t.month==4)||(t.month==6)||(t.month==9)||(t.month==11))
{
t.month++;
t.date=1;
}
}
else if (t.date==30)
{
if (t.month==2)
{
t.month++;
t.date=1;
}
}
else if (t.date==29)
{
if((t.month==2)&&(not_leap()))
{
t.month++;
t.date=1;
}
}
if (t.month==13)
{
t.month=1;
t.year++;
}
}
}
}
}
char not_leap(void)
{
if(!(t.year%100))
return (char)(t.year%400);
else
return (char)(t.year%4);
}
z moich obserwacji wynika że przerwania od timera2 nie sa wogóle zgłąszane - dioda nie miga, minuty nie sa aktualizowane