Befehlshilfe

Gast #136013
Lesenswert?

Hallo,

ich habe folgendes kurze Problem finde, hoffe das mir jemand kurz auf
die Sprünge helfen kann. Ich hole dazu mal kurz etwas weiter aus obwohl
es ja ein sehr kurzer Code ist.

Ich frage eine Pin(Taktleitung) ab ob er high ist, wenn ja wird die
Datenleitung auch mit sbis abgefragt, wenn ja soll mir das HSB oder LSB
eines Registers gesetzt werden. Danach geht das Programm wieder von
vorne los und soll das 2te Bit des Registern je nach Zustand der
Datenleitung auf 0 oder 1 setzen. Das ganze geschieht insg. 8 mal bis
das Byte komplett ist danach wird das Register auf einen Port mit Leds
ausgegeben.

Die Verzweigungen im Programm funktionieren, ich suche nur nach dem
Befehl ein Bit an die xte Stelle eines Bytes(Registers) zu setzten.
Gibt es auch die Möglichkeit die Stelle hochzuzählen. Stelle mir das so
vor.

Speichere Bit nach R16 an die Stelle x
X=X+1
IF X=8 GOTO Ausgabe
Speichere Bit nach R16 an die Stelle x
X=X+1
IF X=8 GOTO Ausgabe

Ich sehe sonst nur die Lösung das so zu machen
mit sbis abfragen, das dann zu einen SET Befehl gesprungen wird der mit
das T-Flag setzt dieses wird dann an die passende Stelle gesetzt wobei
ich die ja nicht hochzählen kann, oder gibts da irgendwie eine Variable
wie in Basic so das ich die Bitstelle einfach inkrementieren kann.
main: sbis Pinb,1
rjmp main
set
bld r16,0
...
set
bld r16,1
...
set
bld r16,2
Gast #136016
Lesenswert?

Hallo,

sollte noch hinzufügen das es auf Geschwindigkeit ankommt also
möglichst wenig Befehle. Deswegen wäre es fast besser auf eine
Hochzählschleife zu verzichten und leiber den Befehl 8mal im Code
reinzuschreiben.

Hiermit brauche ich nur 2 Befehle
set
bld r0,0 ; Load T Flag into bit 4 of r0
dachte das es hierfür vielleicht einen Befehl gibt der mir den Umweg
über das T-Flag erspart wo ich also direkt nach R0,Bitx speichern kann.
Gast #136017
Lesenswert?

Hallo Thomas,
meinst Du folgendes?
Aufgrund deines eingelesenen Wertes das Carry-Flag
setzen und dann einmal Rotate-Left.
So solltest Du schnell Dein Byte in einer schleife
richtig füllen können.
Sorry, wenn ich was falsch verstanden habe.
Gruß
Quark

Beispiel:

   ldi loop_cnt, 8  ; loop counter mit 8 laden
loop:
   clc              ; carry löschen
   sbic PINC, Q     ; Pin abfragen und nächste befehl überspringen
                      wenn low
   sec        ; carry stezen (wenn high)
   rol data         ; rotiere links
   dec loop_cnt     ; loop counter - eins runterzählen
   brne loop        ; schleife, bis loop counter = 0
Gast #136021
Lesenswert?

Hier noch ein Beispiel:

   clr Data         ; Datenbyte löschen
   ldi Bit_Mask, 0b10000000  ; MSB in Bit-Mask setzen
loop:
   sbic PINC, Q     ; Pin abfragen und nächsten befehl überspringen
                      wenn low
   or Data, Bit_Mask ; Wenn Pin = high dann betreffendes Bit
                     ; in Data mittels Oder-Verknüpfung setzen
   lsr Bit_Mask     ; rotiere Bit_Mask eins nach rechts (6, 5, 4...0)
   brcc loop        ; schleife, bis das Bit in Bit_Mask im Carry ist

Dabei wird auf das Datenbyte immer ein Bit von Bit_Mask mit OR
verknüpft.
Die Bit-Maske wird dabei 8 mal nach rechts rotiert.
Die Schleife geht solange bis das Bit in Bit_Mask in das Carry-Flag
reingeschoben wurde.

Gruß
Andi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren