Gast
#1676641
Hallo zusammen, habe folgendes Problem: Ich habe an PORTA sowie PORTD jeweils 8 LEDs angeschlossen und habe bisher mit einem manuel Programmierten Timer diese zum leuchten gebracht. Nun will ich die Timer/Counter möglichkeiten die der ATmega16 mitbringt nutzen und habe dafuer folgendes Programm geschrieben welches lediglich den ersten PIN des PORTAs im Sekundentakt blinken lassen soll. Es blinkt jedoch nichts.. sondern die LED blinkt konstant weil die Variable "stop" anscheinend in "ISR nicht auf 0 gesetzt wird. Ich kann in ISR auch keinen Port schalten von daher habe ich das Gefühl das er garnicht erst ISR ausführt.. Hat jemand ne Idee woran es liegen könnte?.. danke im Voraus, Tobias. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/wdt.h> volatile uint8_t z; volatile char stop = 1; void timer1_init() { z=0; //Schaltet zunächst alle Kontroll Register in TCCR1x aus TCCR1A=0; TCCR1B=0; //Schaltet das Zaehlregister zunaechst auf null, wobei es spaeter in abhaengigkeit von der internen Taktzahl, dem Prescaler und OCR1A // neu gesetzt wird. (Taktzahl/Prescaler_Takt/OCR1x = 11059000Hz/1024/250 //Ist letztendlich die Anzahl der Aufrufe des Interupts pro Sekunde, also: 43. Deshalb wird die Lampe alle 43 Aufrufe an und aus geschaltet. TCNT1=0; //Manipuliert den letztendlichen Takt OCR1A=250; //OCR1B=250; //Der Prescaler wird auf 1024 gesetzt und der Timer wird in den CTC-Mode gesetzt(WGM12) TCCR1B=(1<<CS10)|(1<<CS12)|(1<<WGM12); // aktiviere IRQ cnt1 TIMSK=(1<<OCIE1B)|(1<<OCIE1A); sei(); }; // ////////////////////////////////////////////////////////////////////// // Wartet etwa t*10 ms. // timer_10ms wird alle 10ms in der Timer1-ISR erniedrigt. // Weil es bis zum nächsten IRQ nicht länger als 10ms dauert, // wartet diese Funktion zwischen (t-1)*10 ms und t*10 ms. void xwait_10ms () { int i=0; for(i=0;i<2000;i++); } // ////////////////////////////////////////////////////////////////////// // Die Interrupt Service Routine (ISR). // In interrupt_num_10ms werden die IRQs gezählt. ISR(TIMER1_COMPA_vect) { #if 1 //PORTA ^= (1<<5); z++; if(z>=43) { stop ^= 1; z=0; } #endif } // ////////////////////////////////////////////////////////////////////// // Das Hauptprogramm: Startpunkt int main() { wdt_disable(); DDRA = 255; DDRD = 255; PORTA = 255; PORTD = 254; // Timer1 initialisieren timer1_init(); #if 1 while(1) { if ( stop == 1 ) { PORTA &= ~(1<<0); } else { PORTA |= (1<<0); } } #endif PORTD = 0; }