Forum: Mikrocontroller und Digitale Elektronik Nur 8Bit ADC im Mega8?


von Sebastian Knödler (Gast)


Lesenswert?

Hallo alle zusammen!
Ich steh hier wie der Ochs vor'm Berg und komm nicht weiter. Ich hab
ein ATMega8 Experimentierboard (von Roland Walter, wem's was sagt) und
daran angeschlossen ein Spannungsteiler, der wiederum am ADC-Kanal 0
(sprich Port C Pin 0) hängt (4,7 zu 8,1kOhm -> kommen laut Multimeter
ca. 1,8V raus).

Nun hab ich in Bascom versucht das ganze zu Programmieren. Ich kann
auch den ADC abfragen, jedoch nur mit 8 Bit! Ich dachte zu erst es
liegt an diesem "ADC Left Adjust Result"-Bit im ADMUX Register (dann
kommen nur 8 Bit am ADCH raus). Also erstmal auf 0 gesetzt...bring aber
nix! Dann erstmal gemerkt das ich auf das ADCSRA Register zugreifen
will, Bascom kennt das aber anscheinend unter dem Namen ADCSR.
Geändert, aber wieder nur 8 Bit!

Ich setzte meine Register wie folgt:
Ddrc = &B00000000

Admux = &B11000000

Adcsr = &B10001111

On Adc Onadc


Sreg.7 = 1


Meines erachtens heißt das folgendes:
PortC auf Eingang
Admux: 2,56V interne Referenz, KEIN Left Adjust, Bit 4 gibt's nicht
(also 0), AD-Input 0 gewählt
Adcsr: AD an, aber nicht starten, Free Run aus, Interrupt Flag auf 0,
Interrupt an, Prescaler auf 128 (ergibt mit 3,6864MHz ca. 28,8kHz) was
aber nix bringt! Egal welcher Prescaler, immer das selbe Ergebnis!

Später lese ich dann erst ADCL dann ADCH. Das ganze mit Makeint(ADCL,
ADCH) zusammenführen.

Ich weiß grad echt nimmer weiter! Bitte Bitte helft mir heul

MfG
Basti

von Malte (Gast)


Lesenswert?

Nach meinen Erinnerungen kann dir Bascom das ganze Setzen und Auslesen
der Register abnehmen. Der ATMEGA8 hat definitiv einen 10Bit Wandler!

PS: Ich hab auch nich eine veraltete Version des ATEMEGA8 Datenblatts
in dem einem glaubhauft gemacht werden sollte dass zwei der 6 A/D
Eingänge nur 8Bit Auflösung hätten.

von Sebastian Knödler (Gast)


Lesenswert?

Ja das mit den zwei 8 Bit Kanälen stimmt, ist nur so weil da auch die
Hardware I²C-Ports mit drauf sind!
Ich weiß das Bascom das auch machen kann, allerdings braucht mir das
zuviel speicher (und man lernt nix, ausser "Config ADC=XYZ")!

von HansHans (Gast)


Lesenswert?

Hallo,
Pobiere doch erst mal ob die  „lernt nix“ Methode
mit (Config ADC=XYZ") funktioniert und du so die 10 Bit erhältst .
Wenn das geht, dann Versuchs über die Register, aber dann auch komplett
und nicht halbe /  halbe (On Adc)

oder sonnt bitte etwas mehr Programmausschnitt.
Wie ist die Variable dimensioniert die dein
Makeint(ADCL, ADCH) aufnimmt ?

„Mein mega8 hat auch mit bascom 10 Bit“

Gruß HH

von HansHans (Gast)


Lesenswert?

Noch was wenn du wissen willst, welche Registernamen Bascom
„hören will“ dann schau in der „m8def.dat“ nach

von Sebastian Knödler (Gast)


Lesenswert?

Also ich hab jetzt auch mal mit der "Nix-lern-Methode" probiert, und
siehe da: Er liefert mir 10Bit!
Allerdings läuft das ganze ein wenig merkwürdig: Egal welchen ADC-Kanal
und welche Referenz ich wähle...es kommt immer ein Wert zwischen 350 und
500 raus!
Am Kanal 0 liegen ~1,8V, raus kommen tut aber (umgerechnet) 1,25V! Am
Kanal 1 liegen ca. 3,9V, kommt aber auch so um die 1,5V raus.
Bei den restlichen (nicht angeschlossenen) kommt der Wert 372 raus.

Ich glaub fast das liegt am Mega selbst! Der is bestimmt schon 400-500
Programmiert worden (aber er sollte ja mindestens 1.000 oder 10.000?
Programmierungen aushalten)!

Mein Quelltext mit der Bascom Methode habt ihr hier:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

Dim E As Word

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Do

Start Adc

E = Getadc(1)

Stop Adc
Print E

Wait 2

Loop

End



Ist recht einfach aufgebaut, aber mehr braucht's grad auch nicht.
Soll ich auch den gesamten Text der anderen Quelldatei (Register von
Hand setzen) posten?

MfG
Basti

von HansHans (Gast)


Lesenswert?

Hallo,
das es am mega8 hängt kann ich mir nicht denken ,
auch nicht wenn er noch sooft programmiert wurde  .

Ist dein Avr richtig beschaltet an AVCC ,AREF ?,
wo kommt die Spannung am Messeingang her, ist das
saubere DC ?

Dann solltest du erst mal
Config Adc = Single , Prescaler = Auto , Reference = INTERNAL

verwenden und auch mehrere Werte einlesen und
nicht den ADC gleich wieder Stoppen

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.