Habe gerade einige Fehler gesehen, die mir vorher entgangen sind.
1.) Je nachdem was du verwendest musst du if(PINA & (1<<PA2)) cli(); bzw if ( !(PINB & (1<<PINB2))) cli(); schreiben. Das Gleiche gilt für PA7. Wenn du den internen Pullupwiderstand nimmst musst du dieses Ändern.
2.) Die Endschalterabfrage musst du in die While(1) Schleife setzten, sonnst wird das Programm nur einmal ausgeführt.
Das Programm schaut so aus, wenn du den internen (oder externen) Pullupwiderstand nimmst.
Code:
int main(void)
{
TIMER2_interrupt_init;
while(1)
{
if(!(PINA & (1<<PA7))) sei();
if(!(PINA & (1<<PA2))) cli();
}
}
Habe nur main geschrieben. die ISR und Timer Init musst du natürlich auch schreiben.
Damit du das Programm testen kannst würde ich noch eine Led anschließen. Bei jedem Timerüberlauf (in der ISR) änderst du den Zustand der Led (ein/aus). Bei der Led darfst du den Vorwiderstand nicht vergessen.
Beim Timer init musst du noch die einzelnen Variablen mit | verknüpfen, sonst funktioniert es nicht. Außerdem musst du vor "TIMER2_interrupt_init(void)" noch ein void geben.
Diesen Code habe ich gerade mit einem Atmega8 getestet, deswegen habe ich andere Pins.
Code:
void TIMER2_interrupt_init(void)
{
TCCR2 = (1<<WGM21)|(1<<CS22)| (1<<CS21) |(1<<CS20);
TCNT2=0;
OCR2=249;
TIMSK = (1<<OCIE2);
}
ISR(TIMER2_COMP_vect)
{
PORTB ^= (1<<PB0);
}
int main(void)
{
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); //Led und Summer als Ausgang
PORTD |= (1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3); //Pullup für Taster ein
PORTB |= (1<<PB2); //Summer ausschalten
TIMER2_interrupt_init();
while(1)
{
if(!(PIND & (1<<PD0))) sei();
if(!(PIND & (1<<PD1))) cli();
}
}
Mit Taste1 aktiviert man den Timer, Taste 2 deaktiviert ihn. In der ISR wird eine Led invertiert. Ist der Timer aktiviert, blinkt die Led.
Willst du den Timer jede Sekunde um 1 erhöhen oder soll der Timer so schnell wie möglich laufen und du errechnest dann die Zeit?
MfG Hannes
Lesezeichen