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


von Tony (Gast)


Angehängte Dateien:

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

von Tobi (Gast)


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

von Andi (Gast)


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

von Andi (Gast)


Lesenswert?

...meinte natürlich auch ADLAR-Bit in Register ADMUX!

Gruß
Andi

von Tony (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


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

von ...HanneS... (Gast)


Lesenswert?

Ups... 8-D

von Tony (Gast)


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.

von Andi (Gast)


Lesenswert?

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

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

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

von Tony (Gast)


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?

von Andi (Gast)


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

von Andi (Gast)


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

von Tobi (Gast)


Lesenswert?

http://www.mikrocontroller.net/forum/read-1-126776.html#new

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

von ...HanneS... (Gast)


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

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.