Forum: Mikrocontroller und Digitale Elektronik Potentiometer auslesen


von Fabian F. (fabiii9)


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

: Bearbeitet durch User
von Erny (Gast)


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

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Fabian Müller schrieb:
> Das sind die Fehlermeldungen:
(...)
> Warning  2  unused variable 'sensorPin' [-Wunused-variable]
> C:\Dokumente und
> Einstellungen\user\Desktop\Fader_poti\GccApplication1\GccApplication1\Gc
> cApplication1.c   13  6  GccApplication1

Ausserdem scheinst du hier nicht deinen kompletten Code zu posten.

von Fabian F. (fabiii9)


Lesenswert?

Magnus M. schrieb:
> Ausserdem scheinst du hier nicht deinen kompletten Code zu posten.


Doch das ist der gesammte Code

von Fabian F. (fabiii9)


Lesenswert?

Magnus M. schrieb:
> Ausserdem scheinst du hier nicht deinen kompletten Code zu posten.

Wo ?
Ich finde irgendwie nichts.

Tut mir leid.

vielen Dank für deine Geduld

Gruß
Fabi

von Magnus M. (magnetus) Benutzerseite


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]

von Fabian F. (fabiii9)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja: Du rufst eine Funktion namens read_adc auf, die aber weder 
deklariert ist noch irgendwo definiert ist.

von Erny (Gast)


Lesenswert?

Wenn du mein Post lesen würdest wärst du vllt ein Stück weiter.
Wie gesagt, dir fehlt die Funktion read_adc!

von Fabian F. (fabiii9)


Lesenswert?

Erny schrieb:
> Wenn du mein Post lesen würdest wärst du vllt ein Stück weiter.
> Wie gesagt, dir fehlt die Funktion read_adc!

Ja ich habe es schon gelesen.
Nur wie muss ich diese Funktion deklarien ??
wie lautet Sie??


Vielen Dank

von Erny (Gast)


Lesenswert?

Das hab ich ebenfalls geschrieben:

Siehe avr-gcc Tutorial dort auf ADC (analoge ein und ausgabe oder wie 
das Kapitel heißt) und bäm. Ein Edamer Code ;)

von Erny (Gast)


Lesenswert?

*gesamter (sry ich schreibe mit Handy ;))

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

Hier extra für dich rausgesucht. Das nächste mal bitte erst googeln bzw 
es selber versuchen und dann fragen. Denn: von nichts kommt nichts!

von Coder (Gast)


Lesenswert?

Vielleicht wäre Dir geholfen, wenn Du dir die grundlegenden Dinge 
aneignest. Zusammenkopieren funktioniert nicht.

von Fabian F. (fabiii9)


Angehängte Dateien:

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

von Fabian F. (fabiii9)


Angehängte Dateien:

Lesenswert?

hallo,
oh entschuldigt.

Das ist ja der falsche schaltplan.


sorry!!

Vielen Dank

von STK500-Besitzer (Gast)


Lesenswert?

Schönes RC-Glied.

Der Kondensator ist sehr sinnfrei, da er dir die gewünschte Funktion 
zunichte macht.

von Fabian F. (fabiii9)


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

von Fabian F. (fabiii9)


Lesenswert?

keiner eine Idee ?????

von Dr. Sommer (Gast)


Lesenswert?

Fabian Müller schrieb:
> keiner eine Idee ?????
Mir kommt dazu gerade ein genialer Einfall: Datenblatt des 
Mikrocontrollers lesen.

von Axel S. (a-za-z0-9)


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

von Fabian F. (fabiii9)


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 !!!!!

von Fabian F. (fabiii9)


Lesenswert?

Hallo zusammen,
würde vorschlagen wir schließen hier den Thread.

Ich arbeite mich mal richtig ins Thema ein und wenn dann noch Fragen 
sind, stell ich sie in einm neuen Thread.

Danke für eure Bemühungen

Gruß
Fabi

von Fabian F. (fabiii9)


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

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.