Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zum AVR-Tutorial: Interrupts (Assembler)


von Andreas F. (Firma: //) (andifin)


Lesenswert?

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

von Helfer (Gast)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

>  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
1
  ldi temp, (1<<ISC01) | (1<<ISC00)
2
  ldi temp, (1<<ISC01) | (0<<ISC00)  
3
  ldi temp, (0<<ISC01) | (1<<ISC00)  
4
  ldi temp, (0<<ISC01) | (0<<ISC00)

Die vier Einstellungen für INT1
1
  ldi temp, (1<<ISC11) | (1<<ISC10)
2
  ldi temp, (1<<ISC11) | (0<<ISC10)  
3
  ldi temp, (0<<ISC11) | (1<<ISC10)  
4
  ldi temp, (0<<ISC11) | (0<<ISC10)

von Helfer (Gast)


Lesenswert?

> ldi temp, (1<<ISC01) | (1<<ISC11) ; INT0 und INT1 auf fallende Flanke

Wäre dann "ausgeschrieben"
1
  ldi temp, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (1<<ISC10)
2
;           ^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^
3
;               INT0-Einstellung         INT1-Einstellung

von Helfer (Gast)


Lesenswert?

>  ldi temp, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (1<<ISC10)

Korrektur:
  ldi temp, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (0<<ISC10)
                                                    ^

von spess53 (Gast)


Lesenswert?

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

von Andreas F. (Firma: //) (andifin)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

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.