Befehlshilfe

Gast #136013
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
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
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 #136020
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.
Gast #136021
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.