Forum: Compiler & IDEs atmega8 adc


von steffen abel (Gast)


Lesenswert?

Hallo miteinander,

ich versuche gerade verzweifelt den adc am atmega8 anzusprechen, 
allerdings scheitert es schon daran, dass der compiler die ganzen 
register nicht kennt.

#include <inttypes.h>
#include <avr/io.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
  outp((1<<ADEN) & (1<<ADFR) & 5, ADCSR);
  ADMUX = 0;
  ...

mehr ist es noch nicht, aber ich bekomme als fehlermeldungen:

error: ADCSR undeclared
error: ADFR undeclared
error: ADEN undeclared
error: ADMUX undeclared

woran kann das liegen? in allen tutorials die ich gefunden habe wird der 
adc so gestartet. als programmierumgebung verwende ich das avr studio 
von atmel und avr-gcc.

danke schonmal!
mfg
--steffen

von steffen abel (Gast)


Lesenswert?

ok, die frage hat sich jetzt doch erledigt, ich hatte vergessen an den 
anfang das

#define _AVR_ATmega8_

zu schreiben. jetzt gibt es keine probleme mehr mit dem compilieren. 
allerdings funktioniert jetzt die ausgabe an den port d mit

PORTD = 0xFF;

bzw.

outp(0xFF, PORTD);

seltsamerweise nicht mehr. weiß da jemand rat?

mfg
--steffen

von Peter Fleury (Gast)


Lesenswert?

Deine Anweisung _AVR_ATMega8_ gehört nicht ins Source File !
Den AVR Typ muss man mit dem Compiler Flag -mmcu=ATMega8 mitgeben, siehe 
Beispiel \winavr\sample\Makefile.
Bitte neueste WinAVR Version verwenden, nur diese unterstützt ATMega8.

von steffen abel (Gast)


Lesenswert?

wenn ich im makefile den atmega8 einstelle, dann bekomme ich die meldung 
"mcu 'atmega8' supported for assembler only". die neueste winavr version 
habe ich (20030312).

wer hat ideen?
danke & viele grüße
--steffen

von Peter Fleury (Gast)


Lesenswert?

Kleinschreibung: -mmcu=atmega8 dann sollte es gehen.

von Sascha Weitkunat (Gast)


Lesenswert?

Was soll das denn bitte bedeuten?

> outp((1<<ADEN) & (1<<ADFR) & 5, ADCSR);

Ich gehe mal davon aus das (1 << ADEN) und (1 << ADFR) das 4er und 1er 
Bit bilden, du diese mit 5 (also ebenso 4er und 1er Bit) verknüpfst und 
hoffst da auch als Ergebnis 5 raus zu bekommen?

outp(5, ADCSR)

währe die eine Möglichkeit, das übliche ist aber eine Oder-Verknüpfung 
der geshifteten 1en.

outp((1 << ADEN) | (1 << ADFR), ADCSR);

Des weiteren scheinst du dich nicht zwischen outp() und einer direkten 
Zuweisung entscheiden zu können... da outp() als veraltet gilt benutz 
lieber die direkte Zuweisung:

ADCSR = (1 << ADEN) | (1 << ADFR);

von steffen abel (Gast)


Lesenswert?

also erstmal danke an alle, der code wird jetzt fehlerfrei compiliert. 
ich habe mich jetzt auch für die direkte zuweisung entschieden und alles 
so geschrieben.

allerdings habe ich jetzt ein neues, sehr komisches problem. siehe mein 
anderer thread.

mfg
--steffen

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.