Forum: Mikrocontroller und Digitale Elektronik ADC Port wechsel


von Future Limit (Gast)


Lesenswert?

Hi Leute,

ich habe den ATMEGA8 und wollte mal ein wenig mit dem Ding spielen. Ich
habe mir ein Poti genommen 5V angeschlossen und den mittleren Pin an
meinen µC angschlossen (Port PC0 / ADC0). Da ich diesen Port aber gerne
für andere Zwecke nutzen möchte, würde ich den Poti gerne an die Port
PC5 / ADC5 anschließen. Von der Hardwareseite ein kein Problme, leider
bekomme ich es nicht hin, mein C++ Programm su umzuschreiben, dass ich
den Port PC5 abgreife. Ich kann immer nur den Port PC0 abgreifen. Hier
ist mein Quelle-Code, vielleicht habt Ihr ja ne Idee.

#include <mega8.h>

// Standard Input/Output functions
#include <stdio.h>

#define ADC_VREF_TYPE 0x00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void main(void)
{
...

/ ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
SFIOR&=0xEF;
....
while(1)
{
...
...
}

}

Gruß
Olli

von Benedikt (Gast)


Lesenswert?

Schau doch mal ins Datenblatt.
Da ist eine Tabelle welchen Wert du in ADMUX schreiben musst, um ADC5
zu verwenden.

von Future Limit (Gast)


Lesenswert?

Danke für die fixe Antwort. Leider werder ich nicht ganz schlau aus dem
Datenblatt. Habe schon mehrere Versuche gestartet den ADMUX Wert
zuändern aber leider ohne Erfolg.

Gruß
Olli

von Hubert.G (Gast)


Lesenswert?

Du stellst mit ADMUX doch immer ADC 0 ein. Sollte es nicht 0x05 sein?

von Future Limit (Gast)


Lesenswert?

egal, was ich bei ADMUX einstelle (z.B. 0x05) greift er immer nur den
Port PC0 ab.

von Benedikt (Gast)


Lesenswert?

>egal, was ich bei ADMUX einstelle (z.B. 0x05) greift er immer nur den
Port PC0 ab.

Entweder du stellst ADMUX nicht richtig ein (oder überschreibst es
später wieder), oder dein uC ist Schrott.
Wenn in ADMUX 5 steht, dann liest der uC auch ADC5 ein !

Poste mal das was der Compiler aus dem C Code macht.
Der Assemblercode sollte ja nicht groß sein

von Hubert.G (Gast)


Lesenswert?

Ich verwende ausserdem immer den Interrupt dazu. Im Interrupt das
Ergebnis sichern, ein Statusbit setzen, eventuell ADC neu starten und
die Interruptroutine wieder verlassen. Ergibt die wenigsten Kollisionen
wenn man noch anderes macht, was ja meistens der Fall ist.

Hubert

von A.K. (Gast)


Lesenswert?

AREF ist eine korrekte externe Referenz?

> SFIOR&=0xEF;

Hat mit der Sache nichts zu tun, ist aber trotzdem falsch. Setzt ein
Bit zurück, dass beim Mega8 garnicht definiert ist (nur 0..3, hier 4).

von Future Limit (Gast)


Lesenswert?

Danke Jungs,

war mein Fehler habe nur immer nur den ADMUX-Wert unten in der main
Funktion geänert und nicht auch in der Deklaration. Jetzt funkioniert
es, wie es soll.

Danke

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.