Hallo Leute! Ich habe einen Zähler, der externe Ereignisse zählt. Ist ein bestimmter Wert erreicht, wird ein Interrupt ausgelößt. Mein Programm muss warten, bis dieser Int ausgelößt wurde. wie läßt sich dies realisieren? loop_until_bit_is_set(Timer3, COMP3); läuft nicht! :-( Ich verwende den Timer 3 des AT128. Danke für Hilfe
Warten auf Interrupt = Warten auf Godot! Sinn und Zweck der Interruptgeschichte ist, daß ein Proramm NICHT warten muss. Das klassische Hauptprogramm rattert asynchron seine Schleife(n) ab und prüft regelmäßig das Vorhandensein eines Ereignisses, z.B. das Kippen eines Flags, daß Du in der Interruptroutine gesetzt hast.
Naja, wenn er sowieso nix anderes zu tun hat, kann man natürlich auch auf dieses Interrupt-Flag warten -- aber dann sollte man eben gerade keine Interruptroutine dafür haben. Wenn man eine hat, setzt man in dieser einfach ein Bit und wartet im Hauptprogramm auf dieses:
1 | #include <stdint.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/signal.h> |
4 | #include <avr/io.h> |
5 | |
6 | volatile struct { |
7 | uint8_t comp3a_int: 1; |
8 | } intbits; |
9 | |
10 | SIGNAL(SIG_OUTPUT_COMPARE3A) |
11 | {
|
12 | intbits.comp3a_int = 1; |
13 | }
|
14 | |
15 | ...
|
16 | int
|
17 | main(void) |
18 | {
|
19 | ...
|
20 | for (;;) { |
21 | if (intbits.comp3a_int) { |
22 | intbits.comp3a_int = 0; |
23 | /* handle it */
|
24 | }
|
25 | ...
|
26 | }
|
27 | |
28 | return 0; |
29 | }
|
Auf welchem Controller programmierst du ? Manche uC unterstuetzen ein entsprechendes Assembler Kommando. Ich finde das uebrigens sehr sinnvoll, um z.B. mit dieser Methode Strom zu sparen.
Das Kommando is SLEEP. Hier ist ein link auf das AVR GCC Tutorial : http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Sleep-Modes
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.