Forum: Mikrocontroller und Digitale Elektronik atmega 88, ADC Starten geht nicht


von Alexander (Gast)


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?

von Floh (Gast)


Lesenswert?

Alexander schrieb:
> error: Invalid register

Im Datenblatt nachschauen, wie es genannt ist.

von pacer (Gast)


Lesenswert?

statt:
 sts ADCSRA, ADSC    ; DA IST FEHLER
so:
 sts ADCSRA, temp1

von spess53 (Gast)


Lesenswert?

Hi

> sts ADCSRA, ADSC    ; DA IST FEHLER

>Wie kann ich  sts ADCSRA, ADSC richtig eintragen?

  lds r16,ADCSRA
  sbr r16, 1<<ADSC
  sts ADCSRA,r16

MfG Spess

von Alexander (Gast)


Lesenswert?

Es ist gleich wie Datenblatt genannt

von Alexander (Gast)


Lesenswert?

bei Atmega8 geht einfacher. Wenn man eine Umwandlung starten will.

    sample_adc:
    sbi     ADCSRA, ADSC        ; den ADC starten

von pacer (Gast)


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.

von Alexander (Gast)


Lesenswert?

vielen Dank

von spess53 (Gast)


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

von Alexander (Gast)


Lesenswert?

Gibt es einen Tutorial für Atmrga88  in Assembler?

von spess53 (Gast)


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

von Alexander (Gast)


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.

von spess53 (Gast)


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

von Alexander (Gast)


Lesenswert?

Prima! Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.