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


von Martin S. (sv_martin)


Angehängte Dateien:

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.

von Harry L. (mysth)


Lesenswert?

..und was soll ich jetzt damit anstellen???

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

Harry

von ihatestupid (Gast)


Lesenswert?

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

von MWS (Gast)


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:
1
      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 ?
1
          ADCSRA = 0xC0;
Das hätte auch gut lesbar als
1
        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.

von Peter D. (peda)


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

von Martin S. (sv_martin)


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.Ä.

von Michael M. (Gast)


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...

von Karl H. (kbuchegg)


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
1
    if ((wechsel == 1) &&  ( value >= adfaktor*10))
2
    {
3
4
      PORTB = 0b10000000; //x80;    // PORTB für den PIN 7 stellen ca. 50ms
5
      if (value< (adfaktor*10))    // falls eine Zehnerstelle zurückgegen wird
6
                      // die Berechnung der 50 ms findet ganz unten                         //statt
7
      PORTD = ne[0];
8
      zehn (zehner, value, adfaktor);
9
10
    }

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.

von Martin S. (sv_martin)


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

von Karl H. (kbuchegg)


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.

von MWS (Gast)


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.

von Dr.PillePalle (Gast)


Lesenswert?

'Sonntag' der Tag der Selbstdarstellung ,so ein Mist ich hab nichts ...

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Vergleich mal deine Lösung mit der hier


Was mir auch noch aufgefallen ist.
Kommentare wie der hier
1
  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.

von Martin S. (sv_martin)


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?

von MWS (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.