Forum: Mikrocontroller und Digitale Elektronik mit AVR 328P (UNO)


von Analogwert anzeigen in c (Gast)


Lesenswert?

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
von Kai L. (Gast)


Lesenswert?

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)

von Mick (Gast)


Lesenswert?

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

von Walter S. (avatar)


Lesenswert?

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?

von Kai L. (Gast)


Lesenswert?

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);

  }
}

von Daniel C. (cecky)


Lesenswert?

Kai L. schrieb:
> "Analogwert = 212"

und

Kai L. schrieb:
> while (ADCSRA & (1<<ADSC));
>
>   return 0;

passt irgendwie nicht zusammen

: Bearbeitet durch Admin
von Kai L. (Gast)


Lesenswert?

Ja da hast du recht.
Hab das geändert auf

return ADC;

Die Antwort des AVR ist eine "0"

von Walter S. (avatar)


Lesenswert?

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
von Hubert G. (hubertg)


Lesenswert?

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.

von kai (Gast)


Lesenswert?

Also du meinst ein mal die initialisierung und dann nur von die 
conversation starten?

von Hubert G. (hubertg)


Lesenswert?

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.

von kai (Gast)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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.

von Forist (Gast)


Lesenswert?

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?

von Walter S. (avatar)


Lesenswert?

kai schrieb:
> Das riesen Problem ist, dass das nirgend vernünftig im Netz erklärt
> wird.

Unsinn, das Problem ist ein anderes

von Kai L. (Gast)


Lesenswert?

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.

von Kai L. (Gast)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

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
von Karl Käfer (Gast)


Lesenswert?

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

von Kai L. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.