Używam Timera1 z Atmega164P w trybie CTC, Atmega ma kwarc 16MHz, interesujący kawałek programu wygląda tak:
Konfiguracja Timera:
Definicja przerwania:
Z tego co rozumiem to działa to tak:
16000000 / 256 = 62500 inkrementacji timera na sekundę, więc wartość 15625 powinien osiągnąć w 1/4 sekundy czyli przerwanie wywołane 4 razy na sekundę.
A u mnie ewidentnie przerwanie wywołuje się zmieniając stan diody raz na sekundę tak jakby zegar miał 4MHz
Sprawdziłem - Program transmituje dodatkowo po RS z ustaloną prędkością, a USART jest jak wiadomo konfigurowany względem zegara, i działa prawidłowo przy założeniu, że mam 16MHz.
Gdzie się gubią MHz ?
Konfiguracja Timera:
void Timer1_Init(void)
{
DDRD |= (1<<PD7); // PD7 wyjście
PORTD |= (1<<PD7); // PD7 <= 1
TCCR1B = (1<<WGM12)|(1<<CS12)|(0<CS11)|(0<<CS10); // Timer w tryb CTC + Prescaler/256
OCR1A = 15625; // Rejestr porównania
TIMSK1 |= (1<<OCIE1A); // Włączenie przerwania
}
Definicja przerwania:
ISR(TIMER1_COMPA_vect)
{
PORTD ^= (1<<PD7);
}
Z tego co rozumiem to działa to tak:
16000000 / 256 = 62500 inkrementacji timera na sekundę, więc wartość 15625 powinien osiągnąć w 1/4 sekundy czyli przerwanie wywołane 4 razy na sekundę.
A u mnie ewidentnie przerwanie wywołuje się zmieniając stan diody raz na sekundę tak jakby zegar miał 4MHz
Sprawdziłem - Program transmituje dodatkowo po RS z ustaloną prędkością, a USART jest jak wiadomo konfigurowany względem zegara, i działa prawidłowo przy założeniu, że mam 16MHz.
Gdzie się gubią MHz ?