www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA64 mit Int aus Power-Down wecken


Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe folgendes Problem:
Beim Auftreten einer fallenden Flanke an einem externen Interrupt 
Eingang (INT6), soll der µC in den Power-Down Modus gehen. Soweit so 
gut, das klappt alles

Nun will ich aber, dass er mir bei einer steigenden Flanke wieder zu 
leben zieht. Laut Datenblatt S.90 steht da folgendes:

"Low level interrupts and the edge interrupt on INT3:0 are detected 
asynchronously. This implies that these interrupts can be used for 
waking the part also from sleep modes other than Idle mode. The I/O 
clock is halted in all sleep modes except Idle mode."

sowie

"Note that if a level triggered interrupt is used for wake-up from 
Power-down mode, the changed level must be held for some time to wake up 
the MCU. This makes the MCU less sensitive to noise."

Fürs Wecken verwende ich INT2, demnach müsste das doch eigentlich 
klappen?

Kann mir einer sagen, warum es trotzdem nicht geht? Können nur fixe 
Logische Pegel den µC wieder aufwecken?

Vielen Dank und schöne Grüße
Philipp

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Putzer wrote:
> Kann mir einer sagen, warum es trotzdem nicht geht? Können nur fixe
> Logische Pegel den µC wieder aufwecken?
Im Power-Down-Modus ist der CPU-Takt deaktiviert. Für einen 
Flanken-Interrupt wird dieser aber benötigt. Deshalb steht im 
entsprechenden Abschnitt im Datenblatt auch, dass nur ein externer 
*Level*-Interrupt den µC aus dem Power-Down aufwecken kann, weil ein 
Level-Interrupt keinen Takt zur Synchronisation benötigt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Philipp Putzer wrote:
>> Kann mir einer sagen, warum es trotzdem nicht geht? Können nur fixe
>> Logische Pegel den µC wieder aufwecken?
> Im Power-Down-Modus ist der CPU-Takt deaktiviert.

Hmmm... - Der (der CPU-Takt) ist bei Idle auch deaktiviert. ;-)
Daher hat der Takt, der für I/O zuständig ist, vermutlich einen anderen 
Namen, sorry. Aber ansonsten ist das alles richtig.

> Für einen
> Flanken-Interrupt wird dieser aber benötigt. Deshalb steht im
> entsprechenden Abschnitt im Datenblatt auch, dass nur ein externer
> *Level*-Interrupt den µC aus dem Power-Down aufwecken kann, weil ein
> Level-Interrupt keinen Takt zur Synchronisation benötigt.

...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp Putzer wrote:
> Fürs Wecken verwende ich INT2, demnach müsste das doch eigentlich
> klappen?
Upps, das hatte ich doch beim ersten Mal glatt übersehen... Mit INT2 
müsste es tatsächlich klappen, weil der (wie auch INT3, 1 und 0) 
asynchron detektiert wird. Hatte gedacht, Du wolltest ihn auch mit INT6 
wieder zurückholen... Also wie gesagt, mit INT2 müsste es eigentlich 
auch auf Flanke klappen.

@Hannes:
Hast natürlich recht, sollte I/O-Takt anstelle von CPU-Takt heißen (bzw. 
der eigentliche Hauptunterschied zum Idle ist eben, dass der 
Hauptoszillator komplett abgeschaltet wird...)

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben, es müsste ja eigentlich klappen

Auf S.48 in der Tabelle für die Weckquellen aus den verschiedenen 
sleep-modi steht ja auch bei wake up source, INT3:0 or level interrupt 
INT4:7. Da denke ich kann jedes INT3:0 gehen.

Wenn ich den Eintritt in den Power-down auskommentiere, funkt mein Int2 
einwandfrei mit der steigenden Flanke. Nur weckt es den nicht mehr auf!

Kann es damit zu tun haben, dass die Fuses für die Warmlaufzeit nicht 
richtig gesetzt sind? Bei mir sind CKSEL3:0, SUT1:0 programmiert (16MHz 
externer Quarz)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, damit kann es nicht zu tun haben, das ist dem Controller egal. Er 
braucht halt die eingestellte Zeit, um wieder anzufahren, mehr nicht.

>Wenn ich den Eintritt in den Power-down auskommentiere, funkt mein Int2
>einwandfrei mit der steigenden Flanke. Nur weckt es den nicht mehr auf!

Dann ist dort irgendetwas nicht korrekt. Oder aber in der 
Initialisierung des Sleep-Modes. Wie ist denn der Zustand Deines 
Int-Pins vor dem Eintritt in den Tiefschlaf? Zeit, etwas Code zu posten!

Autor: Philipp Putzer (putzer_philipp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei der Code.

Beim INT6 hängt ein TTL Ausgang eines Komperators, der bei Abfall der 
Betriebsspannung unter 9V auf Masse schaltet (fallende Flanke also)

Damit geht gleichzeitig der INT2 auf High, und belibt da so lange, bis
a) der Komp. wieder in den ursprünglichen Zustand schaltet
b) eine andere Versorgung angeschlossen wird

Trifft a oder b zu, dann tritt eine fallende Flanke am INT2 auf, und 
soll den µC wecken.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann auch nicht klappen, weil Du in der ISR den sleep-Befehl ausführst. 
Zu dem Zeitpunkt ist aber das I-Bit im SREG gelöscht und damit ist die 
Bearbeitung sämtlicher Interrupts gesperrt. Dementsprechend kann der 
INT2 gar nicht auslösen. Ein nicht freigegebener Interrupt kann nunmal 
den µC nicht aufwecken. Du musst entweder das sleep_mode() im 
Hauptprogramm ausführen (empfohlene Vorgehensweise) oder aber (etwas 
weniger empfehlenswert) das I-Bit in der INT6-ISR vor dem sleep_mode() 
wieder setzen.

Ich hoffe, Du siehst jetzt endlich auch, wie wichtig es ist, den Code zu 
posten. Hätte ich das sofort gesehen, dann wäre Dein Problem vermutlich 
längst gelöst...

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt! OK, daran hatte ich nun glatt nicht gedacht

Ich werds dann mal heute abend testen, mit ausführung des sleep modes im 
Hauptprogramm!


Vielen, vielen Dank auch!

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.