Forum: Mikrocontroller und Digitale Elektronik ADC mit Mega32


von Marcel (Gast)


Lesenswert?

Hey!

Ich versuche verzweifelt den wert eines Potis mit dem ADC auszulesen.
Aber irgendwie bekomme ich es absolut nicht auf die Reihe
Folgendes zum Aufbau:
ATMega32 @ 1Mhz
Vcc/ARef/AVCC --> 5V
beide GND Pins --> Masse
Reset mit R + C beschalten
Poti hängt zwischen Vcc und GND, Schleifer am ADC0 Pin des AVR's

Nun hab ich versucht mit dem Beispielprogramm von Bascom den Wert 
auszulesen. Erfolglos.
Sowohl die Definitionsdatei als auch die Frequenz ist eingtragen.

Hab ich noch irgendwas vergessen?
Ich zweifel echt an mir selbst.
Hab es auch schon mit anderen Avr's gemacht, da hat es geklappt.

Danke schonmal für euere Hilfe

von jaedle (Gast)


Lesenswert?

Bevor das jemand anders schreibt:

- Spannung hast du gemessen am Eingang mit nem Messgerät?
- Code posten wäre ne sinnvolle Sache

von Marcel (Gast)


Lesenswert?

Hey!
Spannung hab ich gemessen, stimmt soweit.
Hier mal der Code aus BascomAVR:
Hoffe er hilft mein Problem zu finden.

'--------------------------------------------------------------------
'                  ADC.BAS
'  demonstration of GETADC() function for 8535 or M163 micro
'  Getadc() will also work for other AVR chips that have an ADC 
converter
'--------------------------------------------------------------------
$regfile = "M32def.dat" 
' we use the 8535

'configure single mode and auto prescaler setting
'The single mode must be used with the GETADC() function

'The prescaler divides the internal clock by 2,4,8,15,32,64 or 128
'Because the ADC needs a clock from 50-200 KHz
'The AUTO feature, will select the highest clockrate possible
Config Portb = Output
Config Adc = Single , Prescaler = Auto
'Now give power to the chip
Start Adc

'With STOP ADC, you can remove the power from the chip
'Stop Adc

Dim W As Word , Channel As Byte


'now read A/D value from channel 0
Do
  W = Getadc(channel)
  Portb = Low(w)
Loop
End

'The new M163 has options for the reference voltage
'For this chip you can use the additional param :
'Config Adc = Single , Prescaler = Auto, Reference = Internal
'The reference param may be :
'OFF      : AREF, internal reference turned off
'AVCC     : AVCC, with external capacitor at AREF pin
'INTERNAL : Internal 2.56 voltage reference with external capacitor ar 
AREF pin

'Using the additional param on chip that do not have the internal 
reference will have no effect.

von Willi (Gast)


Lesenswert?

HAllo,
vileicht hilft es, wenn du die Variable Channel initialisierst bevor
sie in der Anweisung "W = Getadc(channel)" benutzt wird.
Also z.B.

channel = 0
W = Getadc(channel)

Mfg Willi

von Marcel (Gast)


Lesenswert?

Hey!

Klappt leider auch nicht

von Jodel (Gast)


Lesenswert?

ich kenn mich zwar mit Bascom nicht aus, aber wird irgendwo die 
Reference gesetzt?

Kann nirgends ein "Reference = AVCC" entdecken.

von hugo (Gast)


Lesenswert?

Hi,

versuch es doch mal damit die Register zu schreiben, hier ein Beispiel 
für einen Tiny45:

[c]'############ADC 
###############################################################

On Adc Onadc                                                'Interrupt 
für Adc Wert

Admux = &B00100010
'         ^^-----------------Voltage Reference:00=Vcc
'           ^----------------Left Adjust
'            ^---------------Not Used
'             ^^^^-----------Analog Channel:0010=ADC2 PB4

Adcsra = &B11111110
'          ^-----------------Adc Enable
'           ^----------------Adc Start Conversion
'            ^---------------Adc Auto Trigger Enable
'             ^--------------Adc Interrupt Flag
'              ^-------------Adc Interrupt Enable
'               ^^^----------Adc Prescaler Select Bits
'### Hauptschleife   ##################################################
Dim Akku_low As Bit
Dim Analog As Word
Do

Loop
'### Analog Digital Converter 
##################################################
Onadc:                                                      ' Interrupt 
ADC
Analog = Adch                                               'ADC Wert an 
Variable übergeben
If Analog < 15 Then
Akku_low = 1                                                'Akku_low 
Bit bilden
End If
If Analog > 20 Then
Akku_low = 0
End If
Return
___________________________________________________

Klappt wunderbar, mustt du bloß die ADC Register anpassen.

Oder versuch mal in deinem Code folgende stelle zu ändern:

_________________________________
'now read A/D value from channel 0
Do
  W = Getadc(channel)
  Portb = Low(w)
Loop
End

so muss es funktionieren:
_________________________________
'now read A/D value from channel x
Do
  W = Getadc(hier den verwendeten Kanal eintragen!)
  If w > 100 then
  Portb.1=1
  end if
Loop
End
________________________________

nach eine Reset sollte so ein High Level an Portb.1 anliegen wenn die 
ADC Spannung > ca. 1/10Vcc ist.

Grüße
hugo

von Marcel (Gast)


Lesenswert?

Hey!

So hab mir jetzt einen andren Mega32 zukommen lassen.
Und siehe da! Der AD Wandler war defekt.
Hab die Programme mal durchprobiert.
Haben alle funktioniert.

Danke nochmals...

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.