Forum: Mikrocontroller und Digitale Elektronik Atmega32 INT0 setzt Timer1 außer Kraft


von Lukas B. (Firma: KRK Elektronik) (lukasboehm78)


Angehängte Dateien:

Lesenswert?

Hallo liebe Mikrocontroller.net Community,

Ich versuche grade einen Handwasch-Timer zu bauen.

Ein Bewegungssensor löst bei erkannter Bewegung einen Interrupt an INT0 
aus,
darauf hin wird auf den 7-Segment Anzeigen die Zahlen 30-0 angezeigt und 
ein Sound abgespielt.


Alles funktioniert ohne Probleme, allerdings in Abhängigkeit von dem 
Wert, den ich bei MCUCR eintrage.

Wenn ich MCUCR auf = 0b00000001 setze, dann wird mein INT0 bei jedem 
Zustandswechsel getriggert und alles funktioniert reibungslos.
Allerdings wacht mein Prozessor nach dem Power Down dann nicht mehr auf.

Deshalb habe ich versucht, MCUCR auf 0b00000000 zu setzen.
Dann wacht zwar mein Prozessor nach dem Sleep auf,
aber ein Retrigger des Bewegungssensors setzt dann plötzlich meinen 
Timer1 außer Kraft und dieser zählt nicht weiter. Wenn ich dann aber ein 
drittes Mal den INT0 Trigger, wird ganz normal weiter gezählt mit dem 
Timer1.

Also zusammengefasst:

MCUCR = 1 -> Retrigger löst keine unerwünschten Funktionen aus, 
Aufwachen nicht möglich
MCUCR = 0 -> Retrigger setzt Timer1 außer Kraft, Aufwachen möglich

Hat jemand eine Idee?

Ein schönes Wochenende,

Mit freundlichen Grüßen
Lukas Böhm

von Stefan F. (Gast)


Lesenswert?

Du hast korrekt erkannt das Flanken getriggerte Interrupts nicht zum 
Aufwecken verwendet werden können.

Wenn du auf Pegel getriggert umstellst, wird die ISR immer wieder 
aufgerufen, solange der Pegel LOW ist. Sonstiger Code kommt dann gar 
nicht mehr zum Zuge, denn der INT0 hat die höchste Priorität.

Ich würde im normalen Betrieb Flanken getriggerte Interrupts werwenden 
und im Schlaf Pegel getriggerte. Das kann man ja nach Belieben wechseln.

von Falk B. (falk)


Lesenswert?

Lukas B. schrieb:
> Hallo liebe Mikrocontroller.net Community,
>
> Ich versuche grade einen Handwasch-Timer zu bauen.

Du hast ja witzige #defines . . .8-0

> Ein Bewegungssensor löst bei erkannter Bewegung einen Interrupt an INT0
> aus,
> darauf hin wird auf den 7-Segment Anzeigen die Zahlen 30-0 angezeigt und
> ein Sound abgespielt.

> Wenn ich MCUCR auf = 0b00000001 setze, dann wird mein INT0 bei jedem
> Zustandswechsel getriggert und alles funktioniert reibungslos.

Super.

> Allerdings wacht mein Prozessor nach dem Power Down dann nicht mehr auf.

Logisch, siehe Sleep mode.

> Deshalb habe ich versucht, MCUCR auf 0b00000000 zu setzen.
> Dann wacht zwar mein Prozessor nach dem Sleep auf,
> aber ein Retrigger des Bewegungssensors setzt dann plötzlich meinen
> Timer1 außer Kraft und dieser zählt nicht weiter.

Nö, dein Interruphandling ist dann im Eimer, weil dein Sensor den INT0 
ziemlich lange auf LOW hält. Dadurch wird die ISR mehrfach aufgerufen. 
Im Extremfall wird praktisch nur die ISR immer wieder ausgeführt, wenn 
INT0 auf LOW bleibt.

Eine mögliche Lösung. Im Normalfall INT0 auf fallende Flanke 
konfigurieren und nur kurz vor dem Aktivien des Sleep Mode auf LOW Level 
umstellen. Nach dem Aufwachen natürlich wieder auf Flanke.

Alles in Allem ist dein Programm reichlich konfus. Lies mal was zum 
Thema

Strukturierte Programmierung auf Mikrocontrollern
Statemachine

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Logisch, siehe Sleep mode.

Der Link führt ins Leere. Korrektur: Sleep Mode

: Bearbeitet durch Moderator
von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Du hast korrekt erkannt das Flanken getriggerte Interrupts nicht zum
> Aufwecken verwendet werden können.

Das stimmt so nicht. Das trifft nur auf die INTx-Interupts zu (und 
selbst da nicht für alle auf allen Devices, es gibt etliche Ausnahmen).

Und für die PCINT-Interupts trifft das natürlich generell nicht zu, denn 
die können von Haus aus nur Flankentriggerung, sind aber in der Lage das 
Teil auch aus dem DeepSleep zu holen.

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> Und für die PCINT-Interupts trifft das natürlich generell nicht zu, denn
> die können von Haus aus nur Flankentriggerung, sind aber in der Lage das
> Teil auch aus dem DeepSleep zu holen.

Hat der MEGA32 PCINT? Ich hab keinen gesehen.
Mit dem INT2 kann man ihn mit einer fallenden Flanke aus dem PowerDown 
holen. Bei INT0 und INT1 ist es ein Level-Interrupt mit den o.g. 
Problemen.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Hat der MEGA32 PCINT? Ich hab keinen gesehen.

Hat er auch nicht.

> Mit dem INT2 kann man ihn mit einer fallenden Flanke aus dem PowerDown
> holen.

Na da haben wir doch schon so eine Ausnahme von dem, was der unheilige 
Stefanus als allgewaltige Wahrheit verkündet hat und von mir 
pflichbewußterweise auf das reduziert wurde, was es tatsächlich war, ein 
Mäusefurz im Hurrican...

Der TO muss diesen Sachverhalt (also den INT2 mit Flankentrigger) nur 
nutzen und alles ist schick.

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> der unheilige Stefanus

Warum versiehst du meinem Namen immer wieder mit solchen Attributen? 
Muss das sein?

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Warum versiehst du meinem Namen immer wieder mit solchen Attributen?

Weil mir dein barmherziger-Samariter-Gehabe und deine dauernde 
Eigenwerbung furchtbar auf den Senkel geht.

> Muss das sein?

Müssen muss es wohl nicht, aber können kann es schon.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

So könnte der Quelltext aufgeräumt und gut strukturiert sein. Denn so 
ein Rückwärtszähler, neudeutsch Count Down, ist ja nur ein digitales 
Monoflop. Einmal starten, Sequenz durchlaufen, ausschalten.
Das sieht man, was los ist und wann was geschaltet wird. In deinem 
Quelltext ist das maximal kryptisch umgesetzt, da braucht man 
Ewigkeiten, um das nachzuvollziehen. Außerdem ist der Quelltext deutlich 
kürzer und übersichtlicher, deutlich weniger Variablen, keine 
volatile-Epedemie!

von HildeK (Gast)


Lesenswert?

Falk B. schrieb:
> So könnte der Quelltext aufgeräumt und gut strukturiert sein.

Lob! Schön gemacht.

Und man sieht auch, wie man den INT0 Level-IRQ quasi als 
Flankeninterrupt nutzen kann, was hier ja länger diskutiert wurde.
In der ISR INT0 steht:
        GICR &= ~(1<<INT0);       // INT0 disable
Damit kann der INT0-Pin auch länger auf LOW bleiben.

Und direkt vor dem nächsten Sleep wird INT0 wieder aktiviert:
        GICR |= (1<<INT0);    // INT0 enable
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        sleep_mode();
und ist bereit zum nächsten Aufwecken mit INT0.
Es muss natürlich vor dem nächsten Sleep sichergestellt sein, dass der 
INT0 wieder auf HIGH ist. Hier wahrscheinlich kein Problem; evtl. muss 
man den Bewegungsmelder nach Ablauf der 30s-Sequenz noch für einige 
Sekunden sperren, damit der Waschende auch Zeit hat, aus dem Bereich des 
Bewegungsmelders zu kommen oder einfach die Zeit um z.B. 5s verlängern, 
wenn der Bewegungsmelder in der aktiven Zeit wieder reagiert.

@Falk B.
Deine Fragezeichen und Fragen im Kommentar 'was macht das?' hängen 
vermutlich damit zusammen:

Lukas B. schrieb:
> und ein Sound abgespielt.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Und man sieht auch, wie man den INT0 Level-IRQ quasi als
> Flankeninterrupt nutzen kann, was hier ja länger diskutiert wurde.

Natürlich kann man das tun. Ist aber letztlich ein Software-Workaround. 
Unnötig, wenn man Hardware zur Verfügung hat, die das auch alleine kann.

Wobei ich in diesem speziellen Fall gerne zugeben würde, dass es 
"gehuppt wie gesprungen" ist. In der Praxis also praktisch keinen 
substantiellen Unterschied ausmacht.

von HildeK (Gast)


Lesenswert?

c-hater schrieb:
> In der Praxis also praktisch keinen
> substantiellen Unterschied ausmacht.

Doch, ich denke schon.
In dem Beispiel von Falk B. wird ja vor dem nächsten Sleep der IRQ 
wieder scharf geschaltet und würde sofort auslösen, falls das Signal 
noch immer auf LOW steht. Man muss also ggf. warten, bis der Pin wieder 
auf HIGH ist. Das wäre beim INT2 nicht so.
Den hat aber nicht jeder. Die kleineren Tinys, die ich besser kenne, 
habe keinen mit dieser INT2-Funktionalität, der aus dem Power-Down mit 
einer Flanke aufwecken kann. Da bleibt einem nichts anders übrig als den 
Workaround zu nehmen.

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Doch, ich denke schon.
> In dem Beispiel von Falk B. wird ja vor dem nächsten Sleep der IRQ
> wieder scharf geschaltet und würde sofort auslösen, falls das Signal
> noch immer auf LOW steht. Man muss also ggf. warten, bis der Pin wieder
> auf HIGH ist. Das wäre beim INT2 nicht so.
> Den hat aber nicht jeder. Die kleineren Tinys, die ich besser kenne,
> habe keinen mit dieser INT2-Funktionalität, der aus dem Power-Down mit
> einer Flanke aufwecken kann. Da bleibt einem nichts anders übrig als den
> Workaround zu nehmen.

Du hast mich missverstanden. Natürlich muss man einen Int IMMER 
entsprechend seiner Hardwareeigenschaften korrekt behandeln.

Die optimale Lösung ist aber, (sofern verfügbar), einen Int zu 
verwenden, der keiner besonderen Behandling in der Software bedarf, um 
zu tun, was intendiert ist.

von Peter D. (peda)


Lesenswert?

HildeK schrieb:
> Die kleineren Tinys, die ich besser kenne,
> habe keinen mit dieser INT2-Funktionalität

Dafür aber den Pin-Change Interrupt auf die meisten Pins.
Oder meinst Du die alten ATtiny12,15,22.

von HildeK (Gast)


Lesenswert?

Peter D. schrieb:
> Dafür aber den Pin-Change Interrupt auf die meisten Pins.
> Oder meinst Du die alten ATtiny12,15,22.

Nein, nicht die ganz alten, die mittelalten ... Ich verwende den 13, die 
X4, X5 und X6 oder den 861. Die haben zwar den Pin-Change Interrupt, der 
kann aber doch nicht aus dem Power-Down wecken oder habe ich da was 
übersehen?
Auch der INT1, falls vorhanden, kann nur als Level-IRQ wecken.
Die ganz neuen mit TPI kann mein STK500 nicht programmieren, ich komme 
mit den genannten ganz gut aus. Da weiß ich nicht, wie die es halten.

c-hater schrieb:
> Die optimale Lösung ist aber, (sofern verfügbar), einen Int zu
> verwenden, der keiner besonderen Behandling in der Software bedarf, um
> zu tun, was intendiert ist.

Klar, so man hat 😀. Der TO hätte gehabt, hätte er denn richtig gelesen 
...

von S. Landolt (Gast)


Lesenswert?

> oder habe ich da was übersehen?
Ja, zumindest was ATtiny13 und 861 betrifft.
  Zu den Xn kann ich nichts sagen

von c-hater (Gast)


Lesenswert?

HildeK schrieb:

> Nein, nicht die ganz alten, die mittelalten ... Ich verwende den 13, die
> X4, X5 und X6 oder den 861. Die haben zwar den Pin-Change Interrupt, der
> kann aber doch nicht aus dem Power-Down wecken oder habe ich da was
> übersehen?

Wohl ja. Auszug aus dem DB der x5 (mit Hervorhebung von mir selber):

7.1.3 Power-down Mode
[...]
or a pin change interrupt can
   ^^^^^^^^^^^^^^^^^^^^^^^^^^
wake up the MCU.
^^^^^^^^^^^^^^^^

Bei den x4(auch: x4A) steht an adäquater Stelle ganz genau das gleiche.

zu den x6 und den 861 möchte ich nichts sagen. Habe ich nicht im Kopf 
und bin jetzt auch zu faul, um selber nachzuschlagen.

von HildeK (Gast)


Lesenswert?

S. Landolt schrieb:
> Ja, zumindest was ATtiny13 und 861 betrifft.

Danke, ja, ihr habt recht. Ich habe das bisher fehlinterpretiert. Die 
PCINT wecken auch auf, bei allen von mir genannten.

Man lernt nie aus...

von S. Landolt (Gast)


Lesenswert?

> Man lernt nie aus...

Unter anderem dafür sitzen wir hier beisammen.

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
Noch kein Account? Hier anmelden.