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
Schau doch mal ins Datenblatt. Da ist eine Tabelle welchen Wert du in ADMUX schreiben musst, um ADC5 zu verwenden.
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
egal, was ich bei ADMUX einstelle (z.B. 0x05) greift er immer nur den Port PC0 ab.
>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
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.