www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Befehlshilfe


Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi (Gast)
Datum:

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

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Quark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.