Hallo Michael!
Ein Port hat ein Register (DDRx) mit dem du die Richtung (Direction) des Ports oder einzelner Pins eines Ports festlegst und ein Datenregister Register (PORTx). Mit dem Datenregister PORTx kannst du Daten am Port ausgeben, wenn der Port als Ausgang geschaltet ist oder die Funktion Tristate/Pullup einstellen, wenn der Port als Eingang geschaltet ist.
Wenn du PORTx ausliest, liest du nicht die logischen Zustände der Pins des Ports, sondern den Registerinhalt von PORTx.
Möchtest Du den logischen Zustand von Pins einlesen, musst du den entsprechenden Portpin mit DDRx als Eingang schalten, mit PORTx definierst du entweder Tristate (hochohmig) oder Pullup.
Einlesen kannst du nun den Zustand über PINx, Beispiel:
Das geht so nicht, zumindest dann nicht, wenn du die logischen Zustände der Pins eines Ports abfragen möchtest.Ich habe heute Abend mal selber versucht, Port`s abzufragen, und das auf einen anderen Port aus zugeben.
Code:
in portd,rega
out porta,rega
geht das so? oder gibt es da "feinere" Lösungen für ?
Ein Port hat ein Register (DDRx) mit dem du die Richtung (Direction) des Ports oder einzelner Pins eines Ports festlegst und ein Datenregister Register (PORTx). Mit dem Datenregister PORTx kannst du Daten am Port ausgeben, wenn der Port als Ausgang geschaltet ist oder die Funktion Tristate/Pullup einstellen, wenn der Port als Eingang geschaltet ist.
Wenn du PORTx ausliest, liest du nicht die logischen Zustände der Pins des Ports, sondern den Registerinhalt von PORTx.
Möchtest Du den logischen Zustand von Pins einlesen, musst du den entsprechenden Portpin mit DDRx als Eingang schalten, mit PORTx definierst du entweder Tristate (hochohmig) oder Pullup.
Einlesen kannst du nun den Zustand über PINx, Beispiel:
Code:
sbic PINA, PA0 ; skip, wenn PA0 logisch 0 ist
sbis PINA, PA0 ; skip, wenn PA0 logisch 1 ist
in RegA, PINA ; alle logischen Zustände der Pins in RegA
Zum Beispiel so (Pins vorher als Eingang mit Pullup beschalten):Verzweigung, wenn PortD-Pin0 Low, bzw wenn Portd-Pin1 Low ist?
Code:
sbis PIND, PD0
rjmp taste_pin0_gedrueckt
sbis PIND, PD1
rjmp taste_pin1_gedrueckt
Wenn ich nun Addition / Subtration mit dem "Rega" anstellen will (also + bzw - 1), was mach ich da ? Mit "add" berechne ich gleich 2 Byte, oder?
Code:
; 8bit Addition
add RegA, RegB ; RegA = RegA + RegB (Bei Überlauf ist Bit c = 1)
; 16Bit Addition
ldi RegA, low(1000) ; erste Zahl
ldi RegB, high(1000)
ldi RegC, low(3500) ; zweite Zahl
ldi RegD, high(3500)
add RegA, RegC ; erst niederwertige Bytes addieren
adc RegB, RegD ; dann höherwertige Bytes addieren und Überlauf C berücksichtigen
; Bei Subtraktion funktioniert das äquivalent.
; Nun noch mit Konstanten subtrahieren:
subi RegA, 20 ; RegA = RegA-20
; Addieren mit Konstanten über subi
subi RegA, -20 ; RegA = RegA+20
; Addition von 1 (inkrementieren)
inc RegA
; Subtraktion von 1 (dekrementieren)
dec RegA