Forum: Mikrocontroller und Digitale Elektronik ATMega328p - ADC Eingänge an PortC nutzen


von Minime (Gast)


Lesenswert?

Hallo Elektroniker,

ich habe mal eine kleine Steuerung mit einem Atmega328p gebaut und 
möchte diese nun um eine zusätzliche ADC Messung erweitern.

Da die beiden "nativen" ADC Eingänge (Kanal 6+7) bereits belegt sind, 
muss ich nun auf die ADC Eingänge des PortC zurückgreifen. Hier ist der 
ADC Kanal ja als "Alternativ-Funktion" im Datenblatt angegeben.

Nun frage ich mich, ob und wie ich den Port konfigurieren muss.

Einfach nur den entsprechenden Pin als Eingang konfigurieren und fertig?

Für die Messung verwende ich den Code hier aus dem Tutorial:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
1
/* ADC Einzelmessung */
2
uint16_t ADC_Read( uint8_t channel )
3
{
4
  // Kanal waehlen, ohne andere Bits zu beeinflußen
5
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
6
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
7
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung warten
8
  }
9
  return ADCW;                    // ADC auslesen und zurückgeben
10
}

Muss darüber hinaus denn nichts eingestellt werden, um die 
Alternativ-Funktion (ADC) des Pins and Port C zu aktivieren?

Im Datenblatt finde ich dazu nichts. Nur den Hinweis, dass man in diesem 
Fall an Port C kein I/O machen soll, während eine Conversion läuft.

Tatsächlich funktioniert es auch so, aber ist das auch korrekt?

LG, Minime

von Einer K. (Gast)


Lesenswert?

Minime schrieb:
> aber ist das auch korrekt?
Ja!

Dein Programm habe ich nicht getestet.
Aber deine Annahmen sind korrekt.

von MaWin O. (mawin_original)


Lesenswert?

Minime schrieb:
> Muss darüber hinaus denn nichts eingestellt werden, um die
> Alternativ-Funktion (ADC) des Pins and Port C zu aktivieren?

Nicht unbedingt notwendig.
Man kann aber den Digitalpin mit dem DIDR-Register deaktivieren, um 
weniger Rauschen zu haben.

von Joachim B. (jar)


Lesenswert?

Minime schrieb:
> Einfach nur den entsprechenden Pin als Eingang konfigurieren und fertig?

ja

per define Arduino sprech mit :
  #define                                         RTC_GND  A2
  // A3 (ADC3)      PC3
  #define                                         RTC_VCC  A3

und
  #ifdef RTC_GND
    pinMode(RTC_GND, OUTPUT); // pin number on Arduino Uno Board
    digitalWrite(RTC_GND, LOW);   // sets the NokiaGND on
  #endif // #ifdef RTC_GND
  #ifdef RTC_VCC
    pinMode(RTC_VCC, OUTPUT); // pin number on Arduino Uno Board
    digitalWrite(RTC_VCC, HIGH);   // sets the NokiaVCC on
  #endif // #ifdef RTC_VCC

oder AVR sprech

  #define HELLUP      0     // A0 -> PC0
  #define HELLDOWN    1     // A1 -> PC1
  #define PINx        PINC  //
  #define DDRx        DDRC
  #define PORTx       PORTC

  DDRx&=~(1<<HELLUP | 1<<HELLDOWN);
  PORTx|=(1<<HELLUP | 1<<HELLDOWN);

nach Belieben

von Minime (Gast)


Lesenswert?

Hallo ihr,

vielen Dank für die Hinweise und die Bestätigung.

Dem Tip bzgl. des DIDR Registers bin ich nochmal nachgegangen.

Im Datenblatt heisst es:
1
For analog input pins, the digital input buffer should be disabled at all times. An analog signal level close to VCC/2 on an input pin can cause significant current even in active mode. Digital input buffers can be disabled by writing to the digital input disable registers (DIDR1 and DIDR0).

und weiter
1
When this bit is written logic one, the digital input buffer on the corresponding ADC pin is disabled. The corresponding PIN register bit will always read as zero when this bit is set. When an analog signal is applied to the ADC5..0 pin and the digitalinput from this pin is not needed, this bit should be written logic one to reduce power consumption in the digital input buffer.

Das klingt so, als wäre es durchaus ratsam, das entsprechende Bit im 
DIDR Register zu setzen, was ich nun auch gemacht habe.
Mit den mir zur Verfügung stehenden Mitteln konnte ich zwar nicht 
feststellen, dass nun weniger Strom verbraucht wird, aber zu 
deaktivieren was man nicht braucht, klingt generell nach einer guten 
Sache ;)

Vielen Dank euch.

von Einer K. (Gast)


Lesenswert?

Vom SleepMode oder Batteriebetrieb war bisher keine Rede.
Und ja, dann ist das eine gute Idee.

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.