PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 10 bit auf einmal vergleichen ?



Bunch
26.10.2005, 17:43
Hallo,

ist möglich ein 10bit Zahl durch einen Befehl zu vergleichen ?

Ich möchte zB.: überprüfen ob ein Wert < 500 ist oder nicht,
und dann ein incremant abziehen oder hinzuzählen.

Besten Dank

Florian
26.10.2005, 17:47
Hallo Bunch!
Schau am Besten mal hier nach:
http://www.avr-asm-tutorial.net/avr_de/beginner/rechnen.html#CpCpc
Das ist zwar für Worts aber es sind ja zwei Bytes und die 10Bit-Zahlen kannst Du so auch vergleichen!

SprinterSB
26.10.2005, 17:57
Nein, das geht nicht. Bei den wenigen 16-Bit-Befehlen der AVRs ist ein Vergleich auf 16-Bit nicht dabei.

Es geht aber mit

ldi __tmp_reg__, hi8(500)
cpi r24,lo8(500)
cpc r25,__tmp_reg__

Wenn der Wert in r25/r25 steht.
Oder mit cp, cpc gegen einen anderen Registerinhalt vergleichen.
Der Code ist für avr-as; auf einen anderen Assembler zu übertragen wird kein Problem sein.
Danach kannst du den geeigneten Sprung machen.

Bunch
27.10.2005, 09:00
Hallo vielen dank erstmal,

habs versucht, aber die Befehle lo() und hi() kennt das AVR-studio nicht.

Noch was:
Kann ich den 16bit-Wert nicht auf einmal in Register schieben?

Gibt es keine 16-Bit Register?

Sodaß die (zwei 8bit-) Register verknüpft sind, der Wert als einer gesehen wird, und ich mit einem Befehl zB. dec oder inc auf 499 oder 501 komme?

PicNick
27.10.2005, 09:40
@Bunchi: Das soll wirklich nicht bös klingen, aber warum, denkst du, heissen die AVR "8-Bit" Processoren ? Gottseidank hat der AVR ein paar Instruktionen, wo er zwei Register verknüpft (X, Y, Z) aber die schiebt er dann nicht durch die ALU.
Es gibt ja zwei Befehle, die man fast als Ausnahme bezeichnen darf, d.i.
"ADIW" und "SBIW" , doch die lassen wiederum nur Konstanten von 0 - 63 zu.
Und vor allem: denk dir mal die ganze (theoretische) Vergleichssequenz aus und sieh sie dir an. Du wirst sehen, du schiebst das Problem nur von einer Ecke in die andere.

btw: versuch mal "LOW" und "HIGH"

SprinterSB
27.10.2005, 09:46
Das war wie gesagt für GNU avr-Assembler (avr-as).
lo8() und hi8() bedeuten die unteren resp. oberen 8 Bit einer Konstanten.
hi8(500) = 1
lo8(500) = 244

Zum Schieben musst du auch über 2*8-Bit gehen, mit lsr, asr, ror für rechts und lsl und rol für links-Shift.

Die einzigen 16-Bit-Befehle die AVRs kennen sind movw, adiw, und sbiw, allerdings nur auf bestimmten Registern und Immediates in bestimmten Bereichen.

AVR Instruction Set (pdf) (http://www.atmel.com/dyn/resources/prod_documents/DOC0856.PDF)

Oder du nimmt eine Hochsprache wie C oder BASIC, da brauchst du dich um sowas und viele andere Sachen nicht mehr zu kümmern.

PicNick
27.10.2005, 09:55
...da brauchst du dich um sowas ..nicht mehr zu kümmern.

Hab' ich eigentlich garnicht gefragt: geht's ums Kümmern oder um die Suche nach CPU-Instructions ?

SprinterSB
27.10.2005, 11:02
Hab' ich eigentlich garnicht gefragt: geht's ums Kümmern oder um die Suche nach CPU-Instructions ?
Das war keine Antwort auf dein Posting, die hatten sich überschnitten, sorry.