Guten Tag,
in einem Projekt von mir mag ich den ATmega88PA in den Idle-Modus
schicken, leider hab ich noch ein paar Verständnisprobleme.
Erstmal zu ein paar Grundlege Verwendungen vom AVR:
Timer0 schaltet Ports, inkremitiert, vergleicht Variable und endprellt
tasten -.- (bitte noch nichts sagen). Hier zu habe ich nacher die Frage
Timer1 erzeugt ein PWM-Signal, das er ja auch weiterhin in dem Idle
macht.
Timer2 läuft asynchron mit 32kHz und setzt nur ein Flag
Die main() besteht im weschentlichen nur aus eine Switch-case-Anweisung.
In den einzelnen Zuständen werden die Taster abgefragt, um in einen
anderen Zustand zu wechseln, und sehr selten auch vereinzelt Funktionen
aufgerufen.
Dieses ständige „sinnlose“ durlaufen der Switch-case wollte ich jetzt
einen Ende machen!!
Meine Plan: Den Atmega88 in den Idle- Modus zuschicken und ihn alle 3ms
von Watchdog aufzuwecken.
Meine Frage: Kann der AVR den Timer0-Interrupt so abarbeiten, obwohl die
CPU und der Flash schläft? Wachen die für den Interrupt wieder auf? Ist
dieses vorgehen überhaupt sinnvoll?
Timer0-interrupt: jede ms
1 | ISR(TIMER0_COMPA_vect)
|
2 | {
|
3 | PORT_ZEILE = 0; // wegen dem glimmen, test
|
4 |
|
5 | PORT_SPALTE = (~(1<<(spalte+1))|adc_transitor|spi_cs); //~(1<<(spalte)<<1)
|
6 | PORT_ZEILE = daten[spalte];
|
7 | if(++spalte > 5)
|
8 | spalte = 0;
|
9 |
|
10 | // wacke_up_flag = 1;
|
11 | }
|
Beispielhafte und unvollständige main:
1 | int main(void)
|
2 | {
|
3 | //Variablen definition
|
4 | // Port, ADC, Timer, .. Initialisierung
|
5 | sei();
|
6 |
|
7 | while()
|
8 | {
|
9 | // ADEN-BIT für ADC-enable löschen,
|
10 | // sonst wird eine neue Messung gestartet
|
11 | ADCSRA &= ~(1<<ADEN);
|
12 |
|
13 | set_sleep_mode(SLEEP_MODE_IDLE);
|
14 | sleep_mode(); // in den Schlafmodus wechseln
|
15 |
|
16 | // Aufwachpunkt
|
17 | if (wacke_up_flag==1)
|
18 | {
|
19 | wacke_up_flag=0;
|
20 | // ADEN-BIT für ADC-Enable setzten
|
21 | ADCSRA |= (1<<ADEN);
|
22 |
|
23 | }
|
24 |
|
25 | // hier kommt jetzt die Tastenentprellung hin
|
26 | // und weite kleine Aufgabe die vorher in der ISR waren
|
27 |
|
28 | switch(state)
|
29 | {
|
30 | …..
|
31 | }
|
32 | } // ende While(1)
|
33 | } // ende main
|
Würdet ihr die Hauptschleife jede ms mit der ISR von Timer0 aufrufen?
Wie löse ich das Aufwecken vom uC mit dem Watchdog am besten?
Vielen Dank und Grüße
fred