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?
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
bei Atmega8 geht einfacher. Wenn man eine Umwandlung starten will. sample_adc: sbi ADCSRA, ADSC ; den ADC starten
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.
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.