PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : adc konfigurieren und auslesen



lionking
09.04.2006, 23:05
moin,

ich mochte gerne an meinen mega168 ein poti anschliessen und den wert über einen analogen eingang einlesen.

jetzt ist die frage wie ich in avr studio in C auf dies adc ports zugreife.
vielleicht bin ich einfach zu blöd, aber ich hab im netz nichts dazu gefunden, leider nur in basic, aber das kann ich nicht.

[-o< Stefan

kanal28
09.04.2006, 23:31
Hallo lionking,

schau mal bei http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial vorbei - da wird die Programmierung des ADC für C erklärt und ein Beispiel ist auch dabei. Wenn Du konkrete Probleme bei der Umsetzung hast, melde Dich am besten nochmal.

Gruß
kanal28

lionking
10.04.2006, 00:33
danke, das hat mir schonmal sehr weitergeholfen, den teil hab ich irgendwie voll übersehen :oops:

doch nochwas, in dem tutorial ist der adc anhand des AT90S8535 beschrieben, was ist da anders zu meinem mega168?

die simu funzt jedenfalls schonmal

lionking
10.04.2006, 01:49
sop nu hab ich nen kleines probblem, wie gesagt funzt die simu, aber halt nicht in real.

ich will die blinkgeschwindigkeit einer LED mit einem Poti steuern.
das blinken der led funzt, nur die steuerung nicht.

ich hab das poti (50k) an 5V und GND und den schleifer an PC1 bzw ADC1



#include <avr/io.h>

int t=0;
int c = 0;

void init_io(void)
{
DDRD |= (1<<PD2); //PortD wird als Ausgang definiert
PORTC |= (1<<PC0); //Pullup-Wiederstand von PortC Pin1 wird aktiviert
}

int ReadChannel(int mux)
{
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)

ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen


ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten

int wert = ADCL;

ADCSRA &= ~(1<<ADEN);

return wert;
}

void main(void)
{
init_io(); //Ruft die Funktion init_io() auf
//init_adc(); //init des adc

while(1)
{

t=0;
c = ReadChannel(1)*100; //lese analogen wert aus channel 1 in c
while (t<c) t++; //zählt... als delay
if (PINC & (1<<PINC0)) //wenn PINC2 an is
PORTD = PIND ^(1 << PD2); //wechsle den status von PIND2 (die LED blinkt)
else PORTD &= ~(1<<PD2); //wenn PINC2 nich an bleibt die LED aus
}
}

das is der code.

er blinkt, aber lässt sich nicht regeln

[-o< Stefan

kanal28
10.04.2006, 09:50
ein paar Sachen, die mir auffallen:

Also mit Pull-ups bin ich nicht so sicher - bei mir läuft die Messung aber ohne Pull-up am ADC

mux ist bei Dir int (also größer als ein byte und mit Vorzeichen) - ADMUX sollte aber nur 8 Bit sein, versuche mal unsigned char oder uint8_t (das gleiche mit wert - Du musst noch die zweite Hälfte des Messwertes auslesen, in der Reihenfolge: ADCL, ADCH)

Und der code blinkt? hätte nicht gedacht, dass das so lange dauert. Das Blinken könnte aber einfach auch die Dauer der Wandlung sein... Versuch doch einfach mal den Messwert auszulesen und dann abhängig von der Größe des Messwertes LED an/aus - also wenn wert kleiner 500, dann aus, sonst an. Dann kannst Du jedenfalls feststellen, ob er beim Drehen unterschiedliche Werte ermittelt

kanal28

lionking
10.04.2006, 13:10
pullup is am adc deaktiviert, da is der kommentar falsch, das muss heissen: //Pullup-Wiederstand von PortC Pin0 wird aktiviert
das is die funktion, dass wenn man den pin auf masse legt hört er auf zu blinken.

das blinken kommt daher, dass er in einer schleife eine variable hochzählt... und den punkt zu dem er zählt wollte ich mit dem poti einstellen

so mux als uint8_t
und
int wert = ADC;

dann funzts, aber das is ein seeeehr kleiner bereich am poti mit dem ich die geschwindigkeit einstellen kann, es gibt sogar zwei bereiche:

GND: blinkt ganz schnell (nicht mehr sichtbar als blinken, nur mittelhelles leuchten)
.
.
....langsamer
.
.
....blinkt etwas schneller als 1mal pro sekunde
....plötzlich wieder wie bei GND ganz schnell
.
....langsamer
.
....wieder etwas schneller als 1mal pro sekunde
....plötzlich wieder wie bei GND ganz schnell
.
....bleibt so bis +5V
.
....5V

warum?

lionking
10.04.2006, 13:55
sop es funzt... da is mir wohl die variable 'c' übergelaufen...
und wenn ich nen lautsprecher anschliesse mach er musik :D
von ganz tief bis 3000Hz leider macht er nach oben hin immer grössere sprünge, aber das is ja klar...

danke für deine hilfe