mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Wert -> LED Ausgabe


Autor: Volker K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich habe einen AD-Port, an dem ich ein Poti habe. Ich lasse die Werte am 
Port wandeln (8 Bit). Das funktioniert bis hierhin.

Dann habe ich acht LEDs an acht Ports. P0-P7.

Bis jetzt habe ich das Ergebnis der AD-Wandlung auf die LEDs ausgegeben. 
Das funktioniert auch soweit. So wird das Ergebnis der AD-Wandlung quasi 
binär auf den LEDs ausgegeben. In etwa PortXY= ADCWert;

Nun würde ich aber gerne das ganze etwas anders ausgeben, aber auch 
wieder auf den LEDs.
Ich würde nun aber gerne mit steigendem ADCWert mehr LEDs angehen 
lassen.
Also 8 LEDs auf 8 Bit verteilt:

256/8= 32.

Wenn ADCWert= 0, soll keine LED leuchten, bei ADCWert 255 sollen alle 
acht LEDs leuchten. Wenn der ADCWert zwischen 1 und 32 liegt, soll die 
erste LED leuchten, wenn der ADCWert 32-64 ist, soll die erste und 
zweite LED leuchten usw.

Ich weiß leider nicht, wie ich das genau umsetzen soll. Ich könnte 
mehrere if / if else Abfragen nehmen oder das ganze über switch 
gestalten.

Wollte aber einmal fragen, ob es wohl möglich ist, das ganze einfacher 
zu gestalten, anstatt über viele Bedingungen.

Grüße
Volker

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst einen Schleifenzähler bauen der alle n ADC-Werte eine Variable 
erhöht bzw. deren Bits verschiebt, wie bei einem Bargraphen. Diese 
Variable gibst Du dann auf dem LED-Port aus.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Eine Tabelle mit 8 Einträgen im Flash ablegen:

Tabelle:   ; "eine LED leuchtet" bis "alle 8 LEDs leuchten"
.DB 0b11111110, 0b11111100
.DB 0b11111000, 0b11110000
.DB 0b11100000, 0b11000000
.DB 0b10000000, 0b00000000

2. Den ADC-Wert 5 mal nach rechts schieben.  Das ergibt einen Wert 
zwischen 0 und 7. Diesen Wert als Index auf die Tabelle verwenden. 
Tabelleneintrag mit 'lpm' auslesen und auf den Port mit den LEDs 
schreiben.

Ich zähle 11 Assemblerbefehle für alles:
; 8-Bit-ADC-Rohwert in Register t
lsr t
lsr t
lsr t
lsr t
lsr t
ldi ZL, Low (2*Tabelle)
ldi ZH, High(2*Tabelle)
add ZL, t
adc ZH, _0       ; Register _0 immer = 0
lpm
out PORTB, r0

Falls Du auch noch den Zustand "alle LEDs aus" haben willst, wirds einen 
Tick komplizierter (selbst überlegen).

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ADCWert= 0, soll keine LED leuchten, bei ADCWert 255 sollen alle
>acht LEDs leuchten. Wenn der ADCWert zwischen 1 und 32 liegt, soll die
>erste LED leuchten, wenn der ADCWert 32-64 ist, soll die erste und
>zweite LED leuchten usw.

>Ich weiß leider nicht, wie ich das genau umsetzen soll. Ich könnte
>mehrere if / if else Abfragen nehmen oder das ganze über switch
>gestalten.
switch  (ADC_Wert>>5)
{
case 0:   PORTxy = 0b00000000;  break;
case 1:   PORTxy = 0b00000001;  break;
case 2:   PORTxy = 0b00000011;  break;
case 3:   PORTxy = 0b00000111;  break;
case 4:   PORTxy = 0b00001111;  break;
case 5:   PORTxy = 0b00011111;  break;
case 6:   PORTxy = 0b00111111;  break;
case 7:   PORTxy = 0b01111111;  break;
}

Autor: Volker K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mal folgende Version getestet:
switch  (ADC_Wert>>5)
{
case 0:   PORTxy = 0b00000000;  break;
case 1:   PORTxy = 0b00000001;  break;
case 2:   PORTxy = 0b00000011;  break;
case 3:   PORTxy = 0b00000111;  break;
case 4:   PORTxy = 0b00001111;  break;
case 5:   PORTxy = 0b00011111;  break;
case 6:   PORTxy = 0b00111111;  break;
case 7:   PORTxy = 0b01111111;  break;
}

Ich hab das Problem, dass  von Anfang an die erste LED leuchtet und wenn 
ich dann an dem Poti drehe und die Spannung am ADC erhöhe, gehen weitere 
LEDs an bis acht Stück leuchten. eigentlich sollten doch nur 7 leichten 
maximal nach dem obigen code oder verstehe ich da was falsch und es 
sollte auch vorkommen, dass keine LED leuchtet, aber es leuchtet immer 
mindestens die erste LED.

Da steig ich nicht ganz durch.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich:

Wenn die LEDs wie üblich gegen VCC geschaltet sind, dann leuchten die 
acht LEDs wegen der Zeile "PORTxy = 0b00000000" und die eine LED am 
anderen Potiende leuchtet wegen der Zeile "PORTxy = 0b01111111".

>und die Spannung am ADC erhöhe

Erhöhst oder erniedrigst? Miss mal mit nem Multimeter direkt am Poti 
nach.

Autor: Volker K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhhhhh, ok ein Teil hat sich erledigt...Ich muss das ganze 
invertieren, um die LEDs zum leichten zu bringen......

Aber wie bekomme ich die achte LED zum leuchten?

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber wie bekomme ich die achte LED zum leuchten?

Meine Operation ADC_Wert>>5 ist ja dasselbe wie eine Teilung durch 32.
Somit teilst du die 256Werte des Potis in 8 Zustände (0..7).

Willst du Null bis alle acht Leds leuchten lassen, musst du neun 
Zustände erzeugen.
switch  (  ADC_Wert / (uint8_t)(256/9)  )
{
case 0:   PORTxy = 0b11111111;  break;
case 1:   PORTxy = 0b11111110;  break;
case 2:   PORTxy = 0b11111100;  break;
case 3:   PORTxy = 0b11111000;  break;
case 4:   PORTxy = 0b11110000;  break;
case 5:   PORTxy = 0b11100000;  break;
case 6:   PORTxy = 0b11000000;  break;
case 7:   PORTxy = 0b10000000;  break;
case 8:   PORTxy = 0b00000000;  break;
}

Autor: Volker K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank! Nun funktioniert es....Hab mal durch die Bitverschiebung 
wieder nicht ganz so durchgeblickt, bzw. mich mal wieder ein wenig 
verwirren lassen.


Vielen Dank.

Grüeß
Volker

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.