www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik bitte code ueberpruefen!!!!!


Autor: Tony (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
So ich habe mir nun einen code zusammengewurschtelt, der einen analogen
wert einliest diesem dann einen anderen wert zuweist und das ganze an
den Leds anzeigt.
Bin ein absoluter Beginner und wuerde mich freuen wenn mir jemand
Verbesserungsvorschlaege liefern koennte.
Wenn waere es nett, dass ihr es mir so erklaert, dass ich es auch
verstehe!!!!
Vielen Dank im vorraus!!!!

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst bei den megas einstellen, das der adc wert left-aligned ist.
d.h der oberen 8bit sind dann im adch. das bit ist im admux und heisst

adlar. dann kannst du dir das ror sparen

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hiermit willst Du anscheinend den ADC-Wert von max. 1024 auf 256
mögliche Werte Teilen:
 ror highByte
 ror lowByte
 ror highByte
 ror lowByte

Kann sein, dass das manchmal nicht gut geht, da mit ror das Carry-Bit
nach dem rechts schieben an Bit 7 kopiert wird.
Und je nach dem was vorher gerechnet wurde, ist das Carry-Bit gesetzt
oder nicht gesetzt.
Besser wäre:
 lsr highByte    ;rechts schieben ohne Carry-Bit. Bit 7=0.
 ror lowByte
 lsr highByte    ;rechts schieben ohne Carry-Bit. Bit 7=0.
 ror lowByte

Ansonsten kannst Du Dir das auslesen von High- und Low-Byte sparen,
wenn Du das ADLAR-Bit im ADCRS-Register setzt.
Dadurch ist das ADC-Ergebnis "left adjusted", also so zu sagen
linksbündig angeordnet und die Bits 2 bis 9 des ADC-Wertes sind im
high-Byte.
Alles weitere über ADLAR steht im PDF.
Desweiteren könntest Du den armen Mega8 mit Sleep in den Idle-Mode
schicken anstatt ihn ständig durch prüfen von ADIF totlaufen zu
lassen.
Wenn ein ADC-Scan fertig ist, kommt der Mega8 wieder aus dem Idle-Mode
raus.
Auch das, konfigurieren des Sleep-Modes, findest Du im PDF des Mega8.
Ach ja: Fehlen in Deiner DB-Tabelle nicht die Werte für ADC 0, 1 und
252 bis 255?

Gruß
Andi

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...meinte natürlich auch ADLAR-Bit in Register ADMUX!

Gruß
Andi

Autor: Tony (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die werte sind urspruenglich drin habe sie ausversehn nicht
mitgepostet!
Vielen Dank fuers drueberschauen!

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Ist etwas kompliziert (lässt sich vereinfachen), könnte aber gehen (bin
aber noch nicht komplett durch)...

Erstmal finde ich es gut, dass du mit symbolischen Bezeichnungen für
I/O-Register und deren Bits arbeitest.

r1 soll den Wert 0 haben, damit man durch ADC (Addition mit Carry) den
Übertrag berechnen kann. Am besten r1 "null" nennen (.def null=r1),
in der Reset-Routine auf 0 setzen (clr null) und dann verwenden (adc
yh,null). Damit ist "null" immer 0 und kann auch von anderen
Programmteilen genutzt werden... Übrigens kommt mir die Initialisierung
des ADCSR irgendwie bekannt vor... ;-)

Du nutzt nur 8 Bit, liest aber beide Bytes ein. Das ist beim Mega8
nicht erforderlich. Wenn du ADLAR in ADMUX setzt, wird das Ergebnis
linksbündig ausgegeben. In ADCH stehen dann die oberen 8 Bit, in ADCL
die unteren 2. Damit brauch nur ADCH ausgelesen werden und die Rotation
entfällt.

Du hast nur eine ADC-Quelle. Somit stammt der "alte Wert" von der
selben Quelle. Es ist daher nicht erforderlich auf einen "neuen Wert"
zu warten. Die Manipulation am ADC-Interrupt-Flag sollte man möglichst
der Hardware überlassen. Es wird per Hardware gesetzt (Messung fertig)
und per Hardware gelöscht (Interrupt aufgerufen). Natürlich macht das
nur Sinn, wenn man ADC per Interrupt nutzt.

Du liest mit LPM den Tabellenwert (aus Flash) in r0, um ihn dann nach
r16 zu kopieren. Beim Mega8 ist es möglich, bei LPM das Zielregister
anzugeben. Schau mal in die Hilfe des AVR-Studio. Am besten mal den
Cursor (im Quelltext) auf den Befehl "lpm" stellen und F1-Taste
drücken.

Deine Tabelle stimmt nicht. Du hast nur 250 Werte, brauchst aber 256,
denn dein ADC-Byte kann 256 Zustände haben (0...255). Ob man die als
1...256 oder 0...255 sieht, ist Ansichtsache, beim Wandeln eines
Zahlenwertes (ADC-Byte) in einen anderen (Tabellenwert) bietet sich die
Zählweise 0...255 an, sie ist aufgrund der Übereinstimmung mit dem
Zahlenwert übersichtlicher. Das .cseg vor der Tabelle ist nicht
erforderlich, da dein Programm komplett im Codesegment liegt und weder
Datensegment noch EEPROMsegment vorhanden sind.

Wie oben gesagt, nicht hundertprozentig getestet, nur mal grob
überflogen und Auffälliges "kritisiert". Aber das wolltest du ja. Ich
wäre froh gewesen, wenn das bei mir jemand gemacht hätte...

...HanneS...

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups... 8-D

Autor: Tony (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Hannes!
Was meinst Du mit ups 8-D?
Ist irgendetwas total schief gelaufen?
Bin froh, dass ich es mit deiner hilfe ueberhaupt so weit geschafft
habe.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat wohl etwas länger als wir benötigt :-)
Nix für Ungut!

Gruß
Andi

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit meinte ich, dass ich zu langsam war und mir einige Antworter zuvor
gekommen sind, ich also das ansprach, was schon gesagt wurde...

Autor: Tony (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo habt ihr eigentlich euer ganzes wissen her! Irgendwie weissich noch
gar nicht wo ich so schauen soll ausser dem tutorial.Die Hilfe kann ich
jetzt gottseidank dank hannes Hilfe mit f1 benutzen.
Frage: was benutzt ihr sonst noch so?

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes: Das mit dem Register r1 als "Null-Register" sollte man bei
den ATMegas nicht machen.
Wenn, dann mit einem Register r2 bis r15 da in Register r0 und r1 nach
den Befehlen mul/s/u und fmul/s/u das Ergebnis einer Multiplikation in
r0 (low-byte) und r1 (high-byte) zu finden ist.
Wenn man mit einem ATMega diese schönen mul-Befehle nicht verwendet,
ist das natürlich egal.

Gruß
Andi

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tony: Ich habe mit 15 einfach mal mit einem ZX81 (Bausatz) angefangen.
Das war vor 20 Jahren.
oberklug an
Die Zeit bringt das Wissen mit sich!
oberklug aus
g

Man kann nicht von heut auf morgen irgend was komplexeres als Radfahren
"beherschen".

Gruß
Andi

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/forum/read-1-126776.html#new

hier gehts weiter. wollte wohl unbedingt nochmal einen beitrag
starten....

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

@Andi: Stimmt, muss ich mir abgewöhnen, hatte ich mir bei den Classics
angewöhnt (1200, 2313, 4433). Mit Hardware multipliziert habe ich noch
nicht, kommt aber sicher noch.

@Tony: F1-Taste klappt leider nur bei ASM-Befehlen. Bei Direktiven
(.cseg, .db...) klappt das nicht, da musst du dich über das Menü
"Hilfe, Tools, AVR-Assembler..." ranpirschen. Steht auch mehr drin
als ich erwartet habe...

Woher das Wissen? - Eigentlich weiß ich verdammt wenig. Habe vor über
35 Jahren mal Elektri(n)ker gelernt (aber aus gesundheitlichen Gründen
nicht lange im Beruf gearbeitet), mich vor 15 Jahren mal mit dem
Commodore Plus/4 beschäftigt (Hardware und Software in BASIC und
Assembler), dann mit dem PC. Auch mit 8085 (MFA) hatte ich mich etwas
beschäftigt. Mit AVRs (zuerst AT90S1200) befasse ich mich noch nicht
allzu lange, vorerst auch nur Assembler, bei anderen Mikrocontrollern
weiß ich garnix. Das Elektronik-Grundwissen stammt hauptsächlich aus
der DDR-Amateur-Literatur, dir gut und billig war. Das AVR-Wissen
stammt aus den Datenblättern, Appnotes und vorrangig von diesem Forum
hier. Ich fand hier schon viele Antworten auf Fragen, die ich noch
garnicht gestellt hatte.

...HanneS...

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.