www.mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik spannung einlesen auf led-reihe ausgeben


Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo hängst? Am ADC? An der Hardware? Am Compiler? An der Ausgabe?

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja nochwas, ich programmier mit ICCv7 for AVR, also in C

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am wichtigsten wäre es jetzt mal, das ich den analogen wert in den adc
bekomm!!!
hat jemand so etwas - oder ähnliches schon mal gemacht?

mfg

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist das Problem? Du hängst deine Spannungsquelle (solange sie kleiner
als Vref ist) einfach an den ADC-Eingang. Wenn sie grösser ist als Vref
setzt du noch einen Spannungsteiler davor.

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier im AVR-GCC Tutorial ist ein Beispiel für das Einlesen vom ADC.

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo liegt der adc-eingang? ist der am PORTF?

an johannes: wo ist das bsp? ich finde es nicht!

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also um rauszubekommen, an welchem Ports ADCs hängen, solltest du
vielleicht mal ins Datenblatt schauen! Würde mich übrigens mal
interessieren, wo du an einem ATMega16 einen PORTF findest.

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Port F (PF7..PF0) Port F serves as the analog inputs to the A/D
Converter.

steht im datenblatt...

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung, was für ein Datenblatt du hast, aber bestimmt nicht das
des ATMega16. Der hat nämlich keinen PORTF.

http://www.atmel.com/dyn/resources/prod_documents/2466S.pdf
http://www.atmel.com/dyn/resources/prod_documents/...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Lustig:
Gerade gestern Abend hab ich genau diese Aufgabenstellung
als Spielerei spät nachts noch ausprobiert.

Anbei das C-Programm für WinAvr.

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo karl heinz
könntest du mir eine kurze beschreibung von deinem programm machen,
inder du erklärst was gerade gemacht wird, etc...

wäre echt voll super von dir!!!

danke helli

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in dem von mir genannten Link ist doch auch alles erklärt, die Bits sind
da sogar eingedeutscht. Und das C-Program enthält nur logische
Operationen und zwei Schleifen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
!!vielen dank!!, bei weiteren fragen frag ich halt einfach :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

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.