Forum: Mikrocontroller und Digitale Elektronik Analoge Werte an LED ausgeben


von BJBJ (Gast)


Lesenswert?

Hallo @All,

ich möchte Analoge Werte gerne an den LED's (ich habe keine andere 
Anzeige) ausgeben - d.h. beispielsweise 3,8V sollen ausgegeben werden - 
das bedeutet, dass diese 3,8 V in einen Binärwert umgewandelt werden 
sollen, die die LED's dann ausgeben.

Ich habe ein STK-500 und einen ATmega8515L und nutze AVR Studio 4.
Programmiert werden soll alles in C.

Was muss ich machen, um diese Analogen Werte ausgeben zu können?

von dfghjk (Gast)


Lesenswert?

naja den ADC wert einfach an die Leds, ist doch eh schon alle binär

von BJBJ (Gast)


Lesenswert?

Sorry das ich Frage, aber wie mache ich das ?
Programmcode als Beispiel würde helfen...

von Joachim B. (jar)


Lesenswert?

BJBJ schrieb:
> das bedeutet, dass diese 3,8 V in einen Binärwert umgewandelt werden
> sollen, die die LED's dann ausgeben.

und wie soll die LED das machen?

auf irgendeinen Binärwert die Farbe wechseln? (also soll eine rote LED 
grün werden)
den Binärwert als Morsezeichen ausgeben? -S-O-S-

kannst du noch mal überlegen wie deine Frage verständlicher werden 
könnte?

von BJBJ (Gast)


Lesenswert?

Also,

ich erhöhe die Spannung von 0-5V. Wenn ich jetzt beispielsweise bei dem 
Wert 3,5V bin, soll der Wert ausgegeben werden - und dafür möchte ich 
die LED's nutzen. Da man aber keine Zahlen mit Kommastellen in einen 
Binärwert umwandeln kann, erhöhe ich diese um den Faktor 10.

Das bedeutet, dass meine Spannung von 3,5V den Wert 35 hat - der ist 
binär darstellbar - vor allem können meine 8 LED's am STK-500 ja Wert 
bis 255 ausgeben.

Verstehst du, was ich meine ?

von dfghjk (Gast)


Lesenswert?

Naja du wandelst die Spannung in einen Binärwert um mittels ADC

und dann schreibst du es eifnach auf die Ports wo die LEDs dranhängen

ADC=PORTx;

von BJBJ (Gast)


Lesenswert?

Besser formuliert: Weden Wert im Bereich von 0-5V möchte ich an meinen 
LED's ausgeben. D.h. die Werte 0- 50 (weil Kommawerte ja nicht möglich 
sind).
Diese Werte müssen aber erst binär sein, damit meine LED weiß, was sie 
ausgeben soll.

Ich hoffe das war verständlich..

von dfghjk (Gast)


Lesenswert?

*PORTx=ADC;^^

von Dennis S. (sixeck)


Lesenswert?

ja ,jeder versteht dich, aber WIE sollen die zahlen dargestellt werden ? 
blinkend ? bei dem wert 3 zB 3 mal blinken ? oder hast du eine matrix 
und willst sie tatsächlich als zahl darstellen ?

von BJBJ (Gast)


Lesenswert?

dfghjk schrieb:
> Naja du wandelst die Spannung in einen Binärwert um mittels ADC
>
> und dann schreibst du es eifnach auf die Ports wo die LEDs dranhängen
>
> ADC=PORTx;

Ja, soweit kann ich folgen - aber wie programmiert man so einen ADC - 
wie sage ich ihm, dass er die Spannung in einen Binärwert umwandeln 
soll.
Das ist mein Problem - ich kenne die Befehle nicht und bin nicht fündig 
geworden.

von dfghjk (Gast)


Lesenswert?

lies dir das Binärsystem nochmal durch..

von BJBJ (Gast)


Lesenswert?

Achsoo - die LED's sollen Leuchten - beispiel :

Habe eine Spannung von 3,5V - LED 1,3 und 5 leuchten.
Dann erhöhe ich die Spannung auf 3,6 V - LED 2,3 und 5 Leuchten.

So meine ich das.

von dfghjk (Gast)


Lesenswert?

und das Datenblatt über den ADC

von Joachim B. (jar)


Lesenswert?

BJBJ schrieb:
> Diese Werte müssen aber erst binär sein, damit meine LED weiß, was sie
> ausgeben soll.
>
> Ich hoffe das war verständlich..

ne nicht wirklich:

und wie soll die LED das machen?

auf irgendeinen Binärwert die Farbe wechseln? (also soll eine rote LED
grün werden)
den Binärwert als Morsezeichen ausgeben? -S-O-S-

kannst du noch mal überlegen wie deine Frage verständlicher werden
könnte?

Eine LED kann das nicht.
Eine LED kann auch nicht die Farbe wechseln.
Eine LED kann auch nicht 10 Binärwerte darstellen (der ADC hat eine 10 
Bit Auflösung, um diese darzustellen brauchst du 10 LEDs, also wozu die 
Frage mit meine LED = Singular?)

von Dennis S. (sixeck)


Lesenswert?

BJBJ schrieb:
> Achsoo - die LED's sollen Leuchten - beispiel :
>
> Habe eine Spannung von 3,5V - LED 1,3 und 5 leuchten.
> Dann erhöhe ich die Spannung auf 3,6 V - LED 2,3 und 5 Leuchten.
>
> So meine ich das.

das ist zB eine gute Ansage

von Pandur S. (jetztnicht)


Lesenswert?

Ich denk es waere an der Zeit ein Oszilloskop zu beschaffen. Dann kann 
man wenigstens Pulse ausgeben

von BJBJ (Gast)


Lesenswert?

Eine Spannung von 0,5V kommt rein - ich sage vorher, "Bitte erhöhe die 
Analogen werte um den Faktor 10 - das wäre dann also bei 0,5V der 
analoge Wert 5 - und diesen kann man doch binär darstellen?!

5 hätte den Binärwert 101 - damit blinken LED 1 und 3.

von Bitflüsterer (Gast)


Lesenswert?

Hier fehlen drei grundlegende Kenntnisse:

1. ALLE Werte in einem heutigen Computer werden zunächst als (Kette von) 
Binärwerte(n) dargestellt und physikalisch repräsentiert. Zusätzlich zur 
Interpretation als Kette von Binärzahlen, lassen sich diese Ketten auch 
als ASCII-Zeichen, als ganze Zahlen beliebiger Basis mit und ohne 
Vorzeichen und eben auch als Real-Zahlen interpretieren.

2. Die meisten primitiven Operationen, wie etwa +, -, *, /, % 
interpretieren die Ketten von Binärwerten tatsächlich als Integer- bzw. 
Real-Zahlen. Welche Interpretation aktuell verwendet wird, sagt man dem 
Compiler in dem man Typen für die Variablen angibt. Z.B. uint_16, float 
etc.

3. Weitere Operatoren, wie <<, >>, ~, die selbst die Binärwerte 
lediglich als solche auffassen können angewendet werden, um etwa die 
Skalierung von Werten oder eben auch die Interpretationen zu ändern - 
und sei es auch nur zeitweise.

Lies Dir nochmal genau in einem C-Buch die Abschnitte über Variablen, 
Typen und die Operatoren durch.

Man kann nicht programmieren, wenn man die Grundlagen nicht kennt.

von Karl H. (kbuchegg)


Lesenswert?

BJBJ schrieb:
> Eine Spannung von 0,5V kommt rein - ich sage vorher, "Bitte erhöhe die
> Analogen werte um den Faktor 10 - das wäre dann also bei 0,5V der
> analoge Wert 5 - und diesen kann man doch binär darstellen?!
>
> 5 hätte den Binärwert 101 - damit blinken LED 1 und 3.

Deine Zahlenwerte sind schon binär.

Alles in einem COmputer ist binär.

Hast du denn noch nie ausprobiert, welche LED leuchten, wenn du zb
1
  PORTB = 5;
machst?

Solltest du mal. Das Ergebnis ist erhellend.

von Joachim B. (jar)


Lesenswert?

BJBJ schrieb:
> Habe eine Spannung von 3,5V - LED 1,3 und 5 leuchten.
> Dann erhöhe ich die Spannung auf 3,6 V - LED 2,3 und 5 Leuchten.
>
> So meine ich das.

Dennis S. schrieb:
> das ist zB eine gute Ansage

die er auch hätte früher schreiben können (manno)

also ADC
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

gibt dir eine Int Zahl im Bereich von 0-1023 (10 Bit = 1024 Werte)

dafür brauchst du 10 LEDs

den ADC Wert schiebst du 6x nach links
unddierst mit 0X8000

uint16_t var
var=ADC
var<<6;

Schleife 10x durchlaufen

if(var&0x8000)
 LEDn= ON;
else
 LEDn= OFF;

einmal linksschieben und nächste LED

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
>
> gibt dir eine Int Zahl im Bereich von 0-1023 (10 Bit = 1024 Werte)
>
> dafür brauchst du 10 LEDs

Er hat aber nur 8.

Also muss er die beiden untersten weniger wichtigen Bits wegschneiden:

 adc >>= 2;

Jetzt hat er einen Wert 0...255

Den gibt er auf den 8 LEDs so aus:

  PORTD = adc;

FERTIG!

Er liest den binären Wert ab oder tippt ihn in seinen 
Windows-Taschenrechner (Programmierer -> Binär) und multiplziert ihn mit 
4. Dann hat er den (ungefähren) ADC-Wert von 0...1023. Den rechnet er 
dann mit dem Taschenrechner in seine Spannung um. Einfacher Dreisatz. 
Also durch 1024 multipliziert mit Maximalspannng, welche 1023 
entspricht.

> den ADC Wert schiebst du 6x nach links
> unddierst mit 0X8000

Warum das????

> Schleife 10x durchlaufen

Warum Schleife???

> einmal linksschieben und nächste LED

Ist das Dein Ernst?

: Bearbeitet durch Moderator
von spess53 (Gast)


Lesenswert?

Hi

>Also muss er die beiden untersten weniger wichtigen Bits wegschneiden:

> adc >>= 2;

Oder ADLAR in ADMUX setzen und nur ADCH auslesen.

MfG Spess

von BJBJ (Gast)


Lesenswert?

#include <avr/io.h>

#define adc PORTA

int main(void)
{



    DDRB = 255;

  while (1)
  {

    adc >>= 2;
   PORTB = adc;

    }

  return 0;

}




Wo ist mein Fehler?

LG BJBJ

von Karl H. (kbuchegg)


Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>> http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
>>
>> gibt dir eine Int Zahl im Bereich von 0-1023 (10 Bit = 1024 Werte)
>>
>> dafür brauchst du 10 LEDs
>
> Er hat aber nur 8.
>
> Also muss er die beiden untersten weniger wichtigen Bits wegschneiden:
>
>  adc >>= 2;
>
> Jetzt hat er einen Wert 0...255
>
> Den gibt er auf den 8 LEDs so aus:
>
>   PORTD = adc;
>
> FERTIG!

Nicht ganz. Er möchte es noch auf eine Voltangabe umrechnen. Aber ich 
denke das ist nicht sein Problem.
Was ihm bisher gefehlt hat, das war die Erkentniss, dass er einem Port 
als ganzes genausogut etwas zuweisen kann. Sowie die Erkentniss, dass er 
dazu auch nichts speziell machen muss.

Ich hätte es ja anders gemacht.
Ich hätt in den unteren 4 Bits die Einerstelle vom Zwischenergebnis 
gegeben und in die oberen 4 Bits die Zehnerstelle. Sozusagen ein BCD. 
Fände ich leichter abzulesen. Denn wer kennt schon die Bitdarstellung 
von 47 auswendig. Die von 4 kenn ich aber und die von 7 auch. Leuchten 
meine LED so
1
  +---+---+---+---+---+---+---+---+
2
  | . | x | . | . | . | x | x | x |
3
  +---+---+---+---+---+---+---+---+
4
5
  |               |               |
6
  +---- 4 --------+------ 7 ------+
dann würde zumindest ich mir mit der Ablesung um einiges leichter tun.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Er hat aber nur 8.

ist ja nicht mein Problem, aber die lower Bit wegwerfen geht natürlich 
auch

Frank M. schrieb:
> Ist das Dein Ernst?

ja klar, erst mal soll er lernen und verstehen, deine Fähigkeiten kann 
er sich ja später aneignen, es gibt immer mehr als einen Weg nach Rom 
auch wenn nur deiner der richtige ist ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

BJBJ schrieb:
> Wo ist mein Fehler?

adc ist der analoge Wert. Wo hast Du diesen denn ausgelesen?

Bestimmt nicht damit:

> #define adc PORTA

So einfach geht ADC-Wandlung nicht.

Gehe zurück auf Los. Am besten, indem Du Dich erstmal einliest, wie Du 
einen Analogwert an einem Pin ausliest.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> Ich hätte es ja anders gemacht.
> Ich hätt in den unteren 4 Bits die Einerstelle vom Zwischenergebnis
> gegeben und in die oberen 4 Bits die Zehnerstelle. Sozusagen ein BCD.
> Fände ich leichter abzulesen.

Ja, natürlich, das wäre für mich dann die Phase 2 gewesen. Erstmal 
einfach, dann komfortabel.

 Phase 1: ADC-Wert binär darstellen
 Phase 2: ADC-Wert in BCD ausgeben
 Phase 3: Bis zu 4 Dezimalzahlen, z.B. 1023, als Lauflicht ausgeben ;-)
 Phase 4: Ergebnis gemorst auf nur einer LED
 Phase 5: Statt LED eine IR-LED, Signalübertragung an einen 2. µC
          mit Display ;-)

: Bearbeitet durch Moderator
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Aber ich
> denke das ist nicht sein Problem.

Ich nehms zurück.
Zu diesem Zeitpunkt hatte ich sein 'Programm' noch nicht gesehen.

Da fehlt es an noch viel mehr als ich ursprünglich dachte.

von Joachim B. (jar)


Lesenswert?

BJBJ schrieb:
> Wo ist mein Fehler?

das du ADC nicht verstanden hast!

Joachim B. schrieb:
> also ADC
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

lesen musst du das schon......

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.