www.mikrocontroller.net

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


Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> error: Invalid register

Im Datenblatt nachschauen, wie es genannt ist.

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statt:
 sts ADCSRA, ADSC    ; DA IST FEHLER
so:
 sts ADCSRA, temp1

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist gleich wie Datenblatt genannt

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei Atmega8 geht einfacher. Wenn man eine Umwandlung starten will.

    sample_adc:
    sbi     ADCSRA, ADSC        ; den ADC starten

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es einen Tutorial für Atmrga88  in Assembler?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prima! Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.