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