hallo leute, ich möchte den potentiometerwert mittels adc wandler einlesen und an den leuchtdioden anzeigen, jedoch hab ich da eine frage muss ich einen spannungsteiler machen wenn ich den wert auslesen will oder reicht es wenn ich den poti direkt am ADC anschließe? danke lg thomas
Hast du mal einen Schaltplan? Falls die Eingangsspannung des ADC nicht überschritten wird kannst du direkt drauf gehen.
thomas schrieb: > ich möchte den potentiometerwert mittels adc wandler einlesen und an den > leuchtdioden anzeigen, jedoch hab ich da eine frage muss ich einen > spannungsteiler machen wenn ich den wert auslesen will oder reicht es > wenn ich den poti direkt am ADC anschließe? Beides: Du schliesst das Poti direkt an den ADC an. Aber du verschaltest es so, dass es einen Spannungsteiler bildet. Man kann sich ja ein Poti so vorstellen, dass die Poti-interne Widerstandsbahn durch den Abgreifer in 2 getrennte Widerstände unterteilt wird, deren Wert sich ändert, wenn man den Abgreifer verschiebt. Und genau das ist ja ein Spannungsteiler: 2 Widerstände, wobei die gteilte Spannung am Verbindungspunkt der Widerstände abgegriffen wird.
also verbinde ich eines der anschlüsse mit dem ground und die anderen 2 anschlüsse mit den eingängen des ad wandlers?
thomas schrieb: > also verbinde ich eines der anschlüsse mit dem ground und die anderen 2 > anschlüsse mit den eingängen des ad wandlers? Das wäre dann kein Spannungsteiler Ein Endpunkt kommt an GND. Der andere Endpunkt an Vcc. Am 3. Potianschluss hast du dann eine Spannung, die du durch verdrehen des Potis von 0 bis Vcc verstellen kannst.
thomas schrieb: > ka wir haben die schaltung von der Schule bekommen und gelötet Das ist ja das eigentlich traurige. (abgesehen davon, dass eine Frage nach Beschaltung ganz sicher nichts im GCC Forum verloren hat) Die Bezeichnung des Widerstands und der Spule mag eventuell damit zusmmenhängen, dass der Zeichner ein gewisser "Manfred Schnöll" ist.
Besser wäre von AREF aus mit 100nF an GND gehen und dann die interne Referenzspannung verwenden. Da kannst Du dann beim ATMega8 AVcc oder 2,56V wählen (siehe Datenblatt S. 201). Wenn Du hier AVcc wählst, brauchst Du keinen Spannungsteiler mehr und kannst den Poti wie oben von K. H. Buchegger beschrieben anschließen.
Karl heinz Buchegger schrieb: > Die Bezeichnung des Widerstands und der Spule mag eventuell damit > zusmmenhängen, dass der Zeichner ein gewisser "Manfred Schnöll" ist. Also wenn, dann bitte schon "Werner Schnöll". Ist das etwa der hier? :-) http://homepage.univie.ac.at/werner.schnoell/
also ich hab den potentiometer wie im Anhang angeschlossen, ist das soweit ok? d.h. jetzt kann ich mit dem programmieren beginnen oder?
thomas schrieb: > also ich hab den potentiometer wie im Anhang angeschlossen, ist das > soweit ok? Häng ein Voltmeter an PC0 und sieh nach ob du durch verdrehen des Potis dort die Spannung ändern kannst. Manchmal ist man mit Selbsthilfe einfach besser bedient als wie wenn man für alles und jeden eine Tante braucht, die mit einem aufs Klo Lulu machen geht. Wer eine Schaltung zusammenlötet, sollte eigentlich kein Problem damit haben, mit einem Voltmeter Spannungen nachzumessen. > d.h. jetzt kann ich mit dem programmieren beginnen oder? Ja.
Ich hab jetzt ein Problem mit dem Programm :S Ich hab mein Eingangssignal an PC0 angeschlossen. Jedoch verändern sich bei den LED´s nichts. Hier ist der Programmcode:
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | int main (void) |
4 | {
|
5 | /* ADC initialisieren */
|
6 | void ADC_Init(void) { |
7 | |
8 | uint16_t result; |
9 | |
10 | ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen |
11 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler |
12 | ADCSRA |= (1<<ADEN); // ADC aktivieren |
13 | |
14 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
15 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
16 | |
17 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
18 | while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
19 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
20 | Wandlung nicht übernommen. */
|
21 | result = ADCW; |
22 | }
|
23 | |
24 | /* ADC Einzelmessung */
|
25 | uint16_t ADC_Read( uint8_t channel ) |
26 | {
|
27 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
28 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
29 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" |
30 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
31 | ;
|
32 | return ADCW; // ADC auslesen und zurückgeben |
33 | }
|
34 | |
35 | if(ADCW = 0,7) // erste LED leuchtet |
36 | {
|
37 | DDRC = 1; |
38 | PORTC=PORTC &254; |
39 | }
|
40 | |
41 | if(ADCW = 1,4) // zeite LED leuchtet |
42 | {
|
43 | DDRC = 2; |
44 | PORTC=PORTC &252; |
45 | }
|
46 | |
47 | if(ADCW = 2,1) // dritte LED leuchtet |
48 | {
|
49 | DDRC = 8; |
50 | PORTC=PORTC &246; |
51 | }
|
52 | |
53 | if(ADCW = 2,8) // vierte LED leuchtet |
54 | {
|
55 | DDRC = 16; |
56 | PORTC=PORTC &238; |
57 | }
|
58 | |
59 | if(ADCW = 3,5) // fünfte LED leuchtet |
60 | {
|
61 | DDRC = 32; |
62 | PORTC=PORTC &222; |
63 | }
|
64 | |
65 | }
|
Hallo Und das ist so ohne Fehler/Warnung compiliert worden? Die Definitionen von ADC_init und ADC_read haben absolut garnichts innerhalb der main zu suchen. Gruß Joachim
Und was sind das für Zuweisungen?? if(ADCW = 0,7) Was soll da passieren?? Gruß Joachim
er bekommt ja vom ad wandler die spannungswerte wenn der wert 0,7 is soll er die erste led zum leuchten bringen
Die Funktionen ADC_Read und ADC_Init sind auch innerhalb von main deklariert. Dafür werden sie nicht aufgerufen. Und eine Hauptschleife habe ich auch nicht gefunden. Hast Du schon mal was in C programmiert?
thomas schrieb: > er bekommt ja vom ad wandler die spannungswerte wenn der wert 0,7 is > soll er die erste led zum leuchten bringen Wie soll bitte ein 16Bit Integer den Wert 0,7 kriegen? Was weisst Du von Ganzzahl und Fliesskomaadatentypen?
thomas schrieb: > Ich hab jetzt ein Problem mit dem Programm :S > [/c] Naja, für jemanden, der einfach mal lötet und einfach mal programmiert ist das gar nicht so schlecht. Im Wesentlichen ist ja alles da... ;-) Jetzt noch die einzelnen Elemente richtig sortieren, dann wird das schon.
das ist das zeite oder dritte Programm das ich schreib wir haben erst damit begonnen :D deshald die vielen fehler
Floh schrieb: > [X] du brauchst ein C-Buch. [X] Du musst das Buch lesen [X] Du musst die Grundlagen auch verstehen [X] Du musst wissen wie ein µC und seine Peripherie prinzipiell funktioniert Entweder [ ] Du hast einen total besch. Lehrer. oder [ ] Du bist zu faul um im Unterricht aufzupassen
U.R. Schmitt schrieb: > Floh schrieb: >> [X] du brauchst ein C-Buch. > > [X] Du musst das Buch lesen > [X] Du musst die Grundlagen auch verstehen > [X] Du musst wissen wie ein µC und seine Peripherie prinzipiell > funktioniert > > Entweder > [ ] Du hast einen total besch. Lehrer. > oder > [ ] Du bist zu faul um im Unterricht aufzupassen Nana, Schüler und Anfänger. Ich finde seinen Ansatz sehr kreativ und gar nicht mal so verkehrt!
Ich würds mal irgendwie so probieren:
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | |
4 | /* ADC initialisieren */
|
5 | void ADC_Init(void) { |
6 | |
7 | uint16_t result; |
8 | |
9 | ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen |
10 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler |
11 | ADCSRA |= (1<<ADEN); // ADC aktivieren |
12 | |
13 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
14 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
15 | |
16 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
17 | while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
18 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
19 | Wandlung nicht übernommen. */
|
20 | result = ADCW; |
21 | }
|
22 | |
23 | /* ADC Einzelmessung */
|
24 | uint16_t ADC_Read( uint8_t channel ) |
25 | {
|
26 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
27 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); |
28 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" |
29 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten |
30 | ;
|
31 | return ADCW; // ADC auslesen und zurückgeben |
32 | }
|
33 | |
34 | |
35 | int main (void) |
36 | {
|
37 | |
38 | ADC_Init(); |
39 | |
40 | while(1){ |
41 | if(ADC_Read(0) <= 30) // erste LED leuchtet |
42 | {
|
43 | DDRC = 1; |
44 | PORTC=PORTC &254; |
45 | }
|
46 | |
47 | else if(ADC_Read(0) <= 60) // zeite LED leuchtet |
48 | {
|
49 | DDRC = 2; |
50 | PORTC=PORTC &252; |
51 | }
|
52 | |
53 | else if(ADC_Read(0) <= 90) // dritte LED leuchtet |
54 | {
|
55 | DDRC = 8; |
56 | PORTC=PORTC &246; |
57 | }
|
58 | |
59 | else if(ADC_Read(0) <= 120) // vierte LED leuchtet |
60 | {
|
61 | DDRC = 16; |
62 | PORTC=PORTC &238; |
63 | }
|
64 | |
65 | else if(ADC_Read(0) <= 150) // fünfte LED leuchtet |
66 | {
|
67 | DDRC = 32; |
68 | PORTC=PORTC &222; |
69 | }
|
70 | }
|
71 | }
|
../ad_wandler_1.c:70: error: expected declaration or statement at end of input make: *** [ad_wandler_1.o] Error 1 Build failed with 1 errors and 0 warnings... da komt die fehlermeldung heraus
thomas schrieb: > ../ad_wandler_1.c:70: error: expected declaration or statement at end of > input > make: *** [ad_wandler_1.o] Error 1 > Build failed with 1 errors and 0 warnings... > > > da komt die fehlermeldung heraus Na denken musst du schon auch ein bißchen. Vielleicht fehlt das Semikolon bei der While-Schleife?
thomas schrieb: > ../ad_wandler_1.c:70: error: expected declaration or statement at end of > input > make: *** [ad_wandler_1.o] Error 1 > Build failed with 1 errors and 0 warnings... > > > da komt die fehlermeldung heraus UNd? Was steht an Zeile 70 oder in der Zeile davor?
Daniel V. schrieb: > thomas schrieb: >> ../ad_wandler_1.c:70: error: expected declaration or statement at end of >> input >> make: *** [ad_wandler_1.o] Error 1 >> Build failed with 1 errors and 0 warnings... >> >> >> da komt die fehlermeldung heraus > > Na denken musst du schon auch ein bißchen. Vielleicht fehlt das > Semikolon bei der While-Schleife? Seit wann braucht es da ein Semikolon. Allerdings: * Code einrücken wäre angebracht. * Die DDR macht man am Programmanfang und lässt sie dann nach Möglichkeit in Ruhe. * Das hier PORTC=PORTC &222; ist wohl so ziemlich die schlimmste Schreibweise die man finden kann. Da sieht man so gar nicht was da eigentlich passiert. Da ist ja die Schreibweise als Binärkonstante noch besser.
thomas schrieb: > das einzige was wir vom lehrer lernen is schauts im tutorial nach :D Also das erstere :-( Was für eine Ausbildung/Schule machst Du denn (Klasse Lehrjahr) Dein Problem ist daß Dir so wie es aussiehst überall die Grundlagen fehlen. Du brauchst auf jeden Fall ein C-Buch und das musst du lesen und verstehen. Für hier und jetzt: Unterschied zwischen verschiedenen Datentypen? Unterschied zwischen Zuweisung und Vergleichsoperator? Was ist eine Funktion und wie rufe ich sie auf? Was ist main()? und und und... Wenn Du das Interesse hast, dann klappt das auch mit der Zeit und Du kriegst bei einzelnen Problemen hier Hilfe. Daniel V. schrieb: > Nana, Schüler und Anfänger. Ich finde seinen Ansatz sehr kreativ und gar > nicht mal so verkehrt! Halt typisch irgendwelche Beispiele durchgeflöht und zusammenkopiert ohne auch nur annähernd zu verstehen was los ist. Sorry ich bin noch von der alten Fraktion die sagt lieber erst mal nur 5 Zeilen Code aber die selber geschrieben und verstanden. Auch wenn hinten nur "Hello World" rauskommt.
mit UND und ODER kann man ja bits setzen oder löschen deshalb die schreibweise
thomas schrieb: > mit UND und ODER kann man ja bits setzen oder löschen deshalb die > schreibweise Aber man nimmt da keine Dezimalzahlen! Du gibst ja Zeiten auch nicht Einheiten der Protonzerfallsdauer an, sondern nimmst eine der Problemstellung angepasste Einheit.
1 | int main (void) |
2 | {
|
3 | int ADCValue = 0; |
4 | |
5 | ADC_Init(); |
6 | DDRC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5); |
7 | |
8 | while(1){ |
9 | |
10 | ADCValue = ADC_Read(0); |
11 | |
12 | PORTC = 0; |
13 | if( ADCValue <= 30 ) // erste LED leuchtet |
14 | PORTC = (1<<PC1); |
15 | |
16 | else if( ADCValue <= 60 ) // zeite LED leuchtet |
17 | PORTC = (1<<PC1) | (1<<PC2); |
18 | |
19 | else if( ADCValue <= 90 ) // dritte LED leuchtet |
20 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3); |
21 | |
22 | else if( ADCValue <= 120 ) // vierte LED leuchtet |
23 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4); |
24 | |
25 | else if( ADCValue <= 150 ) // fünfte LED leuchtet |
26 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5); |
27 | }
|
28 | }
|
Sofern die LED leuchten, wenn eine 1 am Portbit ausgegeben wird. Edit: Was bei dir nicht der Fall ist. D.h. du hast dann ein LED Band, bei dem die LED ausgehen, je höher die Spannung wird.
Ausserdem: laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5. Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen könnte. Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2 Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht mehr. Also: Wo hast du dein Poti angeschlossen? Was hast du mit der LED gemacht, die normalerweise auf PC0 gejumpert ist?
Karl heinz Buchegger schrieb: > Ausserdem: > laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5. > Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen > könnte. > > Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2 > > Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht > mehr. Naja, der Kanal 0 kam von mir, hab einfach mal irgendeinen genommen...
Daniel V. schrieb: > Karl heinz Buchegger schrieb: >> Ausserdem: >> laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5. >> Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen >> könnte. >> >> Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2 >> >> Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht >> mehr. > > Naja, der Kanal 0 kam von mir, hab einfach mal irgendeinen genommen... Ist ok. Nur: AN PC0 kann man auch über den Jumper eine LED drann hängen. Was hast du mit der LED gemacht? Ist der Jumper offen? (Denn dann hast du nur 4 LED zur Verfügung und nicht 5)
Karl heinz Buchegger schrieb im Beitrag #1937955: > Ist ok. > Nur: AN PC0 kann man auch über den Jumper eine LED drann hängen. > Was hast du mit der LED gemacht? Ist der Jumper offen? Ich mach garnix mit dem Board. Das war nur ein Beispiel von mir. Der TE hat doch das Problem...
Daniel V. schrieb: > Karl heinz Buchegger schrieb im Beitrag #1937955: > >> Ist ok. >> Nur: AN PC0 kann man auch über den Jumper eine LED drann hängen. >> Was hast du mit der LED gemacht? Ist der Jumper offen? > > Ich mach garnix mit dem Board. Das war nur ein Beispiel von mir. Der TE > hat doch das Problem... Offentliche Entschuldigung. Ich hab übersehen, dass diese Antwort nicht von thomas kam. Trotzdem liegt es jetzt an ihm, aufzuzeigen, was er aus seinem Schaltplan gemacht hat. Der lässt ja durch die Jumper gewisse Freiheiten zu.
Ich hab nur bei JMP2 einen Jumper reingesetzt, bei den anderen hab ich keine jumper drinnen
thomas schrieb: > Ich hab nur bei JMP2 einen Jumper reingesetzt, bei den anderen hab ich > keine jumper drinnen Was ist mit J13,J14,J15,J16,J17 (die LEDs) ???? Wo hängt das Poti dran?
das poti hab ich an einem ende an vcc das andere ende am gnd und den mittleren ausgang am eingang vom ad wandler, und bei j13 - j17 hab ich halt die leds
thomas schrieb: > das poti hab ich an einem ende an vcc das andere ende am gnd und den > mittleren ausgang am eingang vom ad wandler Kabel direkt gelötet, oder wie? > und bei j13 - j17 hab ich > halt die leds Also doch Jumper, oder wie? Wenn du dein Poti an den PC0 geklemmt hast, dann kannst du die dort befindliche LED nicht benutzen. Du kannst nicht gleichzeitig am selben PIN mit dem ADC die Spannung messen und dann auch noch eine LED an diesem Pin ansteuern. Das heißt, können tust du schon, nur wird dann der ADC nur Unsinn messen.
thomas schrieb: > das poti hab ich an einem ende an vcc das andere ende am gnd und den > mittleren ausgang am eingang vom ad wandler, und bei j13 - j17 hab ich > halt die leds Jo mei, dann schalte doch erstmal die LEDs ohne AD-Wandler an und aus und schau ob das klappt. Ohne Jumpers werden die LEDs keinen Kontakt zum µC haben...
thomas schrieb: > Ich hab nur bei JMP2 einen Jumper reingesetzt, bei den anderen hab ich > keine jumper drinnen Wieso JMP2? Das ist doch der Jumper am unteren Ende vom µC im Schaltplan, mit dem man sich selbst den Reset Pin unter dem Hintern wegziehen kann. Oder meinst du einen anderen? Sieh mal: Von unserer Seite des Bildschirms kann keiner auf deine Platine schauen. Wir haben nur den Schaltplan und das was du erzählst. Und das was du erzählst passt so gar nicht zu dem, was sich laut Schaltplan als vernünftig darstellt.
ich hab schon verschiedene programme geschrieben mitdenen ich die leds ansteuern konnte d.h. so leuchten lassen konnte wie ich es wollte z.b. blinkled oder das alle der reihe nach leuchten bei den leds sollte daher kein problem bestehen
thomas schrieb: > ich hab schon verschiedene programme geschrieben mitdenen ich die leds > ansteuern konnte d.h. so leuchten lassen konnte wie ich es wollte z.b. > blinkled oder das alle der reihe nach leuchten bei den leds sollte daher > kein problem bestehen Also sind die Jumper dort gesetzt? Gut. Nur: an PC0 musst du den LED Jumper entfernen, wenn du den Pin als ADC Eingang benutzen willst.
ich hab nur den roten jumper drinnen, bei den leds gibts die jumper die eingezeichnet worden sind überhaupt nicht ich hab unten bei der platine nachgeschaut :S
Mach mal ein Photo von deinem Aufbau. So wie er jetzt ist. Sonst raten wir hier noch 2 Stunden fröhlich drauflos, ohne das es zu etwas führt.
Das Programm funktioniert! Ich hab einfach die LED rausgenommen am Port PC0, jetzt hab ich nur 4 leds zur verfügüng aber das ist auch ok
1 | if( ADCValue <= 60 ) // zeite LED leuchtet |
2 | PORTC = (1<<PC1) | (1<<PC2); |
3 | |
4 | else if( ADCValue <= 90 ) // dritte LED leuchtet |
5 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3); |
6 | |
7 | else if( ADCValue <= 120 ) // vierte LED leuchtet |
8 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4); |
9 | |
10 | else if( ADCValue <= 150 ) // fünfte LED leuchtet |
11 | PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5); |
12 | }
|
13 | }
|
den befehl der die erste led ansteuert hab ich einfach rausgenommen jedoch weis weis ich nicht wie sie auf die werte 60,90,120,150 gekommen sind ich hab die werte willkürlich geändert und herausgefunden das das programm geht, jetzt müsste ich nur wissen wie sie zu den werten gekommen sind um das ganze genauer zu machen ich verwende einen 8,2k potentiometer spannung am potentiometer max 3,6V
thomas schrieb: > jedoch weis weis ich nicht wie sie auf die werte 60,90,120,150 gekommen > sind Die haben wir einfach geschätzt bzw. irgendwelche Werte mal angenommen damit was dort steht. Dein ADC liefert dir Werte zwischen 0 und 1023. 1023 ist Vollausschlag und der wird dann erreicht, wenn die zu messende Spannung der Referenzspannung entspricht (nicht ganz, aber machen wirs nicht komplizierter als unbedingt notwendig) http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.