Der ADC wandelt den Wert mit 10Bit. Die kann man dann links- oder rechtsbündig als 16Bit-Wert auslesen, es sind aber immer nur 10 davon wirklich wertig.
Druckbare Version
Der ADC wandelt den Wert mit 10Bit. Die kann man dann links- oder rechtsbündig als 16Bit-Wert auslesen, es sind aber immer nur 10 davon wirklich wertig.
Jetzt verstehe ich das auch mit links oder rechtsbündig. endweder steht da dann z.B. 0000001111111111 oder 1111111111000000 wobei die Nullen keinen wert besitzen. Ich lese mir grade im datenblatt alles über den ADC durch. Komme immer besser damit klar.
Danke erstmal für die nette hilfe.
MfG Jan
Genau so ist es. Der Wert von AREF wird durch 1024 geteilt, wenn AREF 5V sind und am Eingang liegen 2,5V an, dann bekommst du als Ergebnis 512 .
AREF sollte daher gleich dem größten zu messenden Wert sein, dann hat man die beste Auflösung. Die Frage ist nur ob man sie tatsächlich immer braucht.
Hubert
[quote="Spongebob85"]
...und REFS0 wieder ausgeschaltet. Das ganze Register ADMUX ist wieder 0. Falls das nicht nur ein Tippfehler war solltest du dich nochmal dringend mit Bitoperationen auseinandersetzen.Code:ADMUX = (1<<REFS0);
ADMUX = ((0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3) | (0<<MUX4)); //damit ist ADC0-Eingang
Verodern mit 0 kann man sich uebrigens sparen.
Most...Zitat:
More Significant Byte
Hallo
Da der Kompiler die Veroderungen eh als berechnete Konstante ablegt ist es egal, wie man es formuliert. Bei (Dummy-)-Nullen im Grundgerüst für verschiedene Einstellungen kann man die jeweiligen Bits setzen ohne zuvor lange im Datenblatt zu stöbern und läuft keine Gefahr, irgendwelche wichtigen Bits zu vergessen. Als Beispiel mein "Grundgerüst" in der Einstellung für maximale Samplerate:Zitat:
Verodern mit 0 kann man sich uebrigens sparen.
GrußCode:// ADC interne Referenz 2,56V, Ergebniss linksbündig, Kanal ADC4 (E_INT1)
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR) | 4;
// setze free running triggern
SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// kein interupt, Wandler einschalten, prescaler /2
ADCSRA = (0<<ADIE) | (1<<ADEN) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
// Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
ADCSRA |= (1<<ADATE) | (1<<ADIF);
// Initialisierung starten
ADCSRA |= (1<<ADSC);
// und noch die wohl eher unnötige Initiallesung
while (!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF);
mic
Radbruch, Du hast den Prescaller auf 2 stehen, oder hab ich da was falsch gelesen?
Bei welchem Systemtakt 8 Mhz ? Das funktioniert ?
Dir ist klar, daß laut Dattenblatt der ADC mit maximal 200 kHz laufen soll ?
Gruß Sebastian
P.S. Atmel schreibt zwar, wenn man eine Genauigkeit kleiner 10 Bit braucht kann man den Takt höher setzen, leider schreiben die nicht, wo die Grenze liegt, aber 4 MHz ist schon nicht schlecht...
Hallo
Ja, prescaler /2 bei 8MHz-ATMega, du hast richtig gelesen. Noch habe ich keine Bestätigung durch Nachbauer:Zitat:
Radbruch, Du hast den Prescaller auf 2 stehen, oder hab ich da was falsch gelesen?
Kamera am RP6
Hier noch mein Thread zur maximalen Samplerate:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=33070
Gruß
mic
Das dachte ich mir schon ;-)
Allerdings wäre ein Hinweis nicht schlecht, daß Du nur 4 Bits brauchst, sonst gibt es bald fragen, wie: "Ich habe den ADC so eingestellt, wie url=... beschrieben, allerding kommt nur Müll raus... hilfe ich bin Anfänger"
Weißt Du was ich meine ?
Ich rechne nur mit den oberen 4 Bits weiter, um Speicher und Rechenpower zu sparen. Es werden aber trotzdem 8 Bit ausgelesen und die sind alle gültig.
Moin!!!
Mein Prog funktioniert jetzt. Hier der Code:
Jetzt stellt sich mir nur noch so die Frage, was das mit dem Autotrigger bedeutet. Das hab ich im Datenblatt nicht so ganz verstanden.Code:#include <avr/io.h>
#include <stdint.h>
#define F_CPU 1000000UL
int main(void)
{
uint16_t result;
DDRC = (1<<PC0);
ADMUX = 0x00; //AREF, resultat rechtsbündig, ADC-Eingang ADC0
ADCSRA = ((1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)); //ADC eingeschaltet, Teilungsfaktor 8
while(1)
{
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC))
{
;
}
result = ADCL;
result += (ADCH<<8);
if (result >= 512) //LED geht ziemlich genau bei 2,5V an!!!
{
PORTC |= (1<<PC0);
}
else
PORTC &= ~(1<<PC0);
}
}
Ich hab ja den 5.Bit in ADCSRA nicht gesetzt und auch das SFIOR register ganz außen vor gelassen. Laut der Tabelle im Datenblatt müsste jetzt FreeRunning Mode eingeschaltet sein. Hab ja alles für Single convention vorbereitet.
Warum klappt das dann trotzdem?
Was hat das mit dem Autotrigger auf sich?
MfG Jan