Forum: Mikrocontroller und Digitale Elektronik Interrupt an ATmega32


von Frank L. (frank09)


Lesenswert?

Hallo,

ich habe seit dem Wochenende ein Phänomen oder auch einen Denkfehler zu 
verarbeiten:
Um bei einem Spannungsausfall bzw. Ausschaltbefehl an einem Board mit 
ATmega32 keinen Datenverlust zu erleiden habe ich einen Stützkondensator 
(GoldCap 1,0F) in die Spannungszuführung VCC eingebaut. Anschließend 
wollte ich die Betriebsspannung auf INT1 führen um bei fallender Flanke 
die betreffenden Werte in den EEPROM zu schreiben zu lassen.
Entsprechend wurde INT1 als INPUT konfiguriert und die 
Interrupt-Service-Routinne auf fallende Flanke programmiert.

Das Phänomen: Der ATmega speichert die Werte bei Spannungsausfall oder 
Ausschalten wie gewünscht; allerdings bereits schon bei unbeschaltenem 
Port INT1 >> also ohne, daß das auszuwertende Signal der abfallenden 
Spannung überhaupt am Port INT1 anliegt !!!
Ich habe den Test bestimmt 20x mit positivem Ergebnis ausgeführt.

Wenn am INT1 ohne Beschaltung und PullUp eine vagabuntierende Spannung 
vorhanden währe und die ISR den Abfall dieser Spannung als H/L-Flanke 
erkennt, woher bekommt dann der ATmega noch genug Energie zu 
Rückschreiben >> wir befinden uns ja dann schon im Lo-Bereich ?
Ursprünglich war geplant, die Auswertespannung vor dem 
Festspannungsregler abzugreifen und mit dem GoldCap hinter den Regler 
einzuspeisen. Eine Diode im Eingang des 7805 hätte mir den Rückfluß der 
Energie in die Spannunsversorgung verhindert so daß selbst, wenn am 
Eingang des 7805 schon Lo ist, für eine gewisse Zeit durch den 
Kondensator auf der Seite des ATmega Hi gehalten wird.

Warum ist das so und kann diese Lösung ohne INPUT-Signal so dauerhaft 
beibehalten werden ???

Eine schöne Woche
Frank

von Stefan E. (sternst)


Lesenswert?

> Wenn am INT1 ohne Beschaltung und PullUp ...

Bezieht sich hier das "ohne" sowohl auf "Beschaltung" als auch auf 
"PullUp"? Weil dann ist das kein Wunder, denn ein offener Eingang 
floatet wild umher und löst damit hier Interrupts aus.

von Frank L. (frank09)


Lesenswert?

Korrekt, das Phänomen tritt im Moment ohne Pullup und ohne Beschaltung 
auf.
Wie gesagt, von wildem floatem will ich erst einmal nicht sprechen; die 
Funktion ist ansonsten einfandfrei!
Ich werde den Eingang beschalten und sehen ob sich prinzipiell etwas 
ändert.
Danke für die Info

Frank

von Stefan E. (sternst)


Lesenswert?

Frank L. wrote:

> Wie gesagt, von wildem floatem will ich erst einmal nicht sprechen; die
> Funktion ist ansonsten einfandfrei!

Das Eine schließt das Andere nicht aus.

Die Spannung an einem offenen Eingang wandert nun mal unkontrolliert 
umher, und so werden beim Überschreiten der H/L-Grenze Interrupts 
ausgelöst.

von Hannes Lux (Gast)


Lesenswert?

Ich würde dazu keinen Interrupt nehmen, sondern einen normalen Eingang 
pollen (und entprellen). Der Goldcap speichert Energie für mehrere 
Minuten (ein Goldcap 0,1F hat genug Energie für mehr als eine halbe 
Minute Soundausgabe mit Tiny85 über HS-PWM direkt auf Lautsprecher), da 
hast Du verdammt viel Zeit zur Datensicherung.

...

von Frank L. (frank09)


Lesenswert?

Hannes Lux wrote:
> Ich würde dazu keinen Interrupt nehmen, sondern einen normalen Eingang
> pollen (und entprellen). Der Goldcap speichert Energie für mehrere
> Minuten (ein Goldcap 0,1F hat genug Energie für mehr als eine halbe
> Minute Soundausgabe mit Tiny85 über HS-PWM direkt auf Lautsprecher), da
> hast Du verdammt viel Zeit zur Datensicherung.
>
> ...


Dachte ich auch erst.
Das Problem ist, daß an einem anderen Interrupt ein Drehgeber eingelesen 
wird und dieser Wert im EEPROM abgelegt werden soll.
Bediene ich nun versehendlich beim- oder nach dem Speichern noch den 
Encoder so wird der angeschlossene Schrittmotor wohl noch nachgeführt; 
der gespeicherte Wert des Drehgebers ist allerdings nicht korrekt bzw. 
im Gleichlauf mit der Hardware.
Nach Auslösung des Interrupts zum Datenspeichern sperre ich alle ISR bis 
der GoldCap leer ist und ein Neustart erfodert.

Frank

von Falk B. (falk)


Lesenswert?


von Hannes Lux (Gast)


Lesenswert?

> Nach Auslösung des Interrupts zum Datenspeichern sperre ich alle ISR bis
> der GoldCap leer ist und ein Neustart erfodert.

Das kann man auch nach Erkennung des Spannungseinbruchs per entprelltem 
Polling. Dazu braucht es keinen Interrupt.

Also:
Wenn Spannung weg dann
 Motor aus
 Pause (letzte Drehgeberbewegungen durch Nachlauf noch mitnehmen)
 Werte sichern

...

von Frank L. (frank09)


Lesenswert?

Danke, das leuchtet mir ein. Ich werde, wie gesagt, heute Abend testen.
Wie lang kann mann das Polling ziehen (zeitlich); bzw. kann ich 
festlegen, daß bis zum Neustart gepollt wird?

Frank

von Hannes Lux (Gast)


Lesenswert?

> Danke, das leuchtet mir ein. Ich werde, wie gesagt, heute Abend testen.
> Wie lang kann mann das Polling ziehen (zeitlich);

Ich würde das Polling mit der vermutlich sowiso benötigten 
Tastenentprellung kombinieren, die von einem Timer synchronisiert wird. 
Wenn nach der Entprellung der Eingang als "Saft fehlt" erkannt wird, 
kann die Aktion beginnen.

> bzw. kann ich
> festlegen, daß bis zum Neustart gepollt wird?

Das Polling sollte nebenher erfolgen, also z.B. alle 20 ms im Rahmen der 
Tastenentprellung.

Bis zum Neustart wird es wohl nicht gehen, da der AVR ja ohne Spannung 
(wenn der Cap leer ist) schlecht pollen kann... ;-)
Er arbeitet (und pollt) exakt solange, bis aufgrund des Absinkens der 
Cap-Spannung der Brown-Out-Reset zuschlägt und den AVR am Unfugmachen 
hindert. Sollte die Stromversorgung vorher wieder funktionieren, dann 
kann natürlich der Betrieb fortgesetzt werden, vermutlich sogar ohne 
Neustart. Pauschal kann man da nicht viel sagen, es kommt auf die 
Details Deiner Anwendung an.

...

von Frank L. (frank09)


Lesenswert?

Hannes Lux wrote:

> Bis zum Neustart wird es wohl nicht gehen, da der AVR ja ohne Spannung
> (wenn der Cap leer ist) schlecht pollen kann... ;-)

.. sorry, da habe ich mich wohl ein bischen unqualifiziert ausgedrückt; 
ich meinte es natürlich so wie du treffend formuliert hast.

> Pauschal kann man da nicht viel sagen, es kommt auf die
> Details Deiner Anwendung an.

Anwendung eigentlich ganz simpel (ist immer noch mein Einsteigerprojekt 
in AVR und BASCOM)
Ein Schrittmotor soll in seinen Funktionen mittels optischen Drehgeber 
in seiner Position (10.000 Step's) sowie mittels Tasten für Motor 
disable/enable, Halbschritt/Mikroschritt, verschidene Positionsmarken 
anfahren, Kalibriermodus für die angeschlossene Mechanik etc. über einem 
ATmega32 gesteuert werden. Ein LCD-Display 4x20 informiert über alle 
relevanten Zustände sowie Positionen einschl. Umrechnung in Einheiten 
für den nichtlinearen, mechanisch gekoppelten Abtrieb.
Es funktioniert bislang alles problemlos; der "I-Punkt" war letztendlich 
das Zwischenspeichern des Wertes für den Schrittzähler bei 
Spannungsausfalls bzw. Ausschaltbefehl. Da der GoldCap die Versorgung 
trotz angeschlossenem LCD relativ lange aufrecht hält muss 
sichergestellt werden, daß in dieser Zeit ein erneutes Betätigen des 
Drehgebers nicht zum Weiterarbeiten des softwaremäßigen Schrittzählers 
führt. (ansonsten entsteht eine Differenz zwischen Schrittzähler und 
eigentlicher Motorstellung)
Soweit der Kurzdurchlauf zur Anwendung.
Wie gesagt, ich bin mit meinen Kenntnissen sicherlich noch im untersten 
Level und werde mich step by step vorarbeiten. Polling habe ich schon 
gehört aber noch nicht benutzt; auf Timer möchte ich wegen der Anwendung 
im HF-Bereich möglicht verzichten. Ich befürchte, daß ich mit der 
Aktivierung, den Teilerketten und Wandlungen mehr Störungen unterhalb 
der Quarzfrequenz produziere als mir lieb ist.
Da ich für das Auslesen des optischen Drehgebers schon einmal mit 
Interrupts gearbeitet habe schien mir diese Lösung in punkto 
Plausibilität am nächsten. Soviel dazu...

Du siehst, ich habe noch viel Wasser vor mir...

Frank

von Tobi (Gast)


Lesenswert?

Ausserdem würde ich nicht VCC messen, sondern die Spannung vor deinem 
7805. Das mit der Diode ist gut, damit nichts zurückfliesst! Aber besser 
vor dem 7805 eine Schwelle definiren! So merkst du, wenn die externe 
Spannung wegbricht únd kannst speichern, etc., egal was deine VCC macht!

von Hannes Lux (Gast)


Lesenswert?

> Ausserdem würde ich nicht VCC messen, sondern die Spannung vor deinem
> 7805.

Das hatte ich vorausgesetzt, über Spannungsteiler und Z-Diode, wobei der 
Spannungsteiler den PullDown für definiertes Signal enthält.

> ...in AVR und BASCOM...

Das wäre für mich das KO-Kriterium. Schon alleine aufgrund der Tatsache, 
dass Bascom bei jedem Interrupt alle (auch die unbenutzten) Register auf 
Stack sichert, was 128 unnötige Takte kostet. Dazu kommt, dass ein 
kooperatives Multitasking, wie es in ASM (oder C, wenn man es richtig 
kann) leicht möglich ist, in Bascom nur schwer realisierbar ist und 
recht langsam wird.

...

von spess53 (Gast)


Lesenswert?

Hi

Warum eigentlich INT1? Für solche Aufgaben ist  der Analogkomperatur die 
bessere Lösung. Da kannst du einen definierten Pegel einstellen, bei den 
der Interrupt ausgelöst wird.

MfG Spess

von Frank09 (Gast)


Lesenswert?

Danke nochmals für die Bemühungen aller Teilnehmer,
Natürlich gehe ich mit der Spannungsüberwachung vor dem 7805 ab; die 
Diode liegt in als Rückflußsicherung davor. Der PIN des 
Analogkomperators ist leider schon vergeben und läßt sich von Seiten des 
Layouts schwer tauschen. Dem Beitrag mit dem K.O.-Kriterium kann ich 
leider nicht folgen...
sorry

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.