Hallo zusammen, vielleicht bin ich einfach zu benagelt, aber ich bekomme es nicht hin mir den Analogwert von meinem Uno anzeigen zu lassen. Vorab: Ich programmiere in Eclipse Juno mit c (Vorgabe von der Uni). Ich bekomme es hin, mit dem Analogwert und einer PWM-Sequenz eine LED hoch und runter zu dimmen. Schaltungstechnisch ist daher wahrscheinlich alles in Ordnung. Zur Struktur: Ich habe ein C-File für die analoge Auswertung gebastelt. Dann habe ich einen Header, der für die zusammenführung der verschiedenen C-Files gedacht war (analog und pwm). Und natürlich meine Main. Meine analog.c: #include <avr/io.h> int setup_ADC() { ADMUX = (1<<REFS0) | (1<<MUX0) | (1<<MUX2); ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2); DIDR0 = (1<<ADC5D); ADCSRA |= (1<< ADSC); // Evtl. nötig //while (ADCSRA & (1<<ADSC)); return ADC; } meine zusammenfuehrung.h: #ifndef ZUSAMMENFUEHRUNG_H_ #define ZUSAMMENFUEHRUNG_H_ int setup_ADC(); #endif /* ZUSAMMENFUEHRUNG_H_ */ meine main.c #include <util/delay.h> #include <avr/io.h> #include "zusammenfuehrung.h" #include <stdio.h> #include <stdlib.h> int main() { while(1) { int poti; poti = (int)setup_ADC(); printf("Analogwert = %i\n", poti); _delay_ms(500); } } Die Anzeige soll nur über die Console geschehen. Ich kann ja nur einen WErt manipulieren, den ich auch kenne ;) Ich bin dankbar für jeden Tipp!!!! Vielen Dank! Gruß Kai
:
Verschoben durch User
Hallo Hab mich mal angemeldet, deshalb ein anderer Name: Zur Hardware ich habe nen Uno mit nem 328P Für den analogen Eingang nutze ich den A5 (PB1 / OC1A)
Hallo Kai Ich vermute, dass du dich mit der Arduino IDE Programmierung auch auskennst, weil du ja einen Arduino UNO verwendest. Du kannst den Quellcode der C/C++-Routinen aus dem Arduino Programmordner entnehmen. Z.B. Serial.begin() und Serial.print() sind in der Datei /ArduinoProgrammOrdner/Resources/Java/hardware/arduino/cores/arduino/Har dwareSerial.cpp abgelegt. Grüsse
Analogwert anzeigen in c schrieb: > aber ich bekomme es nicht hin sehr ausführliche Fehlerbeschreibung Analogwert anzeigen in c schrieb: > // Evtl. nötig > //while (ADCSRA & (1<<ADSC)); Lösche das "Evtl." Analogwert anzeigen in c schrieb: > printf was ist denn stdio auf einem Arduino?
Hallo, danke für die Antworten. Hab das Programm mal etwas übersichtlicher erstellt. (ohne Header-Files etc.) Zur I/O haben wir die "uart.h". Das funktioniert auch mit einem "Hello AVR". Der Controller zeigt mir in dem unteren Programm das "Hallo AVR" an. "Analogwert = 212" <- der Wert ist permanent der Gleiche. Sollte was unklar sein, sollte ich was vergessen haben: Fragen! Code: #include <avr/delay.h> #include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include "uart.h" int setup_ADC() { ADMUX = (1<<REFS0) | (1<<MUX0) | (1<<MUX2); ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2); DIDR0 = (1<<ADC5D); ADCSRA |= (1<< ADSC); while (ADCSRA & (1<<ADSC)); return 0; } int main() { int dim = 0; while (1) { uart_stdio(); printf("Hello AVR! \n"); _delay_ms(500); dim = (int)setup_ADC; printf("Analogwert = %i ", dim); _delay_ms(500); } }
Kai L. schrieb: > "Analogwert = 212" und Kai L. schrieb: > while (ADCSRA & (1<<ADSC)); > > return 0; passt irgendwie nicht zusammen
:
Bearbeitet durch Admin
Kai L. schrieb: > dim = (int)setup_ADC; damit lässt du dir die Adresse der Funktion setup_ADC geben, Funktionen ruft man in C anders auf.
:
Bearbeitet durch Admin
Es ist nicht sinnvoll bei jedem ADC-Aufruf diesen neu zu initialisieren.
1 | #include <avr/delay.h> |
2 | #include <avr/io.h> |
3 | #include <stdio.h> |
4 | #include <stdlib.h> |
5 | #include "uart.h" |
6 | |
7 | int setup_ADC() |
8 | {
|
9 | ADMUX = (1<<REFS0) | (1<<MUX0) | (1<<MUX2); |
10 | ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2); |
11 | DIDR0 = (1<<ADC5D); |
12 | |
13 | |
14 | return 0; |
15 | }
|
16 | |
17 | int main() |
18 | {
|
19 | int dim = 0; |
20 | setup_ADC(); |
21 | while (1) |
22 | {
|
23 | uart_stdio(); |
24 | printf("Hello AVR! \n"); |
25 | _delay_ms(500); |
26 | |
27 | |
28 | |
29 | ADCSRA |= (1<< ADSC); |
30 | while (ADCSRA & (1<<ADSC)); |
31 | dim=ADC; |
32 | |
33 | printf("Analogwert = %i ", dim); |
34 | _delay_ms(500); |
35 | |
36 | }
|
37 | }
|
So sollte es eher funktionieren, Eclipsefeinheiten wirst du ja kennen falls der Syntax nicht ganz stimmt.
Also du meinst ein mal die initialisierung und dann nur von die conversation starten?
Ja, jedes mal initialisieren bringt nichts. Nimm ausserdem aus dem Register ADCSRA das (1<<ADIE) weg. Damit hast du den ADC-Interrup aktiviert den du aber nicht abarbeitest.
Hallo Hubert, Erstmal danke ich dir für die Antwort. Ich habe vorhin gemerkt, dass ich bessere Ergebnisse bekomme wenn ich die Initialisierung von der Conversation trenne, das würde ja deinem Vorschlag entsprechen. Werde das morgen früh austesten. Als nächster Schritt soll eine PWM daraus generiert werden. Das riesen Problem ist, dass das nirgend vernünftig im Netz erklärt wird. Es gibt nur ein youtube Video dazu. Wie kann ich denn die Conversation gezielt beenden und auswerten? Gruß Kai
Die Conversion beendet sich von selbst. Du musst sie nur gezielt starten. Mit den zweimal delay und PWM wirst du aber etwas Bauchweh bekommen. Timer sind da angesagt. Wieviel bit soll denn die PWM haben? Du kannst den ADC-Wert eventuell direkt an die PWM übergeben.
Analogwert anzeigen in c schrieb: > vielleicht bin ich einfach zu benagelt, aber ich bekomme es nicht hin > mir den Analogwert von meinem Uno anzeigen zu lassen. Du bekommst es ja nichtmal hin, einen aussagekräftigen Titel für deinen Thread zu wählen. Warum sollte es mit der Anzeige von Analogwerten besser klappen?
kai schrieb: > Das riesen Problem ist, dass das nirgend vernünftig im Netz erklärt > wird. Unsinn, das Problem ist ein anderes
Wie oben beschrieben ist die Übergabe an die PWM nicht das Problem. Die Delays dienen eigentlich der Übersicht, dass nicht alles "gleichzeitig" pssiert und ich in der Konsole noch die Schritte erkennen kann. Die PWM besteht aus 8bit, daher wollte ich den Analogwert ja auch auslesen. Nur so kann ich ihn an die PWM anpassen. Ja ich gebe zu, dass das mit dem Titel nicht sonderlich schlau war. Aber bitte verzeih mir, ist mein erster Beitrag.
Walter S. schrieb: > kai schrieb: >> Das riesen Problem ist, dass das nirgend vernünftig im Netz erklärt >> wird. > > Unsinn, das Problem ist ein anderes Dann schilder uns doch mal deine Ansicht.
Kai L. schrieb: > Die PWM besteht aus 8bit, daher wollte ich den Analogwert ja auch > auslesen. > Nur so kann ich ihn an die PWM anpassen. Da braucht du nicht viel anpassen. Im ADMUX-Register das ADLAR setzen und nach der Conversion das ADCH abfragen. Da hast du den 8-bit Wert den du direkt an die PWM übergeben kannst. Das hier im Verbund mit dem Datenblatt hilft schon sehr: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
:
Bearbeitet durch Admin
Hallo kai, kai schrieb: > Das riesen Problem ist, dass das nirgend vernünftig im Netz erklärt > wird. Es gibt nur ein youtube Video dazu. Um C zu lernen ("dim = (int)setupADC" -- da fehlen offensichtlich ein paar Grundlagen) gibt es im Netz unzählige Tutorials. Um die Feinheiten der AVR-Programmierung zu lernen, gibt es hier auf der Seite ein sehr gutes Tutorial (auf der Startseite oben links unter "AVR-GCC-Tutorial"). HTH, Karl
Hallo Hubert, habe dein Programm eben reinkopiert. Zunächst keine Funktion. Habe dann den Interrupt rausgenommen und siehe da, es läuft. Wie gesagt, die PWM läuft zunächst einmal. Aber daran werde ich mich die Tage auch nochmal versuchen. Gruß Kai
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.