Hallo Forum!
Hier mein erstes eigenes "Programm" (Atmga8):
- an PORTB sollen die LEDs blinken
- mit Tastern an INT0 und INT1 (PD2; PD3) soll die Frequenz verändert
werden
Der erste Teil funktioniert (über Timer-Overflow mit Teiler 3 und einem
Zählregister, das jedes 7. Mal eins höher zählt - ist vermutlich nicht
sehr elegant, aber ich wollte beide Möglichkeiten kombinieren, aus
Trainingsgründen).
Der zweite Teil macht gar nix (Änderung des Teilers für den
Timer-Overflow). Ich wüsste auch nicht, wie man das im AtmelStudio
simulieren könnte...
Hier der Code:
Der "timer0_overflow" wird immer ausgelöst, wenn der Zähler überläuft.
Wenn du im int0 / int1 ein einziges mal "count" in den Zähler schreibst,
dann zählt er das erste Mal vom Wert "count" bis er überläuft, danach
aber immer wieder komplett durch.
Schreib in deinem "timer0_overflow" den Wert "count" in den Zähler
TCCR0, damit er jedesmal von count startet.
Externe Interrupt INT0 und INT1 müssen über das GIC-Register gültig
gesetzt werden (2486X–AVR–06/10 - Seite 67)
Dazu wirst Du vermutlich das Problem haben, das die Taster prellen. Aber
das ist ein anderes Thema.
Das hier
> ldi count, 3 ; CS00 setzen: Teiler 3 (Startwert von count)> out TCCR0, count
macht aber nicht, was du denkst bzw. was du dir davon erhoffst.
Das ist kein Teiler 3.
Da werden die Bits 0 und 1 im TCCR0 gesetzt. Die Namen der Bits sind
CS01 und CS00. Das ist ein Vorteiler von 64.
Man kann natürlich den Vorteiler eines Timers im laufenden Betrieb
verändern. Ob du das willst, ist allerdings eine andere Sache. Denn: so
viele Vorteiler gibt es nicht und die sind dann auch noch recht grob
abgestuft. Es gibt die Vorteiler: 1, 8, 64, 256 und 1024. Das wars dann
schon, dann ist Ende der Fahnenstange. Mit jeder Stufe wird dein Blinken
also 8 mal langsamer. Die Sonderfälle 0 und externer Takt mal aussen vor
gelassen.
Guter Rat:
Studier das AVR-Tutorial. Da scheint mir mit deinem Verständnis von
Timern einiges im argen zu liegen.
Tasten am externen Interrupt: kann man machen, muss man nicht machen.
Wenn man es aber macht, dann muss man den Interrupt auch freigeben.
Und ja, man kann das im Simulator auch simulieren. Nur weil ein externer
Interrupt an einem Pin freigegeben wurde, bedeutet das nicht, dass der
Simulator das Setzen bzw. Rücksetzen eines Pins im I/O View verhindern
würde. Klickst du dort mit der Maus den zugehörigen Pin an und setze den
Pin auf 1 oder 0, dann wird selbstverständlich der zugehörige Interrupt
im Simulator je nach Konfiguration des Interrupts auch ausgelöst und die
Simulation verzweigt in den Interrupt Vektor. Ein dort platzierter
Haltepunkt spricht dann an.
Danke soweit einmal! Ich werde das über Ostern durcharbeiten. Jedenfalls
macht es wirklich Spass --- vor allem mit der Unterstützung in dem
Forum.
Wirklich: Es ist super, dass man sich auch nicht auskennen und Fehler
machen darf, ohne dumme Kommentare zu hören.
Danke und schöne Ostern!
Chris