www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Power Down Sleep Mode


Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte mittels einem Taster mein AT90S8515 in den Power Down Modus 
schicken!
Wenn er Schläft, soll Pin 2 an PortC auf null gesetzt sein und sonst 
soll dieser Pin auf eins sein!
Um den Prozessor zu wecken muss ich ja ein Low Signal geben, welches 
länger als ein Reset Signal ist. Ich setzte darum den Interrupt auf Low 
Level erkennung!
Nun testete ich mein Programm (siehe Anhang) Wenn ich nun ca. 1 Sekunde 
auf mein Taster drücke, geht er schlafen! Wenn ich wieder eine Sekunde 
auf mein Taster drücke erwacht mein Prozessor nicht immer! Es kommt vor, 
dass ich über 10 sekunden lange auf dem Taster bleiben muss!
Kann es sein, dass man den uP nicht schnell nacheinander aus und ein 
(schlafen und wecken) schalten kann????

Oder habe ich im Source einen Fehler???

Vielen Dank für die Hilfe

IZoard

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Reset Signal ist ja ca 11ms darum habe ich rasch ein Low Signal an 
meinem Interrupt 0, welches länger als das Reset Signal ist, darum 
verstehe ich nicht, wieso ich teilweise so lange ein LOW Signal anlegen 
muss, damit er wieder erwacht!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Izoard,

Wenn ich das richtig verstehe, willst Du einen Flip-Flop bauen.

Dann laß doch den Power Down Mode weg und bringe erstmal den Flip-Flop 
zum laufen.

Die meisten Fehler werden beim Entprellen der Tasten gemacht. Und das 
bewirkt dann, daß eine Flip-Flop scheinbar völlig unkontrolliert 
umschaltet.

Zum Entprellen habe ich hier was geschrieben:

http://www.specs.de/~danni/appl/soft/keyscan/index.htm


Die Messung, ob mindestens 1s gedrückt wurde, muß dann nach dem 
Entprellen erfolgen.


Beim Power Down gibt es noch zu beachten, daß wenn die Taste kürzer als 
16ms gedrückt wurde der µC zwar aufwachen kann, aber nicht den Interrupt 
ausführt und direkt nach dem Sleep weitermacht.


Peter

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Izoard,
beim Durchgehen Deines Quellcodes ist mir aufgefallen, dass Du beim 
Eintritt in die Interruptroutine nicht das Statusregister gesichert 
hast. Mach das bitte, sonst veränderst Du in der Interruptroutine die 
Statusflags und Dein Hauptprogramm kommst so ins Schleudern.

int0_handler:
in    rSREG_BAK, SREG
...
out   SREG, rSREG_BAK
reti


Grüße
Oliver

Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank schon mal für die Hilfe, ich habe nun beide 
Verbesserungsvorschläge gemacht!!!
Mir ist noch aufgefallen, beim durchsteppen im AVR Studio, springt er 
vom "reti" des "noflag" labels zum "int0_hander" - label! Ich finde den 
Fehler jedoch nicht!!!
Hier nochmals die Interrupt Routine:



int0_handler:
  in  sreg_bak, sreg
  lds  mpr, $0072    ;Wenn Flag gelöscht ist,
  cpi  mpr, 0      ;springe zu Noflag
  breq  noflag      ;
        ldi  mpr, 0      ;Flag löschen
  sts  $0072, mpr    ;
  out  sreg, sreg_bak
  reti        ;Retour aus Interrupt

noflag:  ldi  mpr, 1      ;Flag setzen                 sts  $0072, mpr 
;
  out  sreg, sreg_bak
  reti        ;Retour aus Interrupt



Ich hoffe jemand sieht den Fehler...

IZAORDS

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie geht's nach dem SLEEP Befehl weiter ???

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem SLEEP Befehl muss ja dieses Low Signal den uC wieder wecken und 
dann wird der Interrupt ausgeführt!!! Habe ich gedacht....
Stimmt das????

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip ja und wohin kehrt er dann zurück ???

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem Interrupt??? solllte er wieder in den loop zurückkehren!!
Wie muss man das programmmieren???

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann solltest du hinter dem SLEEP Befehl folgende Befehle einfügen:
NOP
NOP
NOP
NOP
RJMP LOOP
Die 4 NOP Befehle sind nur Platzhalter, da die AVR Prozessoren ein paar 
Taktzyklen (siehe Datenblatt) brauchen um die Interrupt Flags nach dem 
Aufwachen zu aktualisieren.

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey cool vielen Dank! jetzt funktionierts :-))))

Autor: Izoard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
leider funktionierts nur richtig im Simulator!! als ich das Programm 
real testen wollte, war wieder das selbe Phänomen, wie früher, nämlich 
das der uP nicht bei jedem Tastendruck aufwacht! und beim abschalten, 
schaltet er manchmal, nach dem ich die Taste losgelassen habe wieder 
ein! wirklich komisch!
der Taster habe ich mit einem Verzögerungsglied und einem Schmittrigger 
entprellt!

Izoard

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe mal Deinen Quellcode runtergeladen und in das AVR-Studio 
integriert. Ein paar Mal durchgestept um mir ein Bild zu machen. Ich 
glaube an dem ganzen Konzept muss noch gearbeitet werden.

Der Interrupt ist Pegel-getriggert, das heißt, so lange ein low-Pegel 
anliegt, wird jedesmal der Interrupt sofort wieder ausgelöst, sobald er 
durch ein reti verlassen wurde.

Ist das so gewollt?

Oliver

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum durchsteppen habe ich den Interrupt auf Flanke-getriggert, damit ich 
das programm überprüfen konnte! Jedoch muss ich den Interrupt Pegel 
triggern, damit mein uP aus dem Power Down Modus erwacht! Oder habe ich 
das falsch verstanden?

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, um aus dem Sleep-Modus wieder aufzuwachen muss der Interrupt schon 
pegelgetriggert sein. Das Problem ist nur, dass der Interrupt ständig 
erneut aufgerufen wird und so die Abarbeitung des restlichen Codes 
verzögert.

Man müsste den Interrupt, nachdem er das erste Mal aufgerufen wurde, für 
eine gewisse Zeit sperren.

Oliver

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber der interrupt wird doch nicht ständig auferufen, wenn ich ein 
Taster, der inaktiv den Interrupt eingang auf High zieht und aktiv den 
Eingang auf low setzt!!!

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme an, Du verwendest das STK500(200)-Board. Ich bin mit dieser 
negativen Logik und den Tastern immer auf Kriegsfuss.
Also, wenn Du den Taster runterdrückst, dann hast Du einen Low-Pegel. 
Und bei einem Low-Pegel wird die Interruptroutine ständig aufgerufen, so 
daß der restliche Code zu diesem Zeitpunkt fast gar nicht mehr zur 
Ausführung kommt.
Ich nehme an, daher rührt auch die zeitlich Verzögerung der 
Kontrollerreaktion, die Du schon weiter oben beschrieben hast.

Autor: Izoard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohhh ja, du hast recht, vielen Dank!
Ich habe nun eine WArteschleife am Anfang der Interrupt Routine gesetzt 
und nun funktioniert's :-)
Vielen Dank nochmals

IZOARDS

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.