-
-
Moderator
Robotik Visionär
Hallo
Das es aus asuro.c stammt ist schon klar, ich wollte dich nur etwas in Richtung der Lösung "schieben". Da du dir schon einiges selbst erarbeitest hast wollte ich dir den Weg zeigen die Lösung selbst zu finden.
Der Timer wird im Overflow-Mode betrieben, das bedeutet, immer wenn der Timerzähler 255 überschreitet (Timer2 ist ein 8 Bit-Timer) passiert irgendwas. Nach dem Überlauf startet der Timer in diesem Modus beim Wert der in OCR2 steht. Standartmässig ist in der Lib der Interrupt aktiviert:
TIMSK |= (1<<OCIE2);
Im Timermaskregister wird so das Bit gesetzt welches den Overflow-Interrupt erlaubt (O verflow C ounter I nterrupt E nable 2). Wenn das Register überläuft wird zur Interruptserviceroutine ISR) für den Überlauf des Timer 2 gesprungen. Das ist so ähnlich wie der Aufruf einer Funktion. In der Lib wird eine ältere Schreibweise für die ISR verwendet:
SIGNAL (SIG_OVERFLOW2)
{
}
Das solltest du in asuro.c auch finden und dort wird auch count72kHz geändert. Diese ISR must du nun selbst einfügen sonst setzt der Kompiler hier nur eine Dummy-ISR mit einem return ein. Und hier gehört auch das "volatile" dazu: Es teilt dem Kompiler mit das es eine Variable ist die in einer ISR verändert wird. Dadurch muss er sie anders speichern, aber ich schweife ab...
Die ISR wird während deiner while (count72kHz < 72);-Schleife quasi im Hintergrund ausgeführt. Deshalb wird count72kHz nach 72 Aufrufen (=Interrupts) so groß wie 72 und deine Schleife wird beendet.
Neben dem Bit im TIMSK müssen auch die globalen Interrupts freigegeben werden:
sei();
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen