spannung einlesen auf led-reihe ausgeben

Gast #345298
Lesenswert?

hallo leute!

ich hab eine frage/bitte!
ich soll mit einem atmega16 einen adc realisieren, der eine analoge
spannung einliest und an eine led-reihe ausgibt!
ich probier jetzt schon seit langer zeit herum und mach micht schlau,
aber ich bekomms einfach nicht hin...

kann mir jemand helfen??
Gast #345300
Lesenswert?

danke für die schnelle antwort!!!

ich häng ziemlich überall, ich weiß zB nicht wie ich die U-Werte in den
ADC bekomme, wie diese dann weiterverarbeitet werden sollen um diese auf
die LED Reihe auszugeben,...

Also ziemlich überall, alles was ich bis jetzt probiert habe
funktioniert nicht im geringsten... heul

lg helli
#345312
Lesenswert?

Ganz ehrlich:
Schnapp die das Datenblatt, da stehen alle Register samt
Bitbelegung drinnen. Dann schaust du nach welche Bits ich
gesetzt habe und vergleichst im Datenblatt was die bewirken.
Genauso funktioniert eine wichtige Übung im Leben eines
Programmierers: Studium von fremden Code.
Gast #345313
Lesenswert?

ok, das hab ich schon gemacht, weiß auch für was die ganzen bits sind,
aber was der rest macht, kann ich mir nichts draus reimen...

ich bin halt noch am lernen

vielleicht überlegst es dir nochmal, bitte

mfg
#345315
Lesenswert?

Der Rest ist ganz einfach die Umrechnung
von 0 .. 1024 (die Werte krieg ich vom ADC)
in den Wertebereich 0 .. 8. 0 bis 8 deswegen
weil ich damit das Leds Array indiziere in dem
das auszugebende Bitmuster drinnensteht.

Ich koennte das ganz einfach machen indem
ich den Wert durch 128 ( = 1024 / 8 ) teile
und in der Urversion war das auch tatsächlich so.
Aber dann hab ich die Arraygröße verändert und war
zu faul immer wieder im Taschenrechner auszurechnen
wodurch ich dividieren muss. Also hab ich das so
umformuliert, dass der Compiler die Berechnung macht.

Hinweis: sizeof liefert die Größe in Bytes des angegebenen
Ausdrucks.
Fuer ein Array
  Datentyp Array[ irgendwas ];

liefert der Ausdruck

  sizeof( Array ) / sizeof( Array[0] )

daher die Anzahl Elemente, irgendwas.

Was ist so toll daran? Wenn ich das Array sowieso
dimensioniere, dann weiss ich doch wie gross es ist.

  #define NR_ENTRIES 8
  unsigned char Leds[ NR_ENTRIES ];

In dem Fall wäre das tatsächlich Overkill. ABer den Fall hab
ich ja nicht. Ich dimensioniere das Array implizit, indem
ich die darin zu speichernden Werte angebe:

  unsigned char Leds[] = { ...... };

Der Compiler zählt die Initialisierungen und macht das Array
genau so gross, dass alles reinpasst. Nur weiss ich halt
nicht wieviele Eintraege das sind. Macht aber nichts, denn
   sizeof( Leds ) / sizeof( Leds[0] )

(Also: Gesammtgröße des Arrays in Bytes durch Größe des ersten
 Eintrags in Bytes)
liefert mir diese Anzahl wieder.

Sinn der Sache: Ich kann die Mustertabelle beliebig erweitern, indem
ich einfach nur neue Werte in die Initialisierungsliste schreibe.
Alles andere passt sich automatisch an.

Verusch zb. mal:

unsigned char Leds[] =
  { 0b11111110,
    0b11111100,
    0b11111000,
    0b11110000,
    0b11100000,
    0b11000000,
    0b10000000,
    0b00000000,
    0b00000001,
    0b00000011,
    0b00000111,
    0b00001111,
    0b00011111,
    0b00111111,
    0b01111111,
    0b11111111,
 };

Hier hat die Tabelle 16 Eintraege. Du brauchst sonst
nichts verändern. Alle notwendigen Konstanten und
Umrechnungen berechnet der Compiler für Dich.
#345317
Lesenswert?

> von 0 .. 1024 (die Werte krieg ich vom ADC)
> in den Wertebereich 0 .. 8.

vom ADC kommt natuerlich nur 0 .. 1023
und die Array Indizierung läuft von 0 bis 7

Sorry. War mit meinen Gedanken bereits dabei, wie
ich dir die sizeof-Geschichte rüberbringe und hab
nicht mehr drauf geachtet.

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