2016-04-22 4 views
-1

Ich fange an Assembler zu lernen, und ich habe diesen Zweifel. Ich habe das folgende CodesegmentSBIC-Anweisung in AVR Assembler

LDI R16, 0 
OUT DDRB, R16 ; Configures port B as an input port 
SBIC PORTB, 0 
LDI R18, 0xAA 
OUT PORTC, R18 
RETI 

ich gelesen habe, was SBIC tut, ist die Überprüfung (in diesem Fall), wenn das Bit 0 von Port B ist klar. Wenn dies der Fall ist, überspringt es die nächste Anweisung.

Meine Fragen sind:

1) Ist OUT DDRB, R16 Schreib 0'en in alle Bits von Port B oder ist es nur eine Konfigurationsanweisung aber es funktioniert nicht Schreib etwas? Mit anderen Worten: Sind die Bits von Port B alle auf 0 gesetzt?

2) Wenn sie alle auf 0 gesetzt sind, wird die Anweisung nach SBIC übersprungen. Aber wird nur die erste Anweisung, die als nächstes kommt, übersprungen, oder wird alles bis RETI erreicht?

+0

Wie der Kommentar sagt, konfiguriert es den Port als Eingabe. Es schreibt nichts. 'SBIC' liefert, was auch immer die an den Port-Pins angeschlossene externe Schaltung liefert, und überprüft nur ein einzelnes Bit und überspringt auch nur einen einzelnen Befehl. Dies ist alles in der Anleitung geschrieben. – Jester

+0

Ist es nicht möglich, 1 und 0 in die Pins eines Ports zu schreiben, mit so etwas wie 'LDI R16, 0xFF' und dann' OUT PORTA, R16'? In diesem Fall hängt das, was 'SBIC' zurückgibt, nicht von der externen Schaltung ab, oder bin ich falsch? Und noch eine letzte Sache: Ist es möglich zu wissen, ob 'SBIC' die nächste Anweisung mit genau dem Codeabschnitt überspringt, den ich in der Frage geschrieben habe? – Tendero

+0

Wenn der Port als Eingang konfiguriert ist, steuert das Schreiben in der Regel das interne Pull-Up (aber vergewissern Sie sich bitte in Ihrer speziellen Chip-Dokumentation). Nein, Sie können nicht sagen, ob 'SBIC' übersprungen wird oder nicht. Wenn du könntest, gäbe es keinen Sinn, es dort zu benutzen. – Jester

Antwort

1

Der erste Befehl schreibt Nullen in alle Bits des DDRB-Registers. Ich nehme an, aus dem Kommentar und dem Namen des Registers macht dies alle Pins von Port B Eingaben. Dies würde nicht explizit etwas ausgeben, aber abhängig davon, wie das Gerät elektrisch konfiguriert wurde, kann jedes externe Gerät, das versucht, einen der Pins von Anschluss B an diesem Punkt zu lesen, eine Wertänderung sehen, da sie nicht länger zum Lesen konfiguriert sind.

Der nächste Befehl testet das 0. Bit des PORTB-Registers, dessen Wert davon abhängt, was mit dem entsprechenden Pin verbunden ist. Wenn es klar ist, wird die nächste Anweisung LDI R18, 0xAA übersprungen. Wenn es gesetzt ist, wird die nächste Anweisung ausgeführt.

Das bedeutet, dass der im PORTC-Register gespeicherte Wert OUT PORTC, R18 sowohl vom Zustand des ersten Pins von Port B als auch von dem zu Beginn der Ausführung Ihres Beispielcodes in R18 enthaltenen Wert abhängt.