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
mach eine oder verknüfung mit dem ersten bit des registers, schiebe das register eine stelle nach links und fang von vorne an
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.
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
Hallo, das Carrybit landet durch das rotieren automatisch ins Register Data oder fehlt noch ein Befehl um es ins Data Register zu schreiben?
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... ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.