Hallo,
ich grüble über das Einstellen der externen Interrupts auf steigende
Flanke, fallende Flanke etc.
Ich arbeite derzeit das AVR-Assembler-Tutorial durch, bevor ich mich an
das GCC-Tutorial mache.
Der Direktlink zu der Tutorialseite:
AVR-Tutorial: Interrupts
Nun stolpere ich aber über die Einstellungen im Register MCUCR. Ich
werde aus der Tabelle einfach nicht schlau.
Im Text steht, es gibt die Bits ISC00 und ISC01 für INT0 und ISC10 sowie
ISC11 für INT1.
Zwei Bits für jeden Interrupt. Laut Tabelle kann man diese aber auf vier
verschiedene Arten "ansteuern".
Im Codebeispiel weiter unten werden beide Interrupts auf fallende Flanke
gesetzt:
1
ldi temp, (1<<ISC01) | (1<<ISC11) ; INT0 und INT1 auf fallende Flanke konfigurieren
2
out MCUCR, temp
Zunächst stolpere ich über "(1<<ISC01)". Ein solcher Befehl taucht -
wenn ich es richtig gesehen habe - zum ersten Mal im Abschnitt
"Ansteuerung eines LC-Displays" auf. Ich weiß leider nicht genau, was er
tut. Ich habe ein anderes Thema hier gefunden, wo es heißt, das "<<" sei
ein Verschiebungsbefehl, nur wie dieser genau arbeitet, weiß ich immer
noch nicht bzw. wie damit ein Bit gesetzt oder gelöscht wird. Das "|"
zwischen "(1<<ISC01) | (1<<ISC11)" soll auch laut diesem Thema ein
Oder-Operand sein. Also eigentlich weiß ich gar nicht, was diese Zeile
dort oben genau macht, nur, dass als Ergebnis die Bits im MCUCR-Register
so gesetzt sind, dass INT0 und INT1 auf eine fallende Flanke reagieren.
Des Weiteren werde ich aus der Tabelle über die
Einstellungsmöglichkeiten nicht schlau, wie der Code aussehen muss, wenn
ich die Interrupts nicht auf fallende Flanke, sondern die drei anderen
Arten programmieren will.
Ich habe schon einiges gegooglet und selber gegrübelt, aber ich komme
nicht weiter. Hilf mir doch bitte einer auf die Sprünge!
LG Andi
Die erste Frage beantwortet der Artikel Bitmanipulation
Die zweite Frage... formal hast du mit zwei Bits vier
Einstellungmöglichkeiten:
1
ldi temp, (1<<ISC01) | (1<<ISC11)
2
ldi temp, (1<<ISC01) | (0<<ISC11)
3
ldi temp, (0<<ISC01) | (1<<ISC11)
4
ldi temp, (0<<ISC01) | (0<<ISC11)
(0<<Bitnummer) lässt man üblicherweise beim VerODERn weg, weil es nix
zum Resultat beiträgt.
Die vier theoretischen Möglichkeiten musst du mit der Tabelle im
Datenblatt vergleichen.
> ldi temp, (1<<ISC01) | (1<<ISC11)
^^ ^^
Schau dir das genau im Datenblatt an. Da ist rein optisch was komisch,
weil dies Bits von zwei unterschiedlichen INTs sind - ISC01 (und ISC00)
gehört zu INT0; ISC11 (und ISC10) gehört zu INT1.
Die vier Einstellungen für INT0
Hi
>Ich habe ein anderes Thema hier gefunden, wo es heißt, das "<<" sei>ein Verschiebungsbefehl, nur wie dieser genau arbeitet, weiß ich immer>noch nicht
'1<<5' macht z.B. aus 0b00000001 (1) -> 0b00100000. Also ein Bit wird 5x
nach links geschoben.
ldi temp, (1<<5) heißt für den Assembler: ldi temp, 0b00100000 ($20)
'1<<ISC01' macht das gleiche, nur das der Wert von ISC01 aus der
Includedatei vom Controller entnommen wird.
> Das "|" zwischen "(1<<ISC01) | (1<<ISC11)" soll auch laut diesem Thema>ein Oder-Operand sein.
Oder heißt, das im Ergebnis an jeder Bitposition eine 1 auftaucht an der
irgendein Operant eine 1 besitzt.
0b10000000
0b00100000
----------
0b10100000
MfG Spess
Vielen Dank euch beiden (nein, in der Zeit, in der ich getippt habe,
sogar schon dreien)! Jetzt hab ichs auch kapiert.
Wie einfach und schnell man manche Sachen in anderen Worten verpackt
doch verstehen kann. Gerade habe ich auch gesehen, dass im Abschnitt zum
LCD-Display auch der Link zu Bitmanipulation angegeben war. Den habe ich
nur damals scheinbar nicht gelesen, weil mein Display ums Verrecken
nichts anzeigen wollte und ich diesen Abschnitt deshalb erstmal
übersprungen habe.
LG Andi
Tip: Schau bitte auch mal in die Hilfe zum AVR-Studio, da sind viele
Dinge recht gut erklärt. Ich meine aber nicht nur das, was per F1-Taste
erreichbar ist, sondern auch den (weiterführenden) Rest, den man durch
Blättern in den Themen erreicht.
...