PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega88, AVR-Studio 4: ADC, "Operand out of range"



Unregistriert
20.10.2015, 14:40
Hallo,
darf ich um Hilfe bitten, tüftle jetzt schon einen ganzen Tag.
Win7, AVR Studio 4.19, Controller: ATMega 88PA, Assembler. Möchte einen ADC auslesen. Mit dem ATMega 8 läuft der Code. Aber beim 88PA meldet der Compiler bei sämtlichen Befehlen, die das ADC-Register betreffen "error: operand 1 (oder 2) out of range". Selbst nur die Zeile cbi ADCSRA,ADEN (Abschalten vom Freerunmodus) funktioniert nicht.

Der ATMega88PA ist im "AVR Studio" richtig angegeben (Menü Debug, Select Platform and Device). Vermute die Ursache in der .inc Datei. Habe es bereits mit allen plausibel erscheinenden include-Dateien im Verzeichnis "Appnotes" versucht: M88Adef.inc, M88dec.inc, M88PAdef.inc, M88PAdef.inc. Hilft aber nicht.

Im Voraus schonmal vielen Dank!
Heinz

Searcher
20.10.2015, 15:23
... Selbst nur die Zeile cbi ADCSRA,ADEN (Abschalten vom Freerunmodus) funktioniert nicht.


cbi kann nur Adressen bis 31 adressieren. Siehe "8-bit AVR Instruction Set" ADCSRA liegt aber beim ATMega88PA auf Adresse 122 (0x7A). Im ATMega8 liegt das ADCSRA noch im cbi adressierbaren Bereich. Mußt dir also was überlegen um das Bit anders zu löschen.

Gruß
Searcher

Unregistriert
20.10.2015, 18:11
ok, vielen Dank! Auf was man alles achten muss... Also dann ohne sbi / cbi: Register lesen, Bit setzen, Register schreiben.
Der Ersatz für "cbi ADCSRA,ADEN" (Freerun abschalten) wäre dann:

in Temp, ADCSRA
sbr Temp, 1<<ADEN
out ADCSRA, Temp

Was bleibt ist der Phänomenosaurus Gigantomaximus:

a) in Temp, MCUCR: wird anstandslos compiliert
b) in Temp, ADCSRA: wird angemeckert (out of range)

Searcher
20.10.2015, 19:10
Der Ersatz für "cbi ADCSRA,ADEN" (Freerun abschalten) wäre dann:

Mit Löschen von ADEN wird nicht explizit der Freerun abgeschaltet, sondern der ganze ADC.



in Temp, ADCSRA

Schau den Befehl "in" und dessen erlaubte Adressen in http://www.atmel.com/images/atmel-0856-avr-instruction-set-manual.pdf nach.



sbr Temp, 1<<ADEN

sbr setzt bits und funktioniert anders als sbi bzw cbi -> instruction set



out ADCSRA, Temp

erlaubte Adressen wie bei "in" nachschauen.



a) in Temp, MCUCR: wird anstandslos compiliert

MCUCR ist im erlaubten Adressenbereich für "in". Siehe http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf
Kapitel: 36. Register Summary



b) in Temp, ADCSRA: wird angemeckert (out of range)
Siehe oben.

Gruß
Searcher

Unregistriert
20.10.2015, 21:00
nochmals Danke!!!
Prinzip habe ich (glaube ich) verstanden: Die Ein-/Ausgabe Assemblerbefehle reichen nur über einen begrenzten Adressbereich. Sie funktionieren, solange ein (I/O) Register innerhalb dieses Bereichs liegt.

Den letzten Lösungsansatz habe ich aus "AVR-ASM-Tutorial", Seite 38 abgeleitet. In der Assemblerhilfe AVR-Studio4 gehe ich jetzt alle Befehle durch, nach einer Alternative für "in". Ich finde "sts". Nur, wie geht man mit dem Dataspace um? Es muß eine 16Bit-Adresse supplied werden - wie? Wo sehe ich was wann wo eine 16-Bit-Adresse ist? Usw. Es sind einfach zu viele vernetzte Informationen und Details auf einmal.

Ich will nicht unverschämt sein, ich kann mich ja nicht revanchieren, aber dürfte ich Dich bitten mir eine Vorlage für obiges Beispiel zu schreiben? Wenn ich sehe, wie es geht, kann ich gezielter nachlesen und mich weiterhangeln.

Grüße
Heinz

Searcher
21.10.2015, 08:04
Den letzten Lösungsansatz habe ich aus "AVR-ASM-Tutorial", Seite 38 abgeleitet. In der Assemblerhilfe AVR-Studio4 gehe ich jetzt alle Befehle durch, nach einer Alternative für "in". Ich finde "sts". Nur, wie geht man mit dem Dataspace um? Es muß eine 16Bit-Adresse supplied werden - wie? Wo sehe ich was wann wo eine 16-Bit-Adresse ist? Usw. Es sind einfach zu viele vernetzte Informationen und Details auf einmal.

Ich bin auch nicht der Profi und nutze Assembler nur innerhalb von BASCOM. STS und LDS ist schon richtig. Ob 16-Bit Adresse oder 7-Bit Adresse - egal - der Assembler (also das Übersetzerprogramm, das den Assemblerquelltext mit den Mnemonics in Opcode übersetzt) kümmert sich drum ob es den 32-Bit Opcode oder den 16-Bit Opcode einsetzt.



... dürfte ich Dich bitten mir eine Vorlage für obiges Beispiel zu schreiben? Wenn ich sehe, wie es geht, kann ich gezielter nachlesen und mich weiterhangeln.


temp steht für ein Register ab r16, daß an der Stelle im Programm überschrieben werden darf und für CBR erlaubt sein muß -> in ASM Reference nachlesen:


lds temp,Adcsra
cbr temp,1<<ADEN 'bei cbr wird das Bit (bzw die Bits), die gelöscht werden soll auf "1" gesetzt
sts Adcsra,temp

lds temp,Adcsra
andi temp,01111111 'macht das Gleiche und für mich übersichtlicher, weil ich weiß, daß ADEN Bit Nummer 7 ist.
sts Adcsra,temp


PS kann das nicht nachtesten - du solltest das im Simulator ausprobieren. Bei mir macht BASCOM beim assemblieren aus CBR immer ein ANDI mit dem Komplement der Maske. Es gibt wohl keinen eigenen Opcode für CBR sondern der Assembler macht bei bei CBR immer ein Komplement der Maske und nimmt dann den ANDI Opcode. Deshalb findet man auch den Begriff Pseudocode für CBR.

Gruß
Searcher