atmega 88, ADC Starten geht nicht

Gast #2114562
Lesenswert?
• ▲
▼
Hallo, ich möchte gern in Assembler ADC-Umwandlung einzeln bei atmega88 
starten. Ich hatte Code von atmega 8 geändert. Aber ich kriege eine 
Fehlermeldung von AVR Studio 4.17 : error: Invalid register

Da sind Code von atmega 8
    ldi     temp1, (1<<REFS0)
    out     ADMUX, temp1
    ldi     temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    out     ADCSRA, temp1
    sbi     ADCSRA, ADSC  ; Hier geht doch!

und atmega88

 ldi     temp1, (1<<REFS0)| (1<<REFS1)| (1<<ADLAR)| (1<<MUX0)| (1<<MUX1)
 sts     ADMUX, temp1
 ldi     temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1)|(1 << ADSC)
 sts ADCSRA, ADSC    ; DA IST FEHLER


Wie kann ich  sts ADCSRA, ADSC richtig eintragen?
Gast #2114598
Lesenswert?
• ▲
▼
Das liegt daran, dass die Bitbefehle nur bis Adresse 0x1F funktionieren.


So steht es im  Datasheet:
I/O Registers within the address range 0x00 - 0x1F are directly 
bit-accessible using the SBI and CBI instructions. In these registers, 
the
value of single bits can be checked by using the SBIS and SBIC 
instructions.

When using the I/O specific commands IN and OUT, the I/O addresses 0x00 
- 0x3F must be used.

When addressing I/O Registers as data space using LD and ST 
instructions, 0x20 must be added to these addresses.
Gast #2114610
Lesenswert?
• ▲
▼
Hi

>bei Atmega8 geht einfacher. Wenn man eine Umwandlung starten will.
>    sample_adc:
>    sbi     ADCSRA, ADSC        ; den ADC starten

Na und. Beim ATMega88 und vielen anderen auch geht es halt nicht wie 
beim ATMega8. Außerdem gibt es auch noch Autorun mit einer Reihe von 
Triggermöglichkeiten.

MfG Spess
Gast #2114636
Lesenswert?
• ▲
▼
Hi

>Gibt es einen Tutorial für Atmrga88  in Assembler?

Soll es denn für jeden einzelnen AVR-Typ ein Tutorial geben? So groß 
sind die Unterschiede nicht. Das ganze betrifft eigentlich nur einige 
Befehle, die auf Adressen, die im IO-Bereich liegen, zugreifen. Also 
in/out, sbi/cbi, und sbic/sbis. Und davon sind  sbi/cbi und sbic/sbis 
auch beim ATMega8 nicht auf alle IO-Register anwendbar.
Also stell dich nicht so an.

MfG Spess
Gast #2114677
Lesenswert?
• ▲
▼
Ich verfolge ein Ziel, meine Code einfach zu gestalten. Freilich wenn es 
möglich ist. Zum Beispiel im diesem Projekt(Versuch) möchte ich gern mit 
Zeitabständen ADC-Wandlungen einzeln in PC1 und PC2 durzuführen. Bei 
Atmega8 könnte ich eine Wandlung einfach  "sbi     ADCSRA, ADSC" 
starten. Aber bei Atmega88 soll ich ein Bisschen umständlicher eine 
Umwandlung starten:
  lds r16,ADCSRA
  sbr r16, 1<<ADSC
  sts ADCSRA,r16

Gibtes ein Trick die Code einfacher machen?

Der Atmega88 ist ein Nachfolger vom Atmega8. Ich dachte, er soll 
leichter für Programmieren gestaltet.
Gast #2114686
Lesenswert?
• ▲
▼
Hi

>Gibtes ein Trick die Code einfacher machen?

Dann mach dir ein Makro:

   .macro start_adc
     lds r16,ADCSRA
     sbr r16, 1<<ADSC
     sts ADCSRA,r16
   .endmacro

Im Programm schreibst du dann

   ...
   start_adc
   ...

und der Assembler fügt die Zeilen aus dem Macro ein. Fertig.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren