Poti an A/D Wandler (C Code AVR)

Gast #285568
Lesenswert?
• ▲
▼
Hi.
Ich versuche seid 2 Tagen verzweifelt an meinem ATMega8 ein Drehpoti
anzuschließen und dann mit hilfe des A/D Konverters die Stellung des
Potis rauszukriegen.
Meine Schaltung ist folgendermaßen aufgebaut:

GND an 0V
VCC an +5 V
POTI zwischen VCC und AD0
AREF an +5 V

Nur krieg ich von meinem A/D Wandler immer eine 0 zurück (dadurch
leuchtet meine LED unten im Code)
1
#include <avr/io.h>
2
#include <stdint.h>
3

4

5
uint16_t ReadChannel(uint8_t mux)
6
{
7
  uint8_t i;
8
  uint32_t result = 0;
9

10
  ADCSRA = (1<<ADEN) | (1<<ADPS2) |(1<<ADPS1) | (1<<ADPS0);   
11
//Frequenzvorteiler
12

13
  ADMUX = mux;                      // Kanal waehlen
14
  ADMUX |= (0<<REFS1) | (0<<REFS0); // interne Referenzspannung nutzen
15

16
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
17

18
  while ( ADCSRA & (1<<ADIF) );     // auf Abschluss der Konvertierung
19
  ADCSRA = (1<<ADIF);          //ADIF wieder löschen
20

21

22
  for(i=0;i<4;i++)
23
  {
24
    ADCSRA |= (1<<ADSC);
25
    while ( ADCSRA & (1<<ADIF) );
26
    result += ADCW;
27
  ADCSRA = (1<<ADIF);        //ADIF wieder löschhen
28
  }
29

30
  ADCSRA &= ~(1<<ADEN);
31
  result /= 4;
32
  return result;
33
}
34

35

36
int main(void)
37
{
38
  DDRB = 0xFF;
39
  //PORTB = 0xFF;
40
  //PORTB = 0x00;
41

42
  uint16_t analogwert;
43

44

45
  while(1)
46
  {
47
    analogwert = ReadChannel(0);
48

49
    if (analogwert == 0)
50
      PORTB = 0xFF;  
51
    else
52
      PORTB = 0x00;
53

54
  }
55
  
56

57
}
#285570
Lesenswert?
• ▲
▼
> POTI zwischen VCC und AD0

Poti nicht an GND angeschlossen??
Versuch mal:
POTI oben          -> VCC
POTI Mittelabgriff -> AD0
POTI unten         -> GND

> if (analogwert == 0)

Schlecht bei Analogwerten. Die sind meistens nie ganz NULL. Besser:
  #define MINIMUM 10
  if (analogwert < MINIMUM)


> Nur krieg ich von meinem A/D Wandler immer eine 0 zurück (dadurch
> leuchtet meine LED unten im Code)

Wie ist Deine LED an PORTB angschlossen? PORTB+GND oder PORTB+VCC?

Stefan
Gast #285571
Lesenswert?
• ▲
▼
Also das mit dem == 0 hab ich deswegen gemacht weil ich es einfach
komisch finde das ich immer eine 0 zurückbekomme, das bei einem
Analogwert ... mir ist klar das ich normalerweise mit kleiner und
größer das abfangen soll aber warum krieg ich immer 0 raus?

Die LED is schon korrekt von PortB nach GND angeschlossen mit
Wiederstand.

Hab das natürlich am Poti auch so angeschlossen sorry hatte ich
vergessen also poti oben an VCC mitte an AD0 und unten and GND.

Stimmt mein Code wenigstens?

Der Poti hat 10K Ohm wenn das was hilft.


Danke für deine Antwort.
Gast #285573
Lesenswert?
• ▲
▼
Hi danke ich bin gerade am Durchstöbern deines Links nur finde ich da
meinen Fehler immer noch nicht.

Wäre super wenn mir jemand sagen könnte ob meine Schaltung wenigstens
richtig angeschlossen ist oder ob der Code falsch ist.
Das mit der 32bit Variable ist nur deswegen da ich das aus einem Code
raus hab der das nicht mit 4 Werten sonder mit einer größerer Anzahl
macht wobei ich das im Moment erst mal so einfach wie möglich haben
möchte.
Gast #285576
Lesenswert?
• ▲
▼
> Steht wohl a bissal a schmarn im Tutorial !
Aha. Bitte erlaeutern. Welches Tutorial ist gemeint? Der gezeigt Code
weicht von dem im avr-gcc-Tutorial in wiki dieser Seite ab. Den
Unterschied zwischen ADIF und ADSC verstanden?

Martin Thomas
Gast #285577
Lesenswert?
• ▲
▼
Hi Martin.
Also ich habe das teilweise aus dem AVR GCC tutorial.
Eest hab ich das komplett so wie im Tutorial abgeschrieben und dann
ging garnix. Und seid dem ich das eben geändert hab geht das jetzt
endlich gescheit.

Ne der Unterschied zwischen den beiden ADIF und ADSC ist mir noch nicht
ganz klar.
Gast #285578
Lesenswert?
• ▲
▼
Also im GCC Tutorial dieser Site steht nichts dergleichen von ADIF etc.
Direkt aus dem Tutorial kopiert:
1
uint16_t ReadChannel(uint8_t mux)
2
{
3
  uint8_t i;
4
  uint16_t result = 0;         //Initialisieren wichtig, da lokale
5
Variablen
6
                               //nicht automatisch initialisiert werden
7
und
8
                               //zufällige Werte haben. Sonst kann
9
Quatsch rauskommen
10
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler
11

12
                               // setzen auf 8 (1) und ADC aktivieren
13
(1)
14

15
  ADMUX = mux;                      // Kanal waehlen
16
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
17

18

19
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
20
liest
21
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
22
lassen" */
23
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
24
  while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung
25
warten 
26

27
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
28
Wandlungen */
29
  for(i=0;i<4;i++)
30
  {
31
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
32
conversion"
33
    while ( ADCSRA & (1<<ADSC) );   // auf Abschluss der Konvertierung
34
warten
35
    result += ADCW;        // Wandlungsergebnisse aufaddieren
36
  }
37
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
38

39
  result /= 4;                     // Summe durch vier teilen = arithm.
40
Mittelwert
41

42
  return result;
43
}

Also bevor Ihr das nächste Mal auf die Autoren des Tutorials
einschlagt: Richtig RTFM'men :)
Gast #285580
Lesenswert?
• ▲
▼
ich habe auch den PDF-File, bei mir steht

for(i=0;i<4;i++)
{
  ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
  while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung
warten
  result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
Gast #285581
Lesenswert?
• ▲
▼
Ah ich habe mir gerade das neueste PDF angesehen und da ist es wirklich
weg.
Meine PDF Version habe ich mir runtergeladen als ich mit dem
Programmieren von µCs begonnen hab und das war vor einem Monat.

Also kommt mein altes Dokument mal weg.
Aber danke das du nachgeschaut hast.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren