Forum: Mikrocontroller und Digitale Elektronik ATmega1284P - Frage zum Pin Change Interrupt


von recently (Gast)


Lesenswert?

Hallo,

beim ATmega1284P können alle Portpins einen "Pin Changed"-Interrupt 
auslösen. Dabei teilen sich 8 Pins einen Interrupt.
Was passiert, wenn ich diese 8 Pins parallel schalte und einen L-H 
Wechsel darauf gebe. Alle 8 Pins toggeln also exakt zum gleichen 
Zeitpunkt von L nach H. Wird die Interrupt-Routine dann tatsächlich 8x 
hintereinander aufgerufen oder gibt es nur einen Interrupt ? In der Doku 
habe ich dazu keine Hinweise gefunden ?

In meiner Anwendung benötige ich 8 Impulszähler. Die Impulse sind 
teilweise zeitgleich bzw. leicht phasenverschoben. Ich befürchte, dass 
ich unter Umständen Impulse verliere ...

Vielen Dank für Tipps !

von Spess53 (Gast)


Lesenswert?

Hi

>In meiner Anwendung benötige ich 8 Impulszähler. Die Impulse sind
>teilweise zeitgleich bzw. leicht phasenverschoben. Ich befürchte, dass
>ich unter Umständen Impulse verliere ...

Ist doch egal. Ein EXOR mit dem letzten Stand erkennt alle geänderten 
Pins.

MfG Spess

von recently (Gast)


Lesenswert?

Sicherlich ... aber:

Wenn ich nun in der Interruptroutine den Port zur Auswertung auslese und 
die nächste Änderung folgt unmittelbar danach, noch während die 
Interrupt-Routine läuft, was passiert dann ? Geht diese Änderung dann an 
der Erfassung vorbei oder kommt dann noch ein Interrupt. Wie geht der 
Prozessor damit um ?
Ist das vielleicht an das Auslesen des Ports gekoppelt, dass nach einem 
Lesevorgang wieder neue Interrupts erzeugt werden ? Das wird in der Doku 
leider nicht erläutert.

von c-hater (Gast)


Lesenswert?

recently schrieb:

> Alle 8 Pins toggeln also exakt zum gleichen
> Zeitpunkt von L nach H. Wird die Interrupt-Routine dann tatsächlich 8x
> hintereinander aufgerufen oder gibt es nur einen Interrupt ?

Natürlich nur einen. Und das nicht nur dann, wenn alle exakt zur selben 
Zeit den Pegel wechseln. Man kann schon allein die Tatsache des 
multiplen Pegelwechsels nur feststellen, wenn er mindestens vier Takte 
voneinander entfernt geschehen ist.

Allerdings: selbst dann kann man nicht zuverlässig entscheiden, welcher 
Pin genau nun getoggelt hat. Wenn das sichergestellt werden soll, muß 
man (mit externer Hardware) dafür sorgen, daß kein Pinstatus kürzer 
anliegt als ein kompletter Zyklus der ISR dauert.

->Pin-Change ist praktisch nur nutzbar, wenn es keine Rolle spielt, 
welcher Pin gewackelt hat oder alternativ: wenn nur ein Pin pro PCINT zu 
überwachen ist.

von Thomas E. (thomase)


Lesenswert?

Wenn das so eng ist, kannst du ein bisschen rumtricksen:
INT0, INT1, INT2, 4 x PCINT und ICP.
Somit hat jeder seine eigene ISR. Stellt sich aber wieder die Frage, ob 
der letzte in der Reihe nicht mehrmals kommt, während die 7 davor 
abgearbeitet werden.
Ansonsten Polling. Da geht dir wenigstens durch ein gelöschtes 
Interruptflag nichts verloren. Kostet aber jede Menge Rechenleistung.
Oder eine Kombination davon.
Der 1284 hat 4 Timer. Einen braucht man ja meistens als Systick. Aber 
die anderen 3 können dann selbständig Impulse zählen.

mfg.

von Amateur (Gast)


Lesenswert?

DU musst zuerst dafür Sorge tragen, dass die Impulse lang genug wechseln 
um die Aufmerksamkeit des Prozessors zu erregen. Das ist ausschließlich 
ein Hardwareproblem und hat nichts mit dem Prozessor zutun.

Der Prozessor kann nur testen und natürlich reagieren - in seinem 
Zeitrahmen.

Da Du sowieso nachsehen musst, welcher der max. 8 Anschlüsse Probleme 
bereitet, kannst Du auch gleich nachsehen wie's seinen Kumpels geht.

Was bei fast gleichzeitigem Auftreten von Unterbrechungen, also 
schneller als Du reagieren kannst passiert, steht bestimmt in den Tiefen 
der Rechnerbeschreibung.

Auch solltest Du notfalls eine Pupille auf den Stack werfen. Eigentlich 
sind Unterbrechungen eine feine Sache. Unschön wird es aber schnell, 
wenn Unterbrechungen unterbrochen werden. Vor allem, wenn die sich 
untereinander abgesprochen haben und nicht zusammen, sondern schön in 
maximal, ungünstigem Abstand zueinander kommen.

Noch was: Viel und schnell - das klingt nach Assembler Programmierung.

Und last but not least - was hast Du während der Unterbrechungen vor? 
Oder anders ausgedrückt: Mal schnell nebenbei Einkaufen läuft nicht. Da 
bleibt zu viel liegen.

von Thomas E. (thomase)


Lesenswert?

Amateur schrieb:

> Auch solltest Du notfalls eine Pupille auf den Stack werfen. Eigentlich
> sind Unterbrechungen eine feine Sache. Unschön wird es aber schnell,
> wenn Unterbrechungen unterbrochen werden. Vor allem, wenn die sich
> untereinander abgesprochen haben und nicht zusammen, sondern schön in
> maximal, ungünstigem Abstand zueinander kommen.
Auf einem AVR werden keine ISRs von Interrupts unterbrochen. Alles 
andere ist Hacker-Mist.

mfg.

von Amateur (Gast)


Lesenswert?

>Auf einem AVR werden keine ISRs von Interrupts unterbrochen. Alles
>andere ist Hacker-Mist.

Es soll Leute geben, die während einer aufwändig zu behandelnden 
Unterbrechung wissen wollen, was in der Großen-Weiten-Welt grad los ist. 
Folglich geben sie explizit Unterbrechungen frei.
Ich weiß, dass das erste Gebot bei Unterbrechungen lautet: Fasse Dich 
kurz. Soviel zur Theorie. Dummerweise mischt sich gelegentlich die 
Realität ein - ein echter Spielverderber.

von Thomas E. (thomase)


Lesenswert?

Amateur schrieb:
>>Auf einem AVR werden keine ISRs von Interrupts unterbrochen. Alles
>>andere ist Hacker-Mist.
>
> Es soll Leute geben, die während einer aufwändig zu behandelnden
> Unterbrechung wissen wollen, was in der Großen-Weiten-Welt grad los ist.
> Folglich geben sie explizit Unterbrechungen frei.
> Ich weiß, dass das erste Gebot bei Unterbrechungen lautet: Fasse Dich
> kurz. Soviel zur Theorie. Dummerweise mischt sich gelegentlich die
> Realität ein - ein echter Spielverderber.

Du bist einfach nur ein Dummschwätzer.

mfg.

von Stephan B. (matrixstorm)


Lesenswert?

Manche Interrupts (die mit eigenem Flag) werden bis zur naechsten sei() 
gepuffert und fruehestens 1 Takt danach (min. 1 Opcode ausserhalb von 
ISRs wird vorher ausgefuehrt) in Ausfuehrung gegeben.

Dummerweise gehoeren aber PIN-Change Interrupts nicht zu den gepufferten 
Interrupts.

Wollte das nur mal los werden...

Vielleicht kann man das Impulszaehlen an einen billigen, kleinen und 
pollenden ATmega8 deligieren? Aber selbst der braucht ein paar Cycles um 
Anzahl zu berechnen und binaer auf andere GPIOs zu geben...

...ansonsten hilft da nur (programmierbare) Logik!?

MfG

von Thomas E. (thomase)


Lesenswert?

Stephan B. schrieb:
> Manche Interrupts (die mit eigenem Flag) werden bis zur naechsten sei()
> gepuffert und fruehestens 1 Takt danach (min. 1 Opcode ausserhalb von
> ISRs wird vorher ausgefuehrt) in Ausfuehrung gegeben.
>
> Dummerweise gehoeren aber PIN-Change Interrupts nicht zu den gepufferten
> Interrupts.

Doch natürlich sind sie das. Nur wenn PCINT0 gerade ausgeführt wird und 
ein weiterer Pinchange auf dem gleichen Port auftritt, bevor das Flag 
gelöscht wurde, ist der verloren. PCINT1 wird selbstverständlich danach 
ausgeführt. Die 4 PCINTs. die ich weiter oben meinte, müssen natürlich 
auf verschiedenen Ports sein.

mfg.

von Stephan B. (matrixstorm)


Lesenswert?

Soweit ich weis, haben die kein extra Flag was toggelt wenn ein 
PIN-Change auftritt.  Kann aber durchaus sein, das ich mich da taeusche.

Im Zweifel testen? Oder wo kann man das genau herausfinden? Im 
Datenblatt steht meines Wissens dazu nichts weiter.

MfG

von Thomas E. (thomase)


Lesenswert?

Stephan B. schrieb:
> Soweit ich weis, haben die kein extra Flag was toggelt wenn ein
> PIN-Change auftritt.  Kann aber durchaus sein, das ich mich da taeusche.
>
> Im Zweifel testen? Oder wo kann man das genau herausfinden? Im
> Datenblatt steht meines Wissens dazu nichts weiter.
>
> MfG

Steht in jedem Datenblatt unter der Beschreibung des PCIFR-Registers. 
Das Bit wird aber nicht getoggelt sondern gesetzt. Wenn es schon gesetzt 
ist, wird es nochmal gesetzt. Ein PCINTx verhält sich wie jeder andere 
Interrupt auch.

mfg.

von Stephan B. (matrixstorm)


Lesenswert?

Okay, Danke

MfG und gute N8

von c-hater (Gast)


Lesenswert?

Thomas Eckmann schrieb:

> Auf einem AVR werden keine ISRs von Interrupts unterbrochen. Alles
> andere ist Hacker-Mist.

Selten so einen Blödsinn gelesen.

1) Wenn man eine Priorisierung von Code haben will (haben muß), kommt 
man garnicht drumherum das genau so zu machen.

2) Wenn man es richtig macht, bedeutet es keinerlei Risiko.

3) Es ist der Weg, der die höchste Performance aus den Dingern kitzelt, 
weil unnötige Übergabe von Informationen, unnötige Verzweigungen und 
unnötige Interuptframes eingespart werden können.

4) Es ist der Weg, mit dem die geringsten Interruptlatenzen erreicht 
werden können.

Nur Leute, die nichts gebacken bekommen, negieren diese ganzen Vorteile 
mit pauschaler Ablehnung.

von Thomas E. (thomase)


Lesenswert?

c-hater schrieb:
> Selten so einen Blödsinn gelesen.
Dazu musst du doch nur deine eigenen Posts lesen. So wie dieser hier. 
Der trieft ja schon wieder vor Selbstbeweihräucherung.

mfg.

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.