Forum: Mikrocontroller und Digitale Elektronik ADC ATmega16


von JENS (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Der Analog/Digtal Wandler meines ATmega16 ärgert mich. Vielleicht hat
ja jemand eine Idee, warum er mich so ärgert.
Ich will über ein entsprechenden Port des A/D Wandler ADC0...ADC7 eine
Gleichspannung zwischen 0...5V anlegen und dann wandeln. Habe mir dafür
ADC0 ausgesucht, habe an diesen zur Sicherheit noch einen Pull-Down
Widerstand gegenüber Masse angeschlossen. An AVcc habe ich 5 Volt
angelegt damit der Wandler seine Spannung bekommt (Ref.Spannung).
Habe dann ein tolles Programm geschrieben was im Dateianhang ist, laut
meinems Programms bekommt der DAC des ADCs eine Referenzspannung von 5
Volt(laut ADMUX). Ich Teile die Ozsilator-Freguenz und simuliere über
JTAG ICE das Programm und bekomme so richtig blöde binäre Werte, mal
keinen mal halt ein so blöden.
Die nicht mit meinem Eingangswert am ADC0 zu tun haben,wenn ich sie
umrechne. Woran habe ich nicht gedacht?

Jens

von Unbekannter (Gast)


Lesenswert?

Hallo!

Kenn mich auch nicht so gut aus, aber Du könntest statt jmp mal rjmp
probieren.

von Aleksej (Gast)


Lesenswert?

Du sollst doch abwarten, bis ADC es schafft ein Ergebnis zu kriegen, das
geht ja nicht im Moment. Du hast noch dazu eine niedrige Frequenz
ausgewaehlt (XXXXX110 - division factor 64).
Deshalb ist ja noetig, dass du abwartest bis ADIF mal 1 wird.
Und in diesem Fall ist ja auch sinnvoll Free Running Select zu
aktivieren, schaetze ich...

von Der Anzinker (Gast)


Lesenswert?

klasse vorschlag "unbekannter"

von Hannes L. (hannes)


Lesenswert?

Jens, schau dir doch erstmal Programme anderer ASM-Programmierer an, die
auf ADC zugreifen.

Das JMP in der (nicht vorhandenen) Sprungtabelle ist schon richtig, das
andere darf auch ein RJMP sein, ist aber so nicht falsch. Das hat mit
der Größe des Flash-Adressraums zu tun, ab 16KB sind für die Vektoren 2
Adressen (2 Worte, 4 Bytes) reserviert weil RJMP nur eine begrenzte
Reichweite hat und JMP zwei Worte benötigt.

Ansonsten ist dieses Programm ein gutes Beispiel dafür, wie man es
nicht macht (kein Grundtakt mittels Timer, kein Stackinit, keine bzw.
unsinnige Kommentare...). Also schau erstmal, wie es andere machen und
fang dann nochmal an.

...

von A-trox (Gast)


Lesenswert?

Das war aber nicht die Antwort auf die Frage Hannes. Es tut mir leid
wenn du dich nur gern mit Deinesgleichen unterhälst. Aber auch du bist
nicht mit dem Wissen von heute geboren worden. Das solltet du  dir mal
vor Augen halten und dann vielleicht noch einmal nachdenken.
Also Merke: "Vor Inbetriebnahme des Mundwerks Hirn einschalten !!!"
-> sollte auch im Raum Magdeburg gelten.


To Jens:

Leider kann ich dir mit diesem Problem nicht weiterhelfen - Assembler
ist nicht meine Stärke. Ich hoffe aber trotzdem das sich hier
irgendjemand findet, der dir auch ohne "fachgerechte Kommentierung"
(eines richtigen Pogrammieres) des Files weiterhelfen kann.

von Hannes L. (hannes)


Lesenswert?

@A-trox:

Danke für die Blumen...
Das geht da aber dito, denn du hast außer unsachlichen Beschimpfungen
auch nichts zum Thema beigetragen.

Die angefangene Art des Programms führt in eine Sackgasse. Das stimmt
hinten und vorne nicht. Es ist nicht damit getan, einige
"vermeintliche Fehler" zu nennen, da gehört ein anderes Konzept her.
Da dieses Thema hier schon öfters lief, sind auch einige Beispiele (mit
Code) vorhanden. Man könnte z.B. mal in der Codesammlung beginnen, sich
Programme anderer Leute (und die Reaktionen darauf) anzuschaun.

Nein, ich bin nicht mit dem (wenigen) Wissen von heute geboren worden.
Vielmehr habe ich mir dieses Wissen durch mühevolles Lernen von
Grundlagen angeeignet und habe nicht in irgendwelchen Foren nur
irgendwelche Schlagworte und Tricks zusammengefragt.

Ich bin gern bereit zu helfen, indem ich konkrete Fragen beantworte. Es
kann aber nicht von mir verlangt werden, dass ich ein komplettes
persönliches Tutorial schreibe, nur weil der Hilfesuchende keine Lust
hat, mal über den Gartenzaun zu schaun.

Übrigens denke ich, dass ich schon damit geholfen habe, dass ich auf
einige fehlende Dinge hingewiesen habe.
Leider habe ich im Moment kein konkretes Beispiel für ADC und Mega16
fertig, sonst hätte ich es zur Verfügung gestellt.

Die einfachste Möglichkeit, auf ADC zuzugreifen, wäre folgende:

- ADC im Freerun-Mode starten, dabei in Abhängigkeit vom
  Controllertakt einen Vorteiler einstellen, der einen ADC-
  Eingangstakt von 50kHz...200kHz ermöglicht.
- ADC-Quelle mit ADMUX einstellen
- ADC Zeit zum Wandeln lassen
- ADC auslesen (in reg1,adcl in reg2,adch) und verarbeiten
- neue Messquelle in ADMUX einstellen
- ADC Zeit zum wandeln lassen
- ADC auslesen und verarbeiten...

Man könnte mit einer Warteschleife die Wartezeit erzeugen, aber das ist
die schlechteste Lösung.

Man kann in einer Schleife das Bit ADIF in ADCSRA abfragen (Datenblatt
Mega16 Seite 217), bis es gesetzt ist und erst dann die Werte auslesen,
diese Lösung ist aber nicht gut, weil des gesamte Programmablauf ins
Stocken gerät, falls der Mega16 später mal mehr machen soll.

Nun kann man das ADIF-Flag zum Auslösen eines Interrupts nutzen. Das
erfordert aber das Einhalten einiger wichtiger Regeln.
- Interrupt-Vektor-Tabelle anlegen
- Stackpointer initialisieren
- Programm in Reset-Routine, Mainloop und ISR aufteilen

Man kann auch einen Timer so programmieren, dass er in regelmäßigen
Abständen (z.B. 10ms) einen Interrupt auslöst. Das Auslesen des ADC
geschieht dann neben anderen Dingen ganz nebenbei in der Timer-ISR.
Auch hier sind die genannten Regeln einzuhalten. Übrigens kommt keines
meiner Programme ohne diesen Timer-Interrupt aus. Ich halte das für den
Anfang für die beste Lösung.

...

von JENS (Gast)


Lesenswert?

Danke! für euere Beiträge und auch ein Danke an A-trox,für die
unterstutzenden Worte!

Das Programm was ich hinterlegt habe ist ein Teil eines großeren
Programms.

Danke für den Hinweis mit "jum und rjump" die Thematik ist mir
bekannt, zwecks der Wortgröße.
Weiter an den Schlauberger HanneS, der so tolle Wort von sich gibt; Den
Stackp. habe ich schon am Anfang meines großen Programm initialisiert.
Das mit dem Free Running habe ich mir auch schon überlegt aber habe's
verworfen Aufgrund der Stuktur des Progammes und zusatzlich spare ich
Energie wenn ich den Wandler ausschalte. Nicht war!Ist hier im
Test-Proramm nicht zu sehen.
Ich teile meine Takt-Frequenz die etwa bei 8MHz liegt, mit einem Teiler
von 64, so komme ich bei etwa 125kHz raus, was ja zwischen 50 und 200
kHz liegt, zwecks genauer Werte. Der Teiler wird ins ADSCRA Register
geladen. Guck's du!Im ADMUX Register werden die Eingänge für den ADC
festgelegt und die Ref. Spannung für Digital/Analog Wandler des
ADC's.Guck's Du!
Und eine Schleife du Schlauberger ist im Testprogramm enthalten, wieder
Guck's Du, denn wenn der ADC gestartet wird ist das Bit ADSC so lange
gesetzt bis die Wandlung abgeschlossen ist und wird dann auf Null
gestetzt, meines Wissen. Mir ist auch bekannt das die Daten wenn sie
bereit gestellt sind im ADCL & ADCH, dass Bit ADIF gestetzt wird.
Und diese Schleife ist für jemand der sich auskennt auch ohne Kommentar
zusehen. Was mich nun zu den vermissten Kommentaren kommen lässt, die
habe ich bewusst nicht mit aufgeführt. Ist eine Fehler im Programm,
verwirrt dann auch fehlerhafter Kommentar,dachte ich mir! Wie man sieht
ist Hirn eingeschalten und das gebe ich jetzt gern weiter, denn wär was
drauf hat könnte sich so was denken. Oder zu mindestens Fehler
erkennen, wenn sie dann da sind!
Ich bin jedoch immer für konstruktive Lösung und Vorschläge offen.Und
Hirn ist eingeschaltet.

Jens

PS.: Auch und wo ich Schleife in Anführungstriche hin geschrieben habe
ist eine Zählerschleife für das Auslesen der Daten an den Ports
gedacht, zum Test. Die habe ich nicht mit rein geschrieben. Und das
Programm ist nur ein Testprogramm was in das große Programm ein gefügt
ist, aber ohne Zählerscheife und Rücksprung siehe vorletzte Zeile.

von Läubi (Gast)


Lesenswert?

a) Wenn du alle Informationengenannt hättest hätte man auch sinnvoll
antworten können
b) sinkt die hilfsbereitschaft wenn man Leute als Schlauberger
bezeichnet
c) Wenn du alles so gut und richtig gemacht hast muß es ja gehen
d) war von Energiesparen überhaupt keine rede

Ich habe es bei meinem Mega16 mit dem ADC und Interrupt gemacht, das
geht auch ohne Probleme, villeicht leigt das problem auch viel tiefer
in deinem Programm das kann (und will jezt warscheinlich auch niemand
mehr) aus einem zusammengestückelten Fragment (Was nichtmal als solches
gekennzeichnet ist) rauslesen.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Nunja, bei mir Schlauberger funktioniert's...

Ich konnte übrigens nur auf die im ersten Posting genannten
Informationen reagieren. Wenn du da Informationen zurück hältst, dann
ist das nicht mein Problem. Mach weiter so...

...

von JENS (Gast)


Lesenswert?

Also gut das sieht er ein zwecks der wenigen Info's, aber ein Roman
wollte ich nicht schreiben. Das dachte ich mal setzte ich voraus. Jetzt
weis er's.

An Läubi: Du hast recht. Aber wenn ich in den Antworten lese, das man
Hirn einschalten soll, also ich. Dann ist für mich Großkotzigkeit und
dann reagiert ich halt giftig. Entweder ich antworte ordentlich oder
ich lass es. Dann ist der HanneS halt ein Schaulberger ----> nicht war
Schlaubberger HanneS.

HanneS oder doch Schlauberger? Schön das es bei Dir funktioniert, freue
ich mich.

Ich schau mir morgen nochmal das ganze an, vielleicht sieht ich ja den
Wald vor lauter Bäumen nicht mehr.

Jens

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Hallo großer JENS...

Schau dir lieber nochmal an, wer was geschrieben hat.

Das mit dem Hirn einschalten ist nicht von mir, ist nicht meine Art.

Trotzdem beschimpfst du mich dafür. Aber vermutlich beschimpfst du mich
ja garnicht, das scheint wohl dein normaler Umgangston zu sein. Damit
wirst du es vermutlich sehr weit bringen. Mach weiter so...

Kannst aber ruhig glauben, dass es funktioniert, siehe Anhang...

...

von Pete da Heat (Gast)


Lesenswert?

>>Das war aber nicht die Antwort auf die Frage Hannes. Es tut mir leid
>>wenn du dich nur gern mit Deinesgleichen unterhälst.
Du solltest mal noch ein paar andere Posts hier lesen, dann wirst Du
feststellen, dass Hannes auch den Anfängern hilft und sich keinesfalls
"zu schade" ist.

>>Aber auch du bist nicht mit dem Wissen von heute geboren worden.
>>Das solltet du dir mal vor Augen halten und dann vielleicht noch
>>einmal nachdenken.
Ich kann nur sagen, hierfür gilt noch einmal genau das Gleiche wie
schon ein paar Zeilen weiter oben geschrieben.

>>Also Merke: "Vor Inbetriebnahme des Mundwerks Hirn einschalten
!!!"
Tja, wer im Glashaus sitzt...lieber selber mal die 3 Zellen
aktivieren...

von Läubi (Gast)


Lesenswert?

@Hannes wie machst du HEX mit normalen 7 seg anzeigen? Ich mein bei B
und D hat man doch das problem das man nicht weis obs nicht ne 0 oder 8
sein soll oder? (fällt mir grad auf dem Bild auf) :)

von Hannes L. (hannes)


Lesenswert?

@Läubi:

Das Platinchen mit der Anzeige ist schon sehr alt. Die Teile (außer
Lochrasterplatine und (nicht benutzte) Anschlussbuchse) stammen noch
aus DDR-Zeit. Und somit auch die Decoder-ICs V40511. Und die decodieren
nunmal ordentliche (eindeutige!) HEX-Zeichen. (Es war nicht alles
schlecht...)

Jetzt zu AVR-Zeiten habe ich mich an das Teil erinnert und ein
Flachbandkabel mit 10-poliger Pfostenbuchse angelötet, somit geht das
Teil als "Zusatzgerät" für das STK500. ;-)

b und d werden übrigens als Kleinbuchstaben angezeigt, bei der 6 wird
der obere Balken mit angezeigt, als Unterschied zum b.

...

von Läubi (Gast)


Lesenswert?

Ah klar das ist garnichtmal so doof, werd ich mir mal merken, das mit
den kleinbuschstaben und dem Strich für die 6 dan paßt es ja wunderbar,
vielen Dank :)

von Rahul (Gast)


Lesenswert?

@Hannes: Na, einen vernünftigen Binär zu Hex-Decoder hatten "wir"
damals auch schon...
Die runden Dinger links sind deine 8 Poti?
Bei mir sehen die Aufbauten auch alle so ähnlich aus... der
"Baukasten" wächst auch regelmässig (verschiedene Tastaturen,
Anzeigen und Schrittmotor-Treiber...)
Nimm dir die unqualifizierten Kommentare irgendwelcher Leute, die "mal
auf die Schnelle" irgendwas zusammenbauen wollen nicht zu herzen
(Machst du eh nicht, so wie ich dich kenne).

Manchen Leuten würde ich den Link hier empfehlen:
http://www.atmel.com/dyn/resources/prod_documents/novice.pdf

von Aleksej (Gast)


Lesenswert?

Wozu fragt er ueberhaupt, wenn er keine normale Loesung sieht und nur
Beschimpfungen ernst nimmt?
Manchmal tut mir echt leid, dass ich meine Zeit fuer die Menschen
dieser Art verschwende...

von Rahul (Gast)


Lesenswert?

Vielleicht muß man ihm die Lösung auch einprügeln... wenn er drauf
steht...

von Hannes L. (hannes)


Lesenswert?

> Na, einen vernünftigen Binär zu Hex-Decoder hatten "wir"
> damals auch schon...

Ja sicher, nur war es sehr schwierig, den 4311 zu bekommen. Ist aber
egal, heute würde ich so eine Anzeige mit AVR aufbauen, und das, wozu
sie genutzt werden soll, gleich mit rein...

> Die runden Dinger links sind deine 8 Poti?

Nicht ganz, die Trimmpotis (RT 10) sind darunter. Die runden Dinger
sind zu Drehknöpfen umfunktionierte (alte) Kanülenhalter meiner
Insulinspritze. ;-)

> Nimm dir die unqualifizierten Kommentare irgendwelcher Leute,
> die "mal
> auf die Schnelle" irgendwas zusammenbauen wollen nicht zu herzen
> (Machst du eh nicht, so wie ich dich kenne).

Neee, beim besten Willen nicht... Die machen sich doch nur lächerlich.
Sind scheinbar neidisch, dass Andere mehr Wissen haben (mir ist aber
bewusst, dass ich verdammt wenig weiß). Dabei könnten sie das ganz
schnell ändern, indem sie etwas lernen würden.
(Grund-) Wissen kann man nunmal nicht kaufen, da muss man selbst etwas
tun. Und das ist gut so!

> Wozu fragt er ueberhaupt, wenn er keine normale Loesung sieht und
> nur Beschimpfungen ernst nimmt?

Nunja, er "arbeitet" mit JTAG und kann zum Wochenende nicht darüber
verfügen. Also ist es Ausbildung oder Beruf, jedenfalls kein Hobby. Da
hätte man eigentlich nur mit einem Link auf www.hausaufgaben.de
antworten dürfen. ;-) Aber was soll's, Leute,die fremdes (geistiges)
Eigentum vermarkten, wird es immer geben. Das ganze System baut
schließlich darauf auf...

...

von JENS (Gast)


Lesenswert?

Danke HanneS für die Größe!

Aber so groß bin ich nicht.
Scheiße da habe ich mich bei den Antworten, woll etwas verlesen --->
Schuldigung wegen dem Hirn einschalten.
Aber die Antwort, die du dem A-trox gegeben hast, fand ich halt so von
oben herab. Dabei ging's ja auch um mein Problem.

Aber ich habe wieter so gemacht..........und der A/D läuft jetzt; fast
so wie ich's will. Ich mach wieter so....... nicht war :-).

JENS

von Hannes L. (hannes)


Lesenswert?

> Danke HanneS für die Größe!

Nunja, die Größe bezog sich nur auf die Schreibweise deines Namens. Bei
mir ist ja nur Anfang und (dickes) Ende groß, bei dir aber alles... ;-)

> Aber die Antwort, die du dem A-trox gegeben hast, fand ich halt so
> von oben herab. Dabei ging's ja auch um mein Problem.

Diese Antwort hat er aber selbst provoziert. kann selbst nix zur Lösung
des Problems beitragen, kann nur andere Leute beschimpfen.

Und mal ehrlich, bei dem Code, den du uns im ersten Posting vorgesetzt
hast, konntest du auch keine andere Reaktion erwarten.

> Also gut das sieht er ein zwecks der wenigen Info's, aber ein Roman
> wollte ich nicht schreiben. Das dachte ich mal setzte ich voraus.
> Jetzt weis er's.

Wer soll was einsehen? Ich etwa? Wenn ja, dann hast du sicher etwas
verwechselt.
- Nicht ich bat um Hilfe, sondern du.
- Nicht ich sorgte durch Code, der nicht den Tatsachen entspricht,
  für Missverständnisse, sondern du.
- Nicht ich bin frech geworden, sondern A-Trox und du.
- Nicht ich habe Anderen unwahre Aussagen unterstellt, sondern du.

Also wenn hier einer etwas einsehen müsste, dann bin ich das mit
Sicherheit nicht.

Übrigens hätte dein letzter Beitrag auch einmal gereicht,..

...

von JENS (Gast)


Lesenswert?

An HanneS!

Nein Da hast du was falsch verstanden, die Einsicht ist auf meiner
Seite nach dem lesen der gewissen Antworten und Fragen. Die Größe hab
ich schon, wenn was nicht Ok ist, dass ich es einzusehe.

JENS

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.