Hallo zusammen,
auch wenn sich das angesprochene Problem mittlerweile gelöst hat,
möchte ich noch einmal diese Thematik durch ein kleines ASM-Prog
untermauern helfen.
Die Syntax:
out portx, temp
ist prinzipiell isoliert gesehen so nicht richtig.
Korrekt wäre es:
ldi temp, 0x00
out ddrx, temp
ldi temp, 0xFF
out portx, temp nur im Zusammenhang mit dem Setzen der Pullup-Widerstände.
Weitere kleine Fiestigkeiten gibt es nun, wenn nicht der gesamte Port
als Eingang/Ausgang sondern nur einzelne Bits deklariert werden sollen.
Und dann noch Ports ständig umfunktioniert werden zwischen Ausgang und Eingang.
Hier muß die Portsynchronisation abgewartet werden in Form von Setzen von NOPs,
da ja bereits eine gewisse "Entprellung" an den Eingängen der Ports wirksam ist.
Ein kleines ASM-Prog zur Demo ist angehängt.
Da ich den PortB verwende, aber nicht extra herumlöten, also
einzelne Strippen ziehen wollte, nur den 10-poligen Stecker verwendete,
dachte ich mir, ich geb's seriell noch aus, was dabei herauskommt.
Funktion:
Taste auf Port B Bit0
Taste losgelassen: LED an PortB Bit1 erlischt; Terminal zeigt Wert 02 an.
Taste gedrückt: LED an PortB Bit1 leuchtet; Terminal zeigt Wert 00 an.
Damit es keinen Kurzschluß gibt, wird Zustand von Taster eine Stelle nach links geschoben,
wo da dann die LED dranhängt.
Hier der interessante Codeschnipsel:
Unten noch angehängt das lauffähige Gesamtprogramm.
Gruß von Oskar01
P.S.:
Der "in" Befehl funktioniert aber auch interessanterweise hier unten im Beispiel
im Zusammemhang mit der "Rettung/Wiederherstellung" des Statusregisters.
Hab's ausprobiert, dann im Umkehrschluß temp auf SREG zurückzukopieren mit "in",
da vermeldet der Assembler/Compiler "Error, wrong register," es wird "out" erwartet.
Eigentlich war ich überrascht, daß nicht wieder auf ein temp vorher "umgeladen"
werden musste (Sozusagen der "Obergefreiten-Schnellweg").
und korrespondierend dazu:
auch wenn sich das angesprochene Problem mittlerweile gelöst hat,
möchte ich noch einmal diese Thematik durch ein kleines ASM-Prog
untermauern helfen.
Die Syntax:
out portx, temp
ist prinzipiell isoliert gesehen so nicht richtig.
Korrekt wäre es:
ldi temp, 0x00
out ddrx, temp
ldi temp, 0xFF
out portx, temp nur im Zusammenhang mit dem Setzen der Pullup-Widerstände.
Weitere kleine Fiestigkeiten gibt es nun, wenn nicht der gesamte Port
als Eingang/Ausgang sondern nur einzelne Bits deklariert werden sollen.
Und dann noch Ports ständig umfunktioniert werden zwischen Ausgang und Eingang.
Hier muß die Portsynchronisation abgewartet werden in Form von Setzen von NOPs,
da ja bereits eine gewisse "Entprellung" an den Eingängen der Ports wirksam ist.
Ein kleines ASM-Prog zur Demo ist angehängt.
Da ich den PortB verwende, aber nicht extra herumlöten, also
einzelne Strippen ziehen wollte, nur den 10-poligen Stecker verwendete,
dachte ich mir, ich geb's seriell noch aus, was dabei herauskommt.
Funktion:
Taste auf Port B Bit0
Taste losgelassen: LED an PortB Bit1 erlischt; Terminal zeigt Wert 02 an.
Taste gedrückt: LED an PortB Bit1 leuchtet; Terminal zeigt Wert 00 an.
Damit es keinen Kurzschluß gibt, wird Zustand von Taster eine Stelle nach links geschoben,
wo da dann die LED dranhängt.
Hier der interessante Codeschnipsel:
PHP:
;....
ausgabe:
;
nop
ldi temp, 0xFE ; Port B Bit0 zum
out ddrb, temp ; Eingabeport machen
ldi temp, 0x01 ; Pullups aktivieren
out portb, temp ; "Knueller": direkt "out" auf "portx"
nop ; Portsynchronisation abwarten
in temp, pinb ; Zustand an Port B einlesen
andi temp, 0x01 ; nur Bit0 ausmaskieren
rol temp ; Wert links schieben, sonst "Kurzschluss"
push temp ; temp auf Stapel retten
ldi temp, 0x02 ; Port B Bit1 zum
out ddrb, temp ; Ausgabeport machen
nop ; Portsynchronisation abwarten
pop temp ; temp vom Stapel zurueckholen
out portb, temp ; Ausgabe Zustand Bit0 auf Bit1
;.....
Unten noch angehängt das lauffähige Gesamtprogramm.
Gruß von Oskar01
P.S.:
Der "in" Befehl funktioniert aber auch interessanterweise hier unten im Beispiel
im Zusammemhang mit der "Rettung/Wiederherstellung" des Statusregisters.
Hab's ausprobiert, dann im Umkehrschluß temp auf SREG zurückzukopieren mit "in",
da vermeldet der Assembler/Compiler "Error, wrong register," es wird "out" erwartet.
Eigentlich war ich überrascht, daß nicht wieder auf ein temp vorher "umgeladen"
werden musste (Sozusagen der "Obergefreiten-Schnellweg").
PHP:
;....
push temp ; Sicherung Temporaer- und
push temp1 ; Statusregister auf Stack
in temp1, SREG
push temp1
;....
PHP:
;.....
pop temp1 ; Temporaerregister und
out SREG, temp1 ; Statusregister wiederherstellen
pop temp1
pop temp
;ret
;.....