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