mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sleepmodus? Mit "SBI MCUSR,SE" oder mit "SLEEP?


Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wollte mal kurz fragen wie ich den µC in den Sleepmodus bekomme, habe
schon alles eingestellt. Wei0 aber nicht ob der letzte Befehl das
ausführt oder ob man dann noch sleep schreiben muss. Die AD-Wandlung
sollte ja laut Datenblatt automatisch starten und der
"Fertig"-Interrupt sollte mir den µC wieder wecken, aber wo landet er
dann muss da eine Interrupt-Routine hin oder ist es irgendwie möglich
das Programm dort weiterlaufen zu lassen wo es zuletzt stand?

sbi ADCSR, ADIE   ;AD interrupt enable
sbi ADCSR, ADEN   ;AD enable
cbi MCUSR, SM1    ;Noise reduction mode
sbi MCUSR, SM0    ;Noise reduction mode
sbi MCUSR, SE     ;Sleep enable

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MCUSR???

War das nicht MCUCR?

Trotzdem ist bitweiser Zugriff nicht möglich, musst schon byteweise
darauf zugreifen.

Um Sleep nutzen zu können musst du bei Init SE in MCUCR setzen. Und
dann im Programm SLEEP aufrufen, damit er bis zum nächsten Int pennt.
Ich mach das üblicherweise in der Hauptschleife, nachdem geprüft wurde,
dass alle anstehenden Jobs erledigt wurden. Für ADC-Betrieb
(Noise-reduction) sollte SLEEP direkt auf das Setzen von ADEN in ADCSR
folgen.

...

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar soll natürlich MCUCR sein.
ich setzte jedes Bit einzeln damit ich nichts durcheinander würfle,
wenns z.b. mit ADCSR, ADEN geht sollte es mit SM1 und SM0 doch auch
gehen oder meinst du das ich es so machen sollte

ldi temp,0b00000100 ;Vorteiler auf 16
out ADCSR,temp      ;8Mhz / 16 = 125kHz

statt so

sbi ADCSR, ADPS2

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wei0 aber nicht ob der letzte Befehl das ausführt oder ob man dann
> noch sleep schreiben muss.

Letzteres. Aus der Beschreibung des SE-Bit:

"The SE bit must be written to logic one to make the MCU enter the
sleep mode when the SLEEP instruction is executed. To avoid the MCU
entering the sleep mode unless it is the programmer’s purpose, it
is
recommended to set the Sleep Enable (SE) bit just before the
execution of the SLEEP instruction."

Ncoh klarer geht's doch nicht.

> Die AD-Wandlung sollte ja laut Datenblatt automatisch starten und
> der "Fertig"-Interrupt sollte mir den µC wieder wecken,

Genau.

> aber wo landet er dann muss da eine Interrupt-Routine hin oder ist
> es irgendwie möglich das Programm dort weiterlaufen zu lassen wo
> es zuletzt stand?

Einfach im Interrupt-Vektor ein reti eintragen. Wenn der Interrupt
ausgelöst wird, wird auf jeden Fall dorthin gesprungen. Aber wer sagt,
daß du dort was tun mußt? Und nach einem reti aus der Interrupt-Routine
wird sowieso hinter dem sleep weitergemacht.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel für SLEEP (ohne ADC):

Irgendwo in der Initialisierung des ABRs:

 ldi wl,1<<se               ;Schlafmode
 out mcucr,wl               ;aktivieren

;Einzelbit-Zugriff per SBI ist nicht möglich, da MCUCR oberhalb
;I/O-Adresse $1F liegt. SBI/CBI geht nur von $00 bis $1F...

Dann in der Mainloop:

mainloop:       ;Hauptschleife
 sbrc key_reg,key_press     ;Taster erneut gedrückt? nein...
 rjmp neuimp                ;ja, abarbeiten...
 sleep                      ;schlafen gehen
 rjmp mainloop              ;nochmal...

Der AVR geht pennen, der Interrupt (hier Timer0 des AT90S1200) weckt
ihn auf, es wird die ISR abgearbeitet und nach RETI der Befehl hinter
SLEEP. Also zurück zu Mainloop, auf unerledigte Jobs testen (oft sind
da mehrere Flags zu prüfen) und danach pennen gehen. Die Jobs (hier
"neuimp") enden mit "rjmp mainloop", damit vor dem Schlafen erst
alle Jobs abgearbeitet werden. Die Jobflags werden natürlich von der
Jobroutine gelöscht.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ABR soll natürlich AVR heißen...

(schäm)...

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so danke nochmals an alle. Denke jetzt bekomme ich es hin.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.