mit AVR 328P (UNO)

Gast #4163855
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
Gast #4165528
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
Gast #4165770
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);

  }
}
#4166167
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.
Gast #4166277
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
Gast #4166298
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.
#4166308
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
Gast #4166312
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
Gast #4166330
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

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