Hallo, ich arbeite auf einem atmega16-board und möchte einen Zähler (von
0-9) programmieren, der, solange Switch1 auf ON geschaltet ist,
hochzählen soll, und wenn man sw1 auf OFF stellt, dann soll er
runterzählen (und anzeige auf der 7-Segment-Anzeige).
Ich habe meine Bitmuster für die Zahlen als Array abgespeichert und
greife über den z-Pointer darauf zu. Das Hochzählen klappt schon ohne
Probleme, das mache ich einach mit
1
lpm temp, z+
, jedoch bereitet mir das Runterzählen, also das Dekrementieren des
z-Pointers, mehr Probleme.
Hat jemand eine Idee oder einen Tipp für mich, wie ich das am besten
Lösen könnte?
Vielen Dank, LG aus Salzburg
Christian
so stehts jedenfalls auch in meiner AVR-instruction... jedoch bekomme
ich hier immer die Fehlermeldung: "register r24, r26, r28 or r30
required". Mache ich etwas falsch?
und wenn ich NUR SBIW ZL,1 nehme, dann schreibt er mir zwar keine
fehlermeldung, aber dann zählt er auch nicht runter sondern rauf und das
noch falsch dazu.
Ok, -Z geht mit lpm tatsächlich nicht.
ld bringt dir nichts, da du aus dem Programmspeicher laden willst und
nicht (wie es ld tut) aus dem SRAM.
laut Hilfe sollte das hier funktionieren:
sbiw ZH:ZL, 1
lpm temp1, Z
hab ich so auch ohne Fehlermeldung für einen Mega64 assembliert.
Wenn garnichts mehr hilft kannst du ja eine Arbeitskopie der Bitmuster
im SRAM ablegen. Zumindest wenn du noch genug platz hast.
Sebastian
Hallo,
sbiw zh:zl,1
lpm daten,z
ist auf jeden Fall richtig, das mache ich ständig so. Ist also
hinreichend getestet und wäre auch ohne Test sonnenklar, weil es klar in
der Beschreibung des Befehlssatzes steht. Wo ist das Problem?
Jochen Müller
Das AVR Studio hat doch einen Simulator. Damit sollte man doch mit einer
endlichen Anzahl Permutationen zum Ziel kommen... ah. Ja. Das AVR
Instruction manual sollte man auch heruntergeladfen haben.
:-)
6644 wrote:
> ah. Ja. Das AVR> Instruction manual sollte man auch heruntergeladfen haben.
Wozu? Der komplette Inhalt des Instruction Set Manual ist in der Hilfe
vom AVRStudio enthalten, zum durchklicken... Und F1 ist auch Dein
Freund.
Da du nicht geschrieben hast, welchen "Compiler" bzw. welche Version du
nimmst vermute ich, das dein Assembler evt die Pointerregister nicht
erkennt oder nicht alle 16 Bit Befehle kennt. Ich hatte mal einen
Assembler der movw nicht erkannte.
Probiere es deshalb mal entweder mit:
ich weiß, laut meinem instruction manual sollte das so gehen, aber egal
ob ich
sbiw r31:r30, 1 oder
sbiw ZH:ZL, 1 schreibe, ich bekomme dann immer die fehlermeldung:
"register r24, r26, r28 or r30 required". ich benutze den AVR-AS. ich
bin schon am verzweifeln, das hochzählen funktioniert ohne probleme...
Dann denke ich waere es an der Zeit dem AVR-AS bye-bye zu sagen. Nimm
das AVR Studio, kostet nichts. Der Download ist allerdings etwas
umstandlich, mit den Servicepacks.
nein, die habe ich eingebunden. wie gesagt, das programm funktioniert
beim hochzählen mittels inrementieren des z-pointers wunderbar, nur das
runterzählen funktioniert nicht...
Hallo,
naja, dann gib es ihm doch...
teste eben mit sbiw r30,1
wenn das geht (sollte es ja nach der Meldung) schau in den includes des
mega16 nach, wie das definiert ist.
In den Original-Atmel-Files ist r30 mit ZL definiert, also sollte
sbiw ZL,1 gehen.
Was mich gerade verwirrt:
der AVR-Studio ASM schluckt auch sbiw Z,1, benutze ich auch immer.
Nur: wo ist eigentlich Z definiert??? Im m16def.inc habe ich nicht
gesehen oder nur Tomaten auf den Augen?
Gruß aus Berlin
Michael
Christian wrote:
> ich benutze den AVR-AS.
Und warum sagst Du das nicht gleich?
Hier kann keiner hellsehen.
Wenn Du nichts angibst, wird natürlich davon ausgegangen, daß Du den
AVRASSEMBLER2 von Atmel benutzt.
Dein Assembler scheint also nicht kompatibel zu sein.
Peter
Hallo,
nicht 100% kompatibel mit den Vorgaben von Atmel.
Ein CPU-Hersteller beschreibt normalerweise den Befehlssatz und die
Mnemotik der Befehle, also das Substract Immediate Word mit sbiw
abgekürzt wird.
Daran halten sich auch die Programmierer eines Assemblers.
Bei den Parametern ist die Freiheit da schon größer.
sbiw r30,1 sollte er verstehen.
sbiw ZL,1 schon nur noch, wenn er eine passende Definition dazu hat.
Der Programmierer kann sich da an die Includes von Atmel für die jeweile
CPU halten, genaugenommen muß er das aber nicht.
Spätestens bei den Assembler-Direktiven (das sind Anweisungen an den
Assembler, wie er zu übersetzen hat, z.B.
.org, .prog, .data, .equ, .db, .dw usw. usw. kann jeder machen, was er
will.
Wird er normalerweise nicht, weil sich ein Quellcode von einem anderen
Assembler dann nur mit großen Änderungen übersetzen lassen wird.
Ist aber manchmal trotzdem so, dann bleibt nur Beschreibung des
Assemblers lesen und ändern oder den vom Programmierer des Quellcodes
benutzten Assembler nehmen, wenn das geht.
Da AVR-Studio frei ist, benutzt die Mehrheit wohl den dort
mitgelieferten Assembler.
Mir ist aus alten zeiten noch avra in Erinnerung, kommt aus der
Linux-Welt und war damals komfortabler als der Atmel-ASM.
Gruß aus Berlin
Michael