// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
8
// schon auf 0, also single conversion
9
ADCSRA=(1<<ADPS1)|(1<<ADPS0);// Frequenzvorteiler
10
ADCSRA|=(1<<ADEN);// ADC aktivieren
11
12
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
13
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
14
15
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
16
while(ADCSRA&(1<<ADSC)){}// auf Abschluss der Konvertierung warten
17
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
18
Wandlung nicht übernommen. */
19
result=ADCW;
20
}
Doch irgendwie bleibt er in dieser funktion stehen. Wenn ich nach aufruf
dieser Funktion z.B. Leds einschalte passiert nichts.
Hoffentlich kann mir jemand helfen.
LG Florian Schuller
Kenn mich mit dem Atmega128 zwar nicht so gut aus... aber was ist ADCW?
Wie viel Bit hat den der ADC? Müsste es nicht die Register ADCH und ADCL
geben in denen das ADC Ergebnis steht? Du hast ja die Variable result,
du erwartest also mehr als 8 bit...
Ist alles richtig verdrahtet?
Du könntest mal versuchen die LED in dieser Funktion zwischen bestimmten
Aufrufen zu schalten um die genaue Stelle zu finden wo der Fehler
auftritt. Ich vermute er bleibt in der while Schleife hängen...
Florian Schuller schrieb:> Doch irgendwie bleibt er in dieser funktion stehen. Wenn ich nach aufruf> dieser Funktion z.B. Leds einschalte passiert nichts.
Diese Funktion initialisiert (schaltet ein) ja auch nur den ADC.
Zum auslesen des Wertes gibt es die ADC_Read Funktion aus dem gleichen
Tutorial.
Im Tutorial ist auch ein komplettes main() Programm, welches zeigt wie
man die Funktionen benutzt. Hast du das nicht gesehen?
till schrieb:> Kenn mich mit dem Atmega128 zwar nicht so gut aus... aber was ist ADCW?
ein 16 Bit Pseudoregister.
> Wie viel Bit hat den der ADC?
10, so wie alle AVR in dieser Kategorie
> Müsste es nicht die Register ADCH und ADCL> geben in denen das ADC Ergebnis steht?
Gibt es. Brauchst du aber nicht. Genau dazu gibt es nämlich das
Psuedoregister ADCW, damit man sich nicht mit so Kleinkram wie dem
auselesen von 2 Registern und dem Zusammenstoppeln des Ergebnisses
rumschlagen muss. Das kann der Compiler nämlich auch für einen machen.
Ich verwende alle Funktionen aus dem Forum auch das main, doch wenn ich
im main das initialisieren aufrufe, wird der Code danach nicht mehr
ausgeführt.
Es funktioniert :-) ich habe die M103 Fuse gelöscht, doch ich bekomme
auf ADC auf masse 0 als wert. Wenn der ADC auf irgendeinem anderen
potential ist bekomme ich 1023. warumm?
Hngt davon ab, was du messen willst.
AVcc (also deine Versorungsspannung von 5V) ist schon mal ein guter
Wert. Kannst ja am ARef Pin mal die Spannung nachmessen (wie ist der
ARef Pin beschaltet?)
Wie erzeugst du die Spannung am ADC Eingangs-Pin, wie stellst du die
1023 fest?
>Hngt davon ab, was du messen willst
Ich will zwischen 0 und 5V messen, deshalb ist Aref auch 5V. Habe auch
nachgemessen und es stimmt.
>Wie erzeugst du die Spannung am ADC Eingangs-Pin
Ich habe das SDK500 und lege damit die Aref fest.
>wie stellst du die 1023 fest?
Ich überprüfe wo das Messergebnis liegt(zuerst mit <,> und dann mit ==)
und lasse dann eine LED leuchten.
Florian Schuller schrieb:> Ich will zwischen 0 und 5V messen, deshalb ist Aref auch 5V. Habe auch> nachgemessen und es stimmt.>>>Wie erzeugst du die Spannung am ADC Eingangs-Pin> Ich habe das SDK500 und lege damit die Aref fest.
Du hast am ARef Pin hoffentlich keine externe Spannung angeschlossen.
Der Mega erzeugt sich die 5V selber und legt sie auf den Pin. Das ist
ein Ausgang und kein Eingang.
Aber das meinte ich nicht. Wo kommt deine zu messende Spannung her?
Netzteil, Poti, ....
>>>wie stellst du die 1023 fest?>> Ich überprüfe wo das Messergebnis liegt(zuerst mit <,> und dann mit ==)> und lasse dann eine LED leuchten.
zeigen.
Wann immer Code im Spiel ist, gibt es die Möglichkeit für Fehler. Das
können auch ganz dumme Fehler sein. (Und ja, das passiert mir genauso,
dass ich hier Code poste ohne ihn zu testen und ganz dumme Fehler mache.
Und ich habe ein paar Millionen Codezeilen mehr als du programmiert)
>Du hast am ARef Pin hoffentlich keine externe Spannung angeschlossen.
Nein habe ich nicht
>Wo kommt deine zu messende Spannung her?
Über einen Widerstand auf VCC.
>> Ich überprüfe wo das Messergebnis liegt(zuerst mit <,> und dann mit ==)>> und lasse dann eine LED leuchten.>zeigen.
1
#include<avr/io.h>
2
voidADC_Init(void){
3
4
uint16_tresult;
5
6
ADMUX=(0<<REFS1)|(1<<REFS0);// AVcc als Referenz benutzen
Ich habe mir schnell eonen Spannungsteiler mit einem Port gebastelt,
doch welchen wert bekomme ich bei ADC_Read zurück? Ich habe einen
Spannung von 3 V zu messen doch der wert ligt jenseits der 3V. Kann das
sein ,dass bei 5 V der wert 1023 ist und bei 0V 0. Somit sollte er dann
bei 3V bei 613,8 ligen. oder?
Florian Schuller schrieb:> Ich habe mir schnell eonen Spannungsteiler mit einem Port gebastelt,> doch welchen wert bekomme ich bei ADC_Read zurück?
Einen Wert zwischen 0 und 1023 (inklusive)
Der Wert gibt das Verhältnis an von zu messender Spannung in Bezug auf
die Referenzspannung (aber nicht als Zahl von 0 bis 1, sondern als Zahl
von 0 bis 1023)
> Ich habe einen> Spannung von 3 V zu messen doch der wert ligt jenseits der 3V. Kann das> sein ,dass bei 5 V der wert 1023 ist und bei 0V 0. Somit sollte er dann> bei 3V bei 613,8 ligen. oder?
Die Komma vergisst du gleich wieder, aber 613 klingt gut. Allerdings
wird der Wert um ein paar Stellen um die 613 schwanken. Von 611 bis 615
wird da alles dabei sein. Je nachdem, wie gut die Referenzspannung
stabilisiert ist.