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:
Code:
#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
}
Danke für eure Hilfe
GR Bongo
Lesezeichen