PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt-Vektoren beim ATmega-168/ PCINT-Eingänge



Nils Wenzler
03.10.2007, 17:35
Hallo
Ich habe einen ATmega-168, und will 5 Steuerkanäle einlesen, über die PCINT Eingänge 13-9. Jetzt finde ich nicht heraus welches die einzelnen Vektoren sind für die Kanäle, und mir schwant irgendwie nicht viel gutes... :D.
Gruss Nils

Hubert.G
03.10.2007, 18:02
Wenn ich das Datenblatt richtig interpretiere dann heisst das PCINT1_vect
Dann im Register PCICR das Bit PCIE1 setzen und allgemein den Interrupt enablen.
Das heisst du hast nur einen Vector für alle 5 Kanäle und musst bei auslösen der ISR selbst abfragen welcher Kanal das ist.

Nils Wenzler
03.10.2007, 18:19
Wie geht das mit dem Kanal auslesen nach dem ISR genau? Einfach überprüfen welche Kanal geändert hat?
Greez Nils

BASTIUniversal
03.10.2007, 19:25
VERSCHOBEN [-(

MfG
Basti

Hubert.G
04.10.2007, 10:20
Ja, würde ich so machen, es könnten auch mehrere Kanäle gleichzeitig aktiv sein.

Nils Wenzler
04.10.2007, 11:55
Wen man nun über if abfragt welcher Kanal genau angesprochen wurde, wird da die ISR routine nicht ein wenig lange?
Ein zweites Problem: Ich habe ja nicht 5 Timer zur verfügung, erst dacht ich mir das eben über einzel Interrupts zu lösen, und immer die gleichen Timer zu verwenden (andere Interrupts werden ignoriert, und nacher abgearbeitet). wie sieht das jetzt aus? Wird auf einen Interrupt an einem Pin immer noch generell der Interrupt unterbrochen, und später abgearbeitet?
Gruss Nils

Hubert.G
04.10.2007, 14:05
Die Abfrage darf man nicht in der ISR machen, das ganze Port in eine Variable schieben und dann in der Main-Schleife abarbeiten. Interrupts werden nicht unterbrochen sondern abgearbeitet, der nächste wartet wenn man ihn nicht manuell löscht.

Nils Wenzler
04.10.2007, 14:42
Danke!
Noch eine letzte Frage:
Wie kann ich die Variablen aus einer Funktion auch im Main verwenden, oder an eine andere Funktion weitergeben (die Resultate)
Gruss

Hubert.G
04.10.2007, 14:53
Wenn du die Variable ausserhalb einer Funktion definierst ist sie allgemein verwendbar, sonst als global definieren. Ich setzte solche definitionen gleich an den Anfang eines Programms nach den include und define.