Jaecko
28.07.2008, 13:54
Moin.
Wieder mal ein neues Problem. An nem ATMega2560-Modul (von Robotikhardware) ist ja an TOSC1/TOSC2 ein 32768Hz-Uhrenquarz. Hab jetzt versucht, den für die Uhr zu verwenden, was aber nicht klappt.
Hier die relevanten Codeteile:
void Clock_Start(ui8_t timer)
{
TIMSK2 |= (1<<TOIE2);
}
void Clock_Init(void)
{
TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
ASSR |= (1 << AS2); // Select 32768 Hz Clock
TCCR2A = 0; // Standard timer (No Counting, No PWM)
TCCR2B = 0 | (1<<CS22) | (1<<CS20); // Prescaler = 128
TCNT2 = TCNT2_REL; // Reload
while(ASSR & ((1<<TCR2BUB)|(1<<TCR2AUB)|(1<<TCN2UB))); // wait until clock has switched
TIFR2 |= ((1<<OCF2A)|(1<<OCF2B)|(1<<TOV2)); // Clear Interrupt flags
ONBOARD_LED_DDR |= (1 << ONBOARD_LED_PIN);
}
ISR (SIG_OVERFLOW2)
{
TCNT2 = TCNT2_REL;
ONBOARD_LED_PORT ^= (1 << ONBOARD_LED_PIN);
}
Das Programm selbst bleibt bei der "while"-Anweisung stehen; ohne das while läuft zwar der Rest vom Programm; die ISR wird jedoch nicht angesprungen (was man sonst an einer blinkenden LED sehen würde)
Sieht hier jemand nen Fehler?
mfG
Wieder mal ein neues Problem. An nem ATMega2560-Modul (von Robotikhardware) ist ja an TOSC1/TOSC2 ein 32768Hz-Uhrenquarz. Hab jetzt versucht, den für die Uhr zu verwenden, was aber nicht klappt.
Hier die relevanten Codeteile:
void Clock_Start(ui8_t timer)
{
TIMSK2 |= (1<<TOIE2);
}
void Clock_Init(void)
{
TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
ASSR |= (1 << AS2); // Select 32768 Hz Clock
TCCR2A = 0; // Standard timer (No Counting, No PWM)
TCCR2B = 0 | (1<<CS22) | (1<<CS20); // Prescaler = 128
TCNT2 = TCNT2_REL; // Reload
while(ASSR & ((1<<TCR2BUB)|(1<<TCR2AUB)|(1<<TCN2UB))); // wait until clock has switched
TIFR2 |= ((1<<OCF2A)|(1<<OCF2B)|(1<<TOV2)); // Clear Interrupt flags
ONBOARD_LED_DDR |= (1 << ONBOARD_LED_PIN);
}
ISR (SIG_OVERFLOW2)
{
TCNT2 = TCNT2_REL;
ONBOARD_LED_PORT ^= (1 << ONBOARD_LED_PIN);
}
Das Programm selbst bleibt bei der "while"-Anweisung stehen; ohne das while läuft zwar der Rest vom Programm; die ISR wird jedoch nicht angesprungen (was man sonst an einer blinkenden LED sehen würde)
Sieht hier jemand nen Fehler?
mfG