Forum: Mikrocontroller und Digitale Elektronik ATMega32 ADC Problem --> PORTC immer High


von Jan (Gast)


Lesenswert?

Hallo,

ich bin jetzt seit knapp drei Tagen beschäftigt, den ADC in einem 
ATMega32 zum Laufen zu bekommen. Beziehungsweise, er funktioniert, aber 
eben nicht so, wie er soll.

Das Problem ist, dass ich immer 1016 zurückgeliefert bekomme. Ziel ist 
es die Spannung einer 9V Block-Batterie zu ermitteln. Ich habe PC2 des 
AVRs (Kanal 3 ADC) an einen Spannungsteiler anliegen, der die aktuell 
noch 7V der Blockbatterie auf 2,5V reduziert. Zwischen PC2 und 
Spannungsteiler ist noch eine einfache Siliziumdiode geschaltet.

Daraus folgt rechnerisch, dass an PC2 etwa 1,8V anliegen müssten, 
gemessen sind es dann 1,67V.
Deshalb müsste der ADC einen Wert von 342 zurückliefern, tut er aber 
nicht, stattdessen gibt er ganz stabil 1016 aus.

Ich habe den Wert mit einem Multimeter nachgemessen, das erstaunliche 
Ergebnis: Am PIN liegen bei Betrieb 4,8V an. Genauso, wie an allen 
anderen Pins von PORTC. Ich habe daraufhin mein Programm überprüft, ob 
ich vielleicht irgendwo PortC auf High gesetzt habe, ist aber nicht so. 
Später habe ich in meinem Hauptprogramm in der while-Schleife DDRC auf 
Eingang und PORTC auf Low gesetzt. Trotzdem liegen an den PORTC Pins 
weiterhin 4,8V an.

Dass heißt, dass mein ADC ja funktioniert, aber irrtümlicherweise immer 
4,8V anliegt.
Ich habe auf meiner Platine auch nach Überbrückungen gesucht, die für 
den hohen Pegel verantwortlich sein könnten, aber alles ist ok.

Das JTAG Fuse bit habe auch schon auf 1 gesetzt, also gelöscht. Ändert 
aber nichts.

Woran kann es noch liegen? So langsam gehen mir echt die Ideen aus.

Hier noch einmal mein ADC-Programmcode:
1
void ADC_init()
2
{
3
    uint16_t result;
4
 
5
    ADMUX |=  (1<<REFS0);
6
    ADMUX |= (1 << MUX1);
7
  
8
    ADCSRA = (1<<ADPS1) | (1<<ADPS0);  //64  
9
    ADCSRA |= (1<<ADEN);                  
10
 
11
    ADCSRA |= (1<<ADSC);                  
12
    while (ADCSRA & (1<<ADSC) ) {}        
13
14
    result = ADCW;
15
16
}
17
18
void ADC_start() //Funktion zum Auswerten des ADCs mit Umrechnung in Volt
19
{
20
  ADCSRA |= (1 << ADSC);
21
  while (ADCSRA & (1<<ADSC) ) {}
22
  ADC_Wert = ADCW*0.004883;
23
}

Die Funktion ADC_init wird im Hauptprogramm einmal aufgerufen und dann 
immer wieder die Funktion ADC_start.

Mein ATMega32 läuft auf 8Mhz, deshalb der ADC Prescaler von 64, um 
innerhalb der 50-200kHz zu bleiben.

Ich hoffe euch fällt noch etwas ein. Ist der Controller vielleicht 
kaputt?

Viele Grüße
Jan

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe den Wert mit einem Multimeter nachgemessen, das erstaunliche
>Ergebnis: Am PIN liegen bei Betrieb 4,8V an. Genauso, wie an allen
>anderen Pins von PORTC.

JTAG ausgeschaltet?

MfG Spess

von Jan (Gast)


Lesenswert?

Ja, ist abgeschaltet, also logisch 1.
Ich habe jetzt nochmal nachgemessen und stelle fest, dass PC3-7 Low 
sind.
PC2, also der aktuelle ADC Pin steht jetzt auf 3,4V. Mein ADC gibt 
trotzdem weiter 1016 aus?!

Jan

von Nils (Gast)


Lesenswert?

Sind dien ADC Eingänge auch als Eingänge geschaltet?

von Jan (Gast)


Lesenswert?

Nils schrieb:
> Sind dien ADC Eingänge auch als Eingänge geschaltet?

Ja, hier der entsprechende Programmcode:
1
  DDRC = 0x00;
2
  PORTC = 0;

Deshlab frage ich mich ja, warum dort knapp 4V anliegen.

von spess53 (Gast)


Lesenswert?

Hi

Seit wann sind die PortC-Pins für den ADC zuständig?

MfG Spess

von Hubert G. (hubertg)


Lesenswert?

Auf meinem Mega32 ist auf PortA der ADC.

von Jan (Gast)


Lesenswert?

Hubert G. schrieb:
> Auf meinem Mega32 ist auf PortA der ADC.

Da hast du Recht. Wer es glaubt oder nicht, ich war bis eben noch fest 
überzeugt davon, dass PortC für den ADC zuständig ist. Dann wollte ich 
gerade einen Schaltplan machen und habe mich gewundert, warum dort immer 
bei PORTA ADC dran steht, habe dann im Datenblatt nachgesehen und dort 
steht wirklich PORTA für ADC. Aber warum ich das falsch in Erinnerung 
hatte, weiß ich nicht, ich war mir auf jeden Fall total sicher.

Tut mir leid, euch damit jetzt unnötig genervt zu haben, aber ich war 
wirklich felsenfest davon überzeugt, das PORTC richtig ist.

Trotzdem vielen Dank
Jan

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.