Potentiometer auslesen

OP #3556601
Lesenswert?

Hallo zusammen,
ich suche jetzt schon ewig rum und probier Sachen aus doch es 
funktioniert nicht.

Ich habe eine ganz einfache testschaltung.

Wenn ich an dem Poti drehe und einen Wert <= 1 habe, dann soll die LED1 
angehen,
Wenn der Wert größer ist, soll die LED2 angehen.

Jetzt habe ich hier ein codeschnipsel gefunden, doch ich glaube es geht 
so einfach nicht.
1
/*
2
 * GccApplication1.c
3
 *
4
 * Created: 01.03.2014 19:14:48
5
 *  Author: user
6
 */ 
7

8

9
#include <avr/io.h>
10

11
int main(void)
12
{
13
  float messung;
14
  
15
  DDRD = 0b00111111;
16
    while(1)
17
    {
18
    messung = read_adc(0);
19
    messung = messung *5/1023;
20
    
21
     if( messung<=1 ){
22
        PORTD = 0b00000001;
23
     }
24
     else {
25
        PORTD = 0b00000010;
26
     }        
27
       
28
    }
29
}

Das sind die Fehlermeldungen:
Warning  1  implicit declaration of function 'read_adc' 
[-Wimplicit-function-declaration]  C:\Dokumente und 
Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\Gc 
cApplication1.c   19  3  GccApplication1
Error  3  undefined reference to `read_adc'  C:\Dokumente und 
Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\De 
bug/.././GccApplication1.c   19  1  GccApplication1
Warning  2  unused variable 'sensorPin' [-Wunused-variable] 
C:\Dokumente und 
Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\Gc 
cApplication1.c   13  6  GccApplication1



was amch ich falsch????

Vielen Dank
Wäre echt sehr dankbar wenn mir jemand helfen könnte !!!!
Gruß
Fabi
Gast #3556603
Lesenswert?

Ja,

Anscheinend hast du keine Funktion adc_read deklariert, auf der du in 
der while schleife zugreifst. Lies das avr-gcc Tutorial (oben links auf 
der Seite) da gibts ne Referenz zum ADC

Grüße,
Ernybert
Persönliche Seite #3556615
Lesenswert?

Fabian Müller schrieb:
> Magnus M. schrieb:
>> Ausserdem scheinst du hier nicht deinen kompletten Code zu posten.
>
> Doch das ist der gesammte Code

Ich sehe in deinem Code aber keine Variable namens "sensorPin", welche 
dein Compiler jedoch bemeckert. Der Conpiler hat sich den Namen bestimmt 
nicht ausgedacht.

Magnus M. schrieb:
>> Warning  2  unused variable 'sensorPin' [-Wunused-variable]
OP #3556617
Lesenswert?

Hallo,
oh stimmt, das habe ich dann rausgelöscht weil ich es nicht gebraucht 
habe und nicht nochmal einen Built durchgeführt.

Tut mir leid.

Aber danke für den hinweis.

Warning  1  implicit declaration of function 'read_adc' 
[-Wimplicit-function-declaration]  C:\Dokumente und 
Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\Gc 
cApplication1.c   18  3  GccApplication1
Error  2  undefined reference to `read_adc'  C:\Dokumente und 
Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\De 
bug/.././GccApplication1.c   18  1  GccApplication1


Gruß
Fabi
OP #3557112
Lesenswert?

Hallo Zusammen,
habe jetzt das Tutorial ADC durchgearbeitet.

Ich habe diese Schaltung aufgebaut, nur dass ich statt einem 220 Ohm 
Widerstand einen 330 Ohm Widerstand eingebaut, und statt einem 0,1 µF 
einen Radialkondensator mit 1 µF und 100 V.

Funktioniert das damit auch?


Jetzt habe ich mich mal an den code gewagt.
Der Code lautet momentan:
1
/*
2
 * Fader_2.c
3
 *
4
 * Created: 02.03.2014 11:32:12
5
 *  Author: user
6
 */ 
7

8

9
#include <avr/io.h>
10

11
int main(void)
12
{
13
  DDRD |= (1<<PD2);
14
    while(1)
15
    {
16
        PORTD |= (1<<PD2);
17
    DDRD &= ~(1<<PD2); PORTD &= ~(1<<PD2);
18
    }
19
}

es kommt keine Fehlermeldung, allerdings fehlt da ja noch was.

Die Zeitmessung.

Ich finde nichts richtiges.
Wäre ssehr dankbar, wenn mir jemand einen Tipp geben könnte.
Ich erwarte nicht, dass ihr mir den Code schreibt, aber es wäre nett, 
wenn ihr mir etwas draufhelfen könntet. Habe ja schon etwas angefangen 
und mich bemüht.

Vielen Dank
Gruß
Fabi
Angehängte Dateien:
OP #3557182
Lesenswert?

hallo,
vielen Dank für deine Antwort !!!

Soll ich ihn einfach weglassen.

Funktioniert es dann immer noch.

Ach ja ich habe glaub ich noch gar n icht geschreiben was ich eigentlich 
will.

Ich will wenn ich am poti dreh soll bei dem einem Werte bereich LED 1 an 
sein, wenn ich weiter dreh soll die eine LED ausgehen und eine andere 
LED angehen.

LED1 (PORTD0)
LED2 (PORTD2)

Vielen  Dank
Gruß
Fabi
#3557625
Lesenswert?

Fabian Müller schrieb:
> keiner eine Idee ?????

Jede Menge. Ach, um dir zu helfen? Keine.

Zumindest nicht, bevor du nicht mit den notwendigen Details rüberkommst. 
Weder wissen wir, welchen AVR du verwenden willst (selbst AVR ist schon 
geraten). Noch ob du wirklich den ADC verwendest oder eine Trick- 
Schaltung mit dem Analogkomparator. Selbst vom Quellcode zeigst du nur 
Schnipsel. Und wenn du darauf angesprochen wirst, erzählst du einen vom 
Pferd. Mit dieser Einstellung wirst du keinen finden, der dir hilft.


XL
OP #3557707
Lesenswert?

Axel Schwenke schrieb:
> Fabian Müller schrieb:
>> keiner eine Idee ?????
>
> Jede Menge. Ach, um dir zu helfen? Keine.
>
> Zumindest nicht, bevor du nicht mit den notwendigen Details rüberkommst.
> Weder wissen wir, welchen AVR du verwenden willst (selbst AVR ist schon
> geraten). Noch ob du wirklich den ADC verwendest oder eine Trick-
> Schaltung mit dem Analogkomparator. Selbst vom Quellcode zeigst du nur
> Schnipsel. Und wenn du darauf angesprochen wirst, erzählst du einen vom
> Pferd. Mit dieser Einstellung wirst du keinen finden, der dir hilft.
>
>
> XL

Das ist so eindeutig nicht richtig.


Das ist wirklich der ganze Code !!!!!
OP #3558418
Lesenswert?

Hallo zusammen,
ich habe es jetzt hinbekommen.

Will den Code hier nur schnell hochstellen, damit Leute, die das gleiche 
Problem haben, davon profitieren können.
1
#include <avr/io.h>
2

3

4
void adc_init (void){
5

6
  //interne Referenzspannung
7
  //ADMUX = 0xC0;
8

9
  //AVCC
10
  //ADMUX = 0x40;
11

12
  //AREF
13
  ADMUX = 0xC0;
14

15

16
  ADCSRA = 0x80; //ADC aktivieren, Rest 0 setzen
17

18
  //ADCSRA |= 0x01; //Vorteiler 2
19
  //ADCSRA |= 0x02; //Vorteiler 4
20
  //ADCSRA |= 0x03; //Vorteiler 8
21
  //ADCSRA |= 0x04; //Vorteiler 16
22
  ADCSRA |= 0x05; //Vorteiler 32
23
  //ADCSRA |= 0x06; //Vorteiler 64
24
  //ADCSRA |= 0x07; //Vorteiler 128
25

26
  ADCSRA |= (1<<6); //Konvertierung starten
27

28
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
29

30
uint16_t ergebnis = 0;
31

32
ergebnis = ADCL;
33
ergebnis += (ADCH<<8);
34

35
}
36

37

38

39
uint16_t adc_read (uint8_t kanal){
40

41
static uint8_t init = 0;
42

43
if(init==0){adc_init(); init++;} //beim ersten Aufruf zunaechst initialisieren
44

45
ADMUX &= (0xE0); //Vorhandenen Wert fuer den Kanal loeschen
46

47
//den Wert fuer den Kanal schreiben, dabei die vorderen 3 Bits vor evtl. fehlern schuetzen
48

49
ADMUX |= (kanal&(0x1F));
50

51
ADCSRA |= (1<<6); //Konvertierung starten
52

53

54

55
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
56

57
uint16_t ergebnis = 0;
58

59
ergebnis = ADCL;
60
ergebnis += (ADCH<<8);
61

62
return ergebnis; //Ergebnis zurueckgeben
63

64
}
65

66
int main(void)
67
{
68
  float messung;
69
  
70
  DDRD = 0b00111111;
71
  while(1)
72
  {
73
    messung = adc_read(2);
74
    
75
    if( messung<=500 ){
76
      PORTD = 0b00000001;
77
    }
78
    else {
79
      PORTD = 0b00000010;
80
    }
81
    
82
  }
83
}

Gruß
Fabi

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