hallo,
es geht um den sleep modus auf einem meiner mikrokontroller (sleep=keine
CPU Taktung). meine interrupts muessen sehr kurz sein. deshalb setze
ich in meinen interruptroutinen nur ein flag, dass etwas gemacht werden
muss. die eigentliche arbeit wird dann in der main gemacht, die ja
durch die interrupts geweckt wird
void main(){
while(1){
if(TueEtwasFlag1){
TueEtwasFlag1=0;
TueEtwas1();
}
if(TueEtwasFlag2){
TueEtwasFlag2=0;
TueEtwas2();
}
if(kein Flag gesetzt){
// <------------------- problemzeitpunkt
sleep();
}
}
}
mein problem ist nun, dass diese Flags irgendwann gesetzt werden können.
mal kommen diese sehr oft und mal sehr selten. wenn nun ein flag
gesetzt wird, während des "problemzeitpunkts" geht mein kontroller
schlafen, obwohl noch was zu tun ist.
wie kann ich dafuer sorgen, dass der kontroller nur schlafen geht, wenn
auch wirklich keine arbeit mehr anliegt????
danke schonmal fuers lesen
moklok
@ Can Cobe (moklok)
>wie kann ich dafuer sorgen, dass der kontroller nur schlafen geht, wenn>auch wirklich keine arbeit mehr anliegt????
Das muss deine State Machine in der Hauptschleife machen. Siehe [[Sleep
Mode]] und Statemachine
MFG
Falk
>wie kann ich dafuer sorgen, dass der kontroller nur schlafen geht, wenn>auch wirklich keine arbeit mehr anliegt????
Wichtig ist, erst mal zu erkennen, dass keine Arbeit mehr anliegt.
Kannst du das? Welche Art von Arbeit (Interrupts) ist das?
Can Cobe schrieb:> wie kann ich dafuer sorgen, dass der kontroller nur schlafen geht, wenn> auch wirklich keine arbeit mehr anliegt????
Einfach Interrupt sperren:
AVR Instruction Set:
"SEI – Set Global Interrupt Flag
Description:
Sets the Global Interrupt Flag (I) in SREG (Status Register). The
instruction following SEI will be executed before any pending
interrupts."
Peter
Und ich ärgere mich gerade über die AVR Datenblätter (ATmega128RFA1,
ATmega1281)... Da steht alles mögliche über die sleep modes, aber
nirgends, dass man nach dem setzen der ganzen Register noch den
Assembler Befehl "sleep" braucht!
X- Rocka schrieb:> Da steht alles mögliche über die sleep modes, aber> nirgends, dass man nach dem setzen der ganzen Register noch den> Assembler Befehl "sleep" braucht
naja, aber durch mitdenken fragt man sich ja ab wann der Prozessor nun
wirklich schläft oder nicht?
Peter schrieb:> X- Rocka schrieb:>> Da steht alles mögliche über die sleep modes, aber>> nirgends, dass man nach dem setzen der ganzen Register noch den>> Assembler Befehl "sleep" braucht>> naja, aber durch mitdenken fragt man sich ja ab wann der Prozessor nun> wirklich schläft oder nicht?
Hast ja recht, bin ja auch irgendwann drauf gekommen, dass nur Register
setzen es nicht sein kann. Aber auch erst, als ich mir das Datenblatt
samt Instruction Set des ATmega1281 angesehen habe. Spiele nämlich
gerade wieder mit dem RFA1 rum, und da haben die nicht das Instruction
Set reingepackt.
X- Rocka schrieb:> Da steht alles mögliche über die sleep modes, aber> nirgends, dass man nach dem setzen der ganzen Register noch den> Assembler Befehl "sleep" braucht!
ATmega1281 Datenblatt S.56:
"• Bit 1 – SE: Sleep Enable
The SE bit must be written to logic one to make the MCU enter the sleep
mode when the SLEEP instruction is executed."
Also ich finde das eindeutig.
Wenn ich eine Funktionseinheit im AVR programmiere, gehe ich immer in
die dafür zuständige "Register Description" und klappere die ab.
Dann läuft auch fast alles auf Anhieb.
Peter