Forum: Mikrocontroller und Digitale Elektronik Befehlshilfe


von Thomas O. (Gast)


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

von Tobi (Gast)


Lesenswert?

mach eine oder verknüfung mit dem ersten bit des registers, schiebe das
register eine stelle nach links und fang von vorne an

von Thomas O. (Gast)


Lesenswert?

Hallo,

meinst du das etwa so
ldi R16,128(0b10000000)
or R16, R17
ror

von Thomas O. (Gast)


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.

von Quark (Gast)


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

von Thomas O. (Gast)


Lesenswert?

Hallo,

das Carrybit landet durch das rotieren automatisch ins Register Data
oder fehlt noch ein Befehl um es ins Data Register zu schreiben?

von ...HanneS... (Gast)


Lesenswert?

Schau dir mal die AVR-Studio-Hilfe zu ROL und ROR an.

Dazu Cursor im Editor des AVR-Studio auf den gewünschten Befehl setzen
und F1 drücken...

...

von Thomas O. (Gast)


Lesenswert?

Hallo,

ja stimmt steht auch im Instruction Set oben drin hab das garnicht
beachtet gehabt. Mein Programm funktioniert jetzt schon werde jetzt mal
2 AVR verbinden und mal ein paar Daten rüberschicken.

von Andi (Gast)


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

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.