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!!!!
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
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
Die werte sind urspruenglich drin habe sie ausversehn nicht mitgepostet! Vielen Dank fuers drueberschauen!
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...
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.
Er hat wohl etwas länger als wir benötigt :-) Nix für Ungut! Gruß Andi
Damit meinte ich, dass ich zu langsam war und mir einige Antworter zuvor gekommen sind, ich also das ansprach, was schon gesagt wurde...
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?
@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
@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
http://www.mikrocontroller.net/forum/read-1-126776.html#new hier gehts weiter. wollte wohl unbedingt nochmal einen beitrag starten....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.