- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: ATMega88, AVR-Studio 4: ADC, "Operand out of range"

  1. #1
    Unregistriert
    Gast

    ATMega88, AVR-Studio 4: ADC, "Operand out of range"

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Unregistriert Beitrag anzeigen
    ... 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
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Unregistriert
    Gast
    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)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Unregistriert Beitrag anzeigen
    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-08...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-82...t_complete.pdf
    Kapitel: 36. Register Summary

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

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Unregistriert
    Gast
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Unregistriert Beitrag anzeigen
    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:
    Code:
        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
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Atmel Studio meldet "make: *** Waiting for unfinished jobs...."
    Von Che Guevara im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 24.05.2015, 10:12
  2. Wie kann ich ein "code snippet" für AVR-Studio erstellen?
    Von Boomi** im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 06.05.2012, 11:30
  3. AVR-Studio 5 - Befehl "sbic" komische Reaktion!
    Von bexter im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 07.08.2011, 21:01
  4. AVR Studio "ISP Mode Error" beim Flashen
    Von Edi im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 18.10.2006, 22:53
  5. Probleme mit "Operand out of range"
    Von Ozzy im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 04.07.2006, 20:02

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test