www.mikrocontroller.net

Forum: Projekte & Code Atmega 16 Analogwert auf 7-Segmet ausgeben


Autor: Martin Sv (sv_martin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es wird ein Analoger Wert eingelesen und für die Ausgabe an einer 
7-Seg-Anzeige aufbereitet.
beinhaltet Funktionen zur Ermittlung der Einer- und Zehnerstellen
die Codierung der Segmente liegt in einem Array (im Fall den Namen 
korrigieren)

an PORTD die 7-Segmentanzeige (Tut 7-Seg Anzeige)
an PORTB PIN7 und PIN6 je ein Transistor zum multiplexen (Tut 7-Seg 
Anzeige)
an PORTA PIN7 der Schleifer eines 10kOhm Poti (zehngang) (TUT ADC)
interne Aref 5V
zwischen Aref und GND liegen die 10kOhm des Potis
die Wechselfrequenz wird über einen Beitrag "einfache Uhr 1Mhz" erzeugt
alles von "mikrocontroller.net".

In Zukunft werde ich besser Kommentiern und auch auf die Urcodes 
verweisen
(sorry vorher sollte ich den wissen, dass ich das eines Tages Posten 
möchte)

In der Hoffnung, es könnte einem Anfänger hilfreich sein.
Über jede Art von Kritik bin ich Dankbar, am meisten jedoch über 
positive.

Die Schaltung zu zeichen bin ich im Moment zu faul, bzw keine 
unterstützneden Software.

Autor: Harry L. (mysth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..und was soll ich jetzt damit anstellen???

...irritiert mich irgendwie..wo ist da die Innonvation?????

Harry

Autor: ihatestupid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst es so sehen: Dein Taschengeld ist auch nicht innovativ aber zum 
Komasaufen kannst Du es doch ganz gut gebrauchen, oder?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> In der Hoffnung, es könnte einem Anfänger hilfreich sein.

Dann sollte das ordentlich kommentiert sein, und vor allem möglichst 
fehlerfrei, sowohl Code als auch Kommentar.

Das hier:
      for(i = 0 ; i <= 32 ; i++)      // 32 mal den Eingang abfagen 
fragt den Eingang 33 mal ab und summiert eben sooft auf, ssobald der 
Rückgabewert ADCW im Mittel über 993 liegt, gibt's gleich 'nen lustigen 
Überlauf.

Das hier ist Krampf, wie soll denn ein Anfänger wissen was jetzt das 
0xC0 plötzlich soll ?
          ADCSRA = 0xC0;
Das hätte auch gut lesbar als
        ADCSRA |= (1<<ADSC);
geschrieben werden können.

> In Zukunft werde ich besser Kommentiern und auch auf die Urcodes
> verweisen
In Zukunft, warum nicht gleich ?

Du stellst Code in die Codesammlung und bist zu bequem gleich ordentlich 
zu kommentieren ? Ein Fortgeschrittener schreibt das selber besser in 
kürzerer Zeit und einen Anfänger verwirrt's. Also mach's nochmal und 
dann ordentlich.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde dazu raten, das Multiplexen und die AD-Wandlung synchron 
zueinander zu machen. Ansonsten bewirkt der schwankende 
LED-Stromverbrauch zappelnde Messungen bei 10Bit Auflösung.
Bei mir schaltet deshalb der Timerinterrupt die Anzeige aus, startet die 
AD-Wandlung und der ADC-Interrupt gibt die Digits aus:

Beitrag "ADC mit Multiplexanzeige"


Das Multiplexen sollte generell nicht in der Mainloop erfolgen, sondern 
im Interrupt. Ansonsten kann man keine weiteren Tasks mit in den MC 
programmieren, ohne das es flackert.
Der ATmega16 langweilt sich ja tieriesch, wenn er nur ne popelige 
AD-Wandlung machen darf.


Peter

Autor: Martin Sv (sv_martin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald L. schrieb:
> ..und was soll ich jetzt damit anstellen???
>
> ...irritiert mich irgendwie..wo ist da die Innonvation?????
>
> Harry

Inovationen würde ich wohl eher bei einer Institution für 
Inovationsförderung einreichen. BMWi o.Ä.

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein AVR ist eine 8-bit-Architektur. Überall unnötigerweise "int" zu 
verwenden ist grausig.

Das ist typischer Code aus der "Funktioniert, passt" Fraktion und eher 
wenig zum Vorzeigen geeignet.

Sorry...

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

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal ein paar Worte darüber verlieren, was denn der 'adfaktor' 
in deinem Programm macht.
So ganz ist mir nicht klar, was du da damit alles rumrechnest, bzw. 
warum du das überhaupt tust und ob das alles mathematisch überhaupt 
koscher ist (wenn adfaktor nicht zufällig 10, sondern eine andere Zahl 
ist). Zum Teil passieren da auch höchst unlogische Sachen damit. zB
    if ((wechsel == 1) &&  ( value >= adfaktor*10))
    {

      PORTB = 0b10000000; //x80;    // PORTB für den PIN 7 stellen ca. 50ms
      if (value< (adfaktor*10))    // falls eine Zehnerstelle zurückgegen wird
                      // die Berechnung der 50 ms findet ganz unten                         //statt
      PORTD = ne[0];
      zehn (zehner, value, adfaktor);

    }

In den then Teil vom if kommt man nur rein, wenn value >= adfaktor*10 
ist. Wenn aber daher feststeht, dass value größer sein muss, dann kann 
innerhalb des then Teils der Fall, dass value < adfaktor*10 ist, 
überhaupt nicht auftreten.

Der ganze Code kommt mir ausgesprochen überkompliziert vor. Nach 2 
Minuten Source Code Studium würde ich sagen: du hast dich da kräftig 
verrannt.

Autor: Martin Sv (sv_martin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin kein Crack, tu mir eher schwer, die Beiträge aus dem Forum zu 
übertragen, und mit einem Jahr C an der Technikerschule, auch eher am 
Anfang.

Konstate sollten als static deklariert werden wie "adfaktor" eine ist.
(in vielen Beiträgen angeraten von Profis)

Für den angestebten Fall einer korekten Auflösung, wird adfaktor mit 
10,13 belegt, und natürlich die int's geändert, gleitkomma. Da hatte ich 
nur die Aussage static im Kopf. Ist im geposteten Fall unötig oder?

Zitat Michael M. "Funtioniert und passt" stimme ich voll zu,
jedoch sind die Hardcoder unter euch, auch teilweise ungewillt Anfängern 
verstehbare Lösungsansätzte zu geben. (teilweise superschroffe Antworten 
auf Fragen von Newbies) "und wo ist hier die Innovation"

Sicherlich lässt sich der Code straffer und eleganter schreiben, ich 
werde lernen.

An kbuchegg
"In den then Teil vom if kommt man nur rein, wenn value >= adfaktor*10"
stimmt, jetzt wo ich mit der Nase draufgedrückt werde, oh mann, und 
deswegen wird bis Zehn keine 0 vor den Einerstellen erzeugt!! ah.

HA, und ich tu so als ob das für Anfänger wäre, alles nur für mich. 
reiner Egoismus!

Ne, ne, die Motivation war schon, der exemplarische Analogwert durch ein 
Poti simuliert und die Werteausgabe auf eine billige 7-Seg-Anzeige, die 
beiden Tuts verküpfen.   Strg+c, Strg+v und rumspielen

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

Bewertung
0 lesenswert
nicht lesenswert
Martin Sv schrieb:
> Ich bin kein Crack, tu mir eher schwer, die Beiträge aus dem Forum zu
> übertragen, und mit einem Jahr C an der Technikerschule, auch eher am
> Anfang.


Das Problem ist, dass in deinem Code so gut wie keine Linie erkennbar 
ist. Im Groben ist schon noch die Grundidee erkennbar, aber wenn man 
genauer hinschaut, krazt man sich bei dem einen oder anderen Detail 
schon mal den Kopf und fragt sich: Was will uns der Dichter sagen. Es 
sieht zwar aus wie C und ich bin überzeugt davon, dass bei dir auf der 
Anzeige auch das tut was du erwartest. Aber so richtig nachvollziehbar 
ist das im Code nicht. Man hat eher den Eindruck, dass symbolisch 
gesprochen, da ein paar Heftpflaster aufgeklebt wurden um irgendwelche 
Lecks abzudichten.

> Sicherlich lässt sich der Code straffer und eleganter schreiben, ich
> werde lernen.

Schreib ihn zuallererst 'einfach'!
Das ist am Anfang das Wichtigste. Code muss verständlich sein. Meistens 
wird er dadurch ganz von alleine 'elegant' (was immer man darunter auch 
verstehen will) und erhält eine Straffheit, die angemessen ist. Zu 
straff ist auch wieder nichts.


> Ne, ne, die Motivation war schon, der exemplarische Analogwert durch ein
> Poti simuliert und die Werteausgabe auf eine billige 7-Seg-Anzeige, die
> beiden Tuts verküpfen.   Strg+c, Strg+v und rumspielen

Copy&Paste ist zwar eine Möglichkeit um Codeteile zusammenzufügen. Aber 
gerade am Anfang ist es vernünftiger, aus Beispielcode die Idee zu 
extrahieren und diese Ideen zusammenzufügen und in neuen Code zu 
giessen.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin,

vorzeigbare Beispiele wie in der Codesammlung sollten dem Anfänger es 
richtig zeigen. Solltest Du als Anfänger es noch nicht so recht wissen, 
so ist es nur dann eine gute Idee solchen Code zu posten, wenn dieser 
Code den Neuanfänger in die richtige Richtung weist.

Dein Code ist aber nicht nur fehlerhaft, er ist ein Verhau. Das ist 
etwas, was man selbst sicher selbst auch mal zu Beginn gemacht hat, aber 
das ist nichts, was man als Beispiel zeigen sollte.

Autor: Dr.PillePalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'Sonntag' der Tag der Selbstdarstellung ,so ein Mist ich hab nichts ...

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

Bewertung
0 lesenswert
nicht lesenswert
Vergleich mal deine Lösung mit der hier


Was mir auch noch aufgefallen ist.
Kommentare wie der hier
  ADMUX = (0<<REFS1) | (1<<REFS0);    //DIe belegung der nötigen Register 
sind 0-Kommentare. Das hier ein Register belegt wird, ist schon aus dem
Code klar. Die Frage ist nur: Was macht diese Belegung?

Du hast noch viele andere Kommentare, die sinnlos sind. Aus einem 
Kommentar soll hervorgehen: Warum wird etwas gemacht, was ist der Zweck 
der Übung.

Autor: Martin Sv (sv_martin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Vergleich mal deine Lösung mit der hier

Genau die Art, wie ich mir bis vor Kurzem ein Forum vorgestellt habe.
Herzlichen Dank für die Konstruktive Kritik.

Verwunderliche Beiträge wurden gebracht.

Ich schließe mich der Aussage von Dr. PillePalle voll und ganz an.

Wofür die Leute so alles Zeit finden?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wofür die Leute so alles Zeit finden?

Z.B. verwunderlichen Code durchschauen, auf Fehler und 
Unzulänglichkeiten hinweisen, und des Autors Ignoranz zu erkennen ?

Es ist in der Tat merkwürdig, wofür die Leute so alles Zeit finden.

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.