Hallo, ich habe mir gerade einige Anleitungen zur Programmierung mit Timern angeschaut, habe jedoch noch einige Fragen bzgl. den Interrupts, die von den Timern ausgelöst werden. Wie eingangs im Betreff erwähnt möchte ich zum Test eine LED (PD5) im Timer-Intervall des Timers 0 blinken lassen. Um etwas zu sehen, wollte ich das Prescaling auf Takt/1024 stellen, also setze ich im Register TCCR0 folgende Bits: CS00: 1 CS01: 0 CS02: 1 Der Interrupt soll ausgelöst werden, wenn ein Overflow der Timer-Variable vorliegt. Welche Bits müssen hierfür noch gesetzt werden und wie fange ich diesen Interrupt dann ab? Habe zwar einige Tutorials gefunden, allerdings waren die alle für Assembler und das kann ich nicht wirklich. Ich programmiere mit AVR-GCC unter Linux. Vielen Dank!
> Habe zwar einige Tutorials > gefunden, allerdings waren die alle für Assembler und das kann > ich nicht wirklich. Auch in Assembler werden dieselben Register mit denselben Werten belegt.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | // Timer/Counter0 Overflow
|
5 | //
|
6 | ISR( TIMER0_OVF_vect ) |
7 | {
|
8 | // ... mach was
|
9 | }
|
10 | |
11 | int main(void) |
12 | {
|
13 | |
14 | //
|
15 | // Konfiguration Timer0
|
16 | //
|
17 | TCCR0 |= (1 << CS00) | (1 << CS02); |
18 | TIMSK |= (1 << TOIE0); // Overflow Interrupt |
19 | |
20 | sei(); |
21 | |
22 | while(1) |
23 | {
|
24 | }
|
25 | }
|
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Hi Was ist an Assembler so schwer ? Es ist die einfachste Art, ein Programm zu coden und zu wissen, was sich auf dem Chip tut. Wer C beherscht, weiß noch lange nicht, wie oft ein Wert in den Registern manipuliert wird. Erkann nicht so einfach sagen, dieser Programmabschnitt wird in 31 µSek durchlaufen. Aber das braucht er vermutlich auch nicht. Andererseits, grad bei Bitbearbeitung ist's nicht verkehrt, wenn die Manipulation der Werte im Programm "sichtbar" ist. Und umfangreiche Programme lassen sich in C genauso unübersichtlich wie sich Assemblerprogramme mit den richtigen Methoden übersichtlich gestalten lassen können. Von daher ist es kein Grund, Assemblerroutinen von vorn herein abzulehnen. Ich glaube eher, das liegt nicht an der Programmiersprache, sondern daran, das ein Anderer seine Gedanken zu einem Programm geformt hat. Und wenn eines schwierig ist, ist es Programme anderer zu analysieren. Geht mir mit C, Basic, Pascal und Assembler und diversen anderen Steuerungs-Programmen genauso. Nur meine eigenen Versuche sind völlig logisch und klar.... (Ironie aus) Übrigends sehen es meine Kollegen genauso. Versuch doch mal, die in den Tutorialsbesschriebenen Programme abzuarbeiten. Soviel Code ist's ja nicht und man kann sehr leicht nachvollziehen, was da geschieht. Hast du die Timer verstanden, ist's mit dem Blinken kein Problem mehr. Dafür ist eine XOr Verknüpfung bestens geeignet. Ich habe mir in meine Programme ein Blink-Maske gebaut.
1 | LDS R10, Blink_Mask ; Register 10 mit Variable laden |
2 | LDI R11, 0b11111111 ; Register 11 mit logischen 1sen belegen |
3 | (nicht wegen dem Format meckern, ich weiß, das es auch anders geht) |
4 | EOR R10, R11 ; XOr mit 1 ergibt in Variable andere Bitlage |
5 | STS Blink_Mask, R10 ; Variable zurückschreiben |
6 | LDS R11, Ausgabe ; Ausgabewert holen |
7 | AND R11, R10 ; Und BlinkMaske |
8 | STS Ausgabe ; und zurückschreiben, Ausgabe erfolgt in eigener UP |
Damit erhälst du eine Blinkende Ausgabe, wenn du diese Zeilen in bestimmten Zeitintervallen aufrufst. Gruß oldmax
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.