Hallo miteinander,
Habe mich nochmals mit dem Ganzen befasst, mir ist nun einiges klarer geworden, doch leider noch nicht alles:
1. Warum rechnet der compare2 die 36kHz mal zwei?
2. Die ganzen Timer-Einstellungen (TCCR2,OCR2 und TIMSK) (habe die werde gefunden im ATmega8 Datenblatt, jedoch noch nicht verstanden. Werde es aber nochmals selbst versuchen)
3. Die Sekunde die er warten soll ist länger als eine Sekunde (habe ein eigenes makefile erstellt und dort eine ATmega8 und den Takt mit 8MHz definiert)
Hoffe ihr könnt mir bei der Frage 1 und 2 weiter helfen.
Hier noch mein Funktionierender Code:
Danke für eure HilfeCode:#include <avr/io.h> #include <avr/signal.h> //Front LED an Port D6 #define D6 (1<<PD6) // unsigned char= Wertbereich ohne Vorzeichen von 0-255 // volatile = wird benutzt, um eine Variabel der Interrupt-Rutine zu geben volatile unsigned char count72kHz; // Rutine die mit 36Khz arbeite. Alle [1/(36*2)= 13.89müs] wird count72kHZ um 1 erhöht SIGNAL (SIG_OUTPUT_COMPARE2) {count72kHz ++;} // int = Wertbereich von (-32768)-32767 int i; // main Prozess wird gestartet int main (void) { // Port D6 wird als Ausgang gesetzt DDRD |= D6; // WGM21 = Mode 2 -> CTC // COM20 = auf OC2 auf gleichen Wert vergleichen // CS20 = kein prescaling TCCR2= (1<<WGM21) | (1<<COM20) | (1<<CS20); // 0x6E 110 OCR2 = 0x6E; //Overflow-Interrupt aktivieren TIMSK |= (1<<OCIE2); sei (); //alle Interrupts einschalten while (1) { //Endlosschleife starten PORTD |= D6; //Port D6 auf high for (i= 0; i < 1000; i++) // i ist 0, warten bis i 500 hat, i plus 1 { count72kHz = 0; //Variabel count72kHz ist 0 while (count72kHz < 72); //warten bis count72kHz 72 hat } PORTD &= ~D6; //Port D6 auf low for (i= 0; i < 1000; i++) //sieh oben { count72kHz = 0; while (count72kHz < 72); }} return 1; //zurück zu main, wird aber nicht erreicht }
GR Bongo






Zitieren

Lesezeichen