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 !
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
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.
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.
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.
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.
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.
>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.
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.
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
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.