Forum: Compiler & IDEs ADC Funktioniert nicht


von same (Gast)


Lesenswert?

hallo zusammen,
ich habe ein ADC Programm auf eurer webseite gefunden, ich möchte es 
erweiteren, dass die LED bei jeder Umwandlung leuchtet.
ich habe meine poti gedreht auf eine neuen spannungswert  aber leider 
sehe ich auf dem simulator nichts d.h wurde kein bit eingesetzt nach dem 
umwandlung  und mein LED leutet nicht.
das ist Program was ich gefunden habe:
meine controller tiny 24
1
#include <avr/io.h>
2
#include <stdlib.h>
3
4
uint16_t ReadChannel(uint8_t mux)
5
6
{
7
  uint8_t i;
8
  uint16_t result = 0;         //Initialisieren wichtig, da lokale Variablen
9
                               //nicht automatisch initialisiert werden und
10
                               //zufällige Werte haben. Sonst kann Quatsch rauskommen
11
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);    // Frequenzvorteiler
12
13
                               // setzen auf 8 (1) und ADC aktivieren (1)
14
15
  ADMUX = mux;                      // Kanal waehlen
16
  ADMUX |= (1<<REFS1); // 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 warten 
25
26
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
27
Wandlungen */
28
  for(i=0;i<4;i++)
29
  {
30
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
31
    while ( ADCSRA & (1<<ADSC) );   // auf Abschluss der Konvertierung warten
32
    result += ADCW;        // Wandlungsergebnisse aufaddieren
33
  }
34
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
35
36
  result /= 4;                     // Summe durch vier teilen = arithm.Mittelwert
37
38
  return result;
39
}
40
int main(void)
41
{
42
  DDRB &=~ (1<<PB1);
43
  //PORTB = 0xFF;
44
  //PORTB = 0x00;
45
46
  uint16_t analogwert;
47
48
49
  while(1)
50
  {
51
    analogwert = ReadChannel(1);
52
53
    if (analogwert == 0)                ( warum ist hier ==0??)
54
      PORTB = (1<<PB1);  LED
55
    else
56
      PORTB &= ~(1<<PB1);
57
58
  }
59
  
60
61
}
kann jemand mir helfen oder ein tipps geben. danke

von Karl H. (kbuchegg)


Lesenswert?

same schrieb:
> hallo zusammen,
> ich habe ein ADC Programm auf eurer webseite gefunden, ich möchte es
> erweiteren, dass die LED bei jeder Umwandlung leuchtet.
> ich habe meine poti gedreht auf eine neuen spannungswert  aber leider
> sehe ich auf dem simulator nichts

Simulator?

Was genau hast du da für einen Simulator? Kann der überhaupt mit 
Spannungen umgehen? Bzw iw ist dein simuliertes Poti verkabelt?

> d.h wurde kein bit eingesetzt nach dem
> umwandlung  und mein LED leutet nicht.
> das ist Program was ich gefunden habe:
> meine controller tiny 24

Gut.
Du musst den Teil hier kontrollieren ...

>   ADMUX = mux;                      // Kanal waehlen
>   ADMUX |= (1<<REFS1); // interne Referenzspannung nutzen

das setzen der Referenzspannung.
Die ist bei jedem Controller ein wenig anders.

Welche Referenzspannung willst du denn nehmen? Und die musst du dann 
einstellen.

>     analogwert = ReadChannel(1);


Und an welchen ADC-Kanal hast du dein Poti angeschlossen. Hier wird der 
ADC Kanal 1 abgefragt. Hast du dein Poti an diesem Eingang?

>    if (analogwert == 0)                ( warum ist hier ==0??)

Na ja. Was will uns der Autor sagen?
Wenn der gemessene Wert am ADC gleich 0 ist (die Eingangsspannung also 
auch 0 ist), dann soll etwas passieren. Steht doch alles genau so da, 
einfach lesen.

von berliner (Gast)


Lesenswert?

>PORTB = (1<<PB1);  LED

richtig wäre:
PORTB |= (1<<PB1);
und soweit ich verstanden habe, wird diese Zeile nur ausgeführt, wenn 
Analogspannung = 0V ist, aus: if (analogwert == 0)

von berliner (Gast)


Lesenswert?

> while(1)
>  {
>    analogwert = ReadChannel(1);
>    if (analogwert == 0)                ( warum ist hier ==0??)
>      PORTB = (1<<PB1);  LED
>    else
>      PORTB &= ~(1<<PB1);
>  }


dein Programm fragt hier nur ab ob ein bestimmter ASpannungspegel 
anliegt, was nie 100%ig der fall ist. Besser wäre es einen 
Spannungsbereich abzufragen:

if ((analogwert > untere_Schwelle)&&(analogwert < obere_Schwelle))

wenn du überhaupt eine Spannung detektieren möchtest

von same (Gast)


Lesenswert?

danke jungs erst mal,
ich probiere spannung von 0,5v bis 5V einstellebar durch einen Poti.
@Karl Heinz Buchegger
>Was genau hast du da für einen Simulator? Kann der überhaupt mit
>Spannungen umgehen? Bzw iw ist dein simuliertes Poti verkabelt?
meine Platine ist  mit einem debugger verbunden.
ich habe es schon mal mit einem taster probiert und beim AVRStudio habe 
ich gesehen, wie der bit am Port gelöcht/ gesetzt is, wenn ich den 
taster gedrückt habe und bei ADC ich weiss es nicht wie ich es 
kontrolieren kann wenn die wandlungen fertig sind
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.