Hallo ich verwende einen AT90CAN128 dort wollte ich den Sleepmode verwenden damit der Prozessor zwischen zwei schleifendurchgängen schlaffen geht. Die Schleifen sollen immmer zu definierten zeitpunkten durchlaufen werden. Dazu soll der Sleepmode von einem bestimmten Timer aufgeweckt werden. Alle anderen Interrupte welche ich verwende sollen den Sleepmode nicht beenden. Ich habe also den mir den IDEL Mode eingestellt und den Prozessor schlafen gelegt. Nun habe ich aber festgestellt das der Sleepmode immer serh viel früher verlassen wird als er soll, und zwar immer dann wenn ein anderer Interrupt vor dem Timerinterrupt auftrat. Ist das normal? Beim MSP kenne ich das so das der Sleepmode erst deaktiviert werden muss damit der Prozessor aufwacht. Dort können andere Interrupte auftretten aber der Sleepmode wird erst verlassen wenn ich das will (und einprogrammiert habe) und nicht nach jedem Interrupt. Wie kann ich dem AVR das beibiegen das der Sleepmode nur bei meinem Timerinterrupt veralssen wird nicht aber bei anderen Interrupten? Die anderen Interrupte müssen aktiviert sein.
Man muss den sleepmode richtig konfigurieren. Entweder sollen interrupts aktiv sein, oder eben nicht.
Naja Interrupt schon aber nur von einem bestimmten Interupt das kann doch nicht so schwierig sein andere Mikrocontrolelr können das doch auch.
@ Tobias Korrmann (kurzschluss81) >Ich habe also den mir den IDEL Mode eingestellt und den Prozessor >serh viel früher verlassen wird als er soll, und zwar immer dann wenn >ein anderer Interrupt vor dem Timerinterrupt auftrat. Ist das normal? Ja, siehe Sleep Mode. >Beim MSP kenne ich das so das der Sleepmode erst deaktiviert werden muss >damit der Prozessor aufwacht. Dort können andere Interrupte auftretten >aber der Sleepmode wird erst verlassen wenn ich das will (und >einprogrammiert habe) und nicht nach jedem Interrupt. Der MSP430 ist da halt anders. >Wie kann ich dem AVR das beibiegen das der Sleepmode nur bei meinem >Timerinterrupt veralssen wird nicht aber bei anderen Interrupten? Die >anderen Interrupte müssen aktiviert sein. Muss man in deine State Machine in der Hauptschleife einarbeiten, siehe auch Interrupt. MfG Falk
Nimm ein Flag:
1 | volatile uint8_t sleep_flag; |
2 | // ...
|
3 | sleep_flag = 1; |
4 | do
|
5 | sleep_cpu(): |
6 | while( sleep_flag ); |
7 | // ...
|
8 | ISR( x ) |
9 | {
|
10 | sleep_flag = 0; |
11 | }
|
Peter
Ich glaube, Du bringst da einiges durcheinander. Aus dem Sleep als Zustand wird der AVR von jedem Interrupt geweckt, sofern dieser Interrupt das Recht hat, den AVR aus diesen Sleepmodus zu wecken (siehe Datenblatt, Sleep-Modi). In den Sleep gelegt wird der AVR nicht durch Einstellen eines Sleep-Modus, sondern durch Aufruf des ASM-Befehls "sleep". Mit dem Sleep-Modus wird vorgewählt, in welchen Sleep-Mode der AVR fallen soll, wenn der ASM-Befehl "sleep" auftritt. Idle legt nur den CPU-Takt still und kann von jedem Interrupt geweckt werden. ADC-Noise-red. legt auch den Takt für die Timer still und kann daher nicht vom Timer geweckt werden. Power-Down legt auch andere Takte (Timer, I/O, ADC) still und kann nur von Low-Level-Int, TWI, Timer2 im Async-Mode und PinChange geweckt werden, wobei das von AVR-Typ zu AVR-Typ unterschiedlich ist, siehe Datenblatt. MfG
@Klugscheißender Consulter nein ich bringe dort nichts durcheinander "Lästern an" bei einem Vernüftigen Controller ala MSP430 "Lästern aus" schaltet man den Sleep modus ein und wieder aus. Interupte werden auch im Sleepmodus bearbeitet. Aber das abschalten des Sleeps Modus muss durch das setzen eines Bits in einem Hardwareregister geschehen, und nicht dadurch das "nur" ein Interrupt ausgelöst wird. das heist das der Controller nach der abarbeitung eines Interruptes wieder automatisch in den Sleepmode geht solange dieser aktiviert ist.
Tobias Korrmann schrieb: > "Lästern an" > bei einem Vernüftigen Controller ala MSP430 > "Lästern aus" Das ist höchstens Geschmackssache. Der AVR macht eben das automatisch, was man beim MSP noch händisch machen muß. Und oftmals ist das richtig. Und wenn man es mal anders haben will, macht man es eben mitm Flag (siehe oben). Und wer dafür kein Byte verschwenden will, kann auch das SE-Bit nehmen. Peter
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.