Hallo Bunch!
Schau am Besten mal hier nach:
http://www.avr-asm-tutorial.net/avr_...nen.html#CpCpc
Das ist zwar für Worts aber es sind ja zwei Bytes und die 10Bit-Zahlen kannst Du so auch vergleichen!
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
Wer nur das macht was er schon kann, bleibt immer das was er schon ist.
Hallo Bunch!
Schau am Besten mal hier nach:
http://www.avr-asm-tutorial.net/avr_...nen.html#CpCpc
Das ist zwar für Worts aber es sind ja zwei Bytes und die 10Bit-Zahlen kannst Du so auch vergleichen!
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.
Disclaimer: none. Sue me.
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?
Wer nur das macht was er schon kann, bleibt immer das was er schon ist.
@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"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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)
Oder du nimmt eine Hochsprache wie C oder BASIC, da brauchst du dich um sowas und viele andere Sachen nicht mehr zu kümmern.
Disclaimer: none. Sue me.
Hab' ich eigentlich garnicht gefragt: geht's ums Kümmern oder um die Suche nach CPU-Instructions ?Zitat von SprinterSB
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das war keine Antwort auf dein Posting, die hatten sich überschnitten, sorry.Zitat von PicNick
Disclaimer: none. Sue me.
Lesezeichen