Code:
****************** 1***************************
> Was Assembler befehle angeht bin ich leider völliger neuling....
Es geht nicht um Assembler-Befehle, es geht um das Benutzen des
System-Register ADMUX, ADCSRA, ADCSRB, ADCL und ADCH, ferner auch noch
DIDR0.
Das sind nämlich die Schnittstellen zum ADC, in denen einzelne Bits
bestimmte Schalterwirkung haben, andere Bitgruppen Zahlen
repräsentieren. Um das zu verstehen, brauchst Du kein ASM zu lernen
(obwohl das keinesfalls schaden würde), sondern nur im Datenblatt die
Funktion des ADC und besonders seiner (oben aufgezählten) Register
nachzulesen (und zu verstehen).
Bascom bietet zwar die Funktion GETADC(), die taugt aber im Alltag nix,
da sie zuviel Zeit vertrödelt. Denn sie muss:
- den zu messenden Kanal einschalten (Kanalnummer und Referenzquellen-
Nummer in ADMUX schreiben)
- den ADC starten (ADEN und ADSC im Steuerregister ADCSRA setzen, sowie
den Vorteiler in ADCSRA einstellen)
- warten, bis das Bit ADIF in ADCSRA gesetzt ist, was das vereinbarte
Zeichen ist, dass der ADC fertig ist und ein Ergebnis hat
- das Ergebnis aus ADCL und ADCH auslesen und dem aufrufenden Programm
zurückgeben.
Das Problem dabei ist, dass die Programmabarbeitung solange warten muss,
bis das Ergebnis vorliegt, das ist nunmal bei "Funktionsaufruf" so. Es
verlangt aber keiner, dass Du diese Funktion benutzt. Stattdessen kannst
Du die Handgriffe selbst in Programmcode formulieren und zur rechten
Zeit ausführen.
Angenommen, Du brauchst nur einen ADC-Eingang 8-bittig zu messen. Dann
schreibst Du Die Mess-Quelle schon bei der Initialisierung in ADMUX. Im
Register ADMUX findest Du (beim Mega644) 2 REFS-Bits, 5 MUX-Bits und das
Bit ADLAR. Die REFS-Bits bestimmen die Referenzspannungsauswahl, siehe
Tabelle 21-3 des Datenblatts. ADLAR bestimmt die Ausrichtung des
Resultats, bei gesetztem Bit wird linksbündig ausgerichtet, die oberen 8
Bits stehen dann in ADCH, was das Auslesen des 8-Bit-Messwertes
erleichtert und beschleunigt (der ADC misst aber trotzdem 10-bittig, die
unteren 2 Bit liegen dann in ADCL und verfaulen, weil sie keiner
abholt). Mit den MUX-Bits wird angegeben, welcher Kanal gemessen werden
soll, siehe Tabelle 21-4 des Datenblatts. Du baust Dir nun das
gewünschte Bitmuster zusammen und schreibst es in ADMUX. Das erfordert
keinerlei missverständlichen CONFIG-Kram, sondern nur eine einfache
Zuweisung. Da Bascom leider nur die Registernamen kennt, nicht aber die
Bitnamen, musst Du auf die symbolischen Bitnamen verzichten und das
Bitmuster numerisch angeben (was den Code gegenüber ASM oder C
unübersichtlich macht und oftmals Protest aus der C-Liga bewirkt...).
ADC0 gegen AVcc 8-Bittig gemessen ergibt dann folgende Initialisierung
für ADMUX:
ADMUX = &b01100001
^^^^^--- Mess-Quelle 0 laut Tabelle 21-4
^-------- linksbündige Ausgabe (ADLAR)
^^--------- AVcc als Referenz laut Tabelle 21-3
Du hast also mit einer einzigen Zuweisung Referenz, Kanal und Format
eingestellt. Ist das nicht viel eindeutiger als das Config-Geraffel?
Ebenso gehst Du mit ADCSRA vor, das enthält den Vorteiler und weitere
Bits zum Schalten und Steuern. Mit einer Zuweisung konfigurierst und
startest Du den ADC. Wird nur eine Quelle gemessen, dann lohnt sich der
Freerun-Mode, also das Setzen von ADATE (heißt bei älteren AVRs ADFR),
dann klappert der ADC nach dem Starten im Hintergrund vor sich hin und
kann irgendwann mal nebenher ausgelresen werden, ohne dass das Programm
dabei warten muss. Für ADC0 gegen AVcc 8-Bittig gemessen ergibt dann
folgende Initialisierung für ADCRSA:
ADCSRA = &b11100110
^^^--- Vorteiler 64 (Tabelle 21-5)
^------ kein Interrupt aktivieren
^------- Interrupt-Flag ist hier nicht relevant
^-------- Free-Run, siehe ADCSRB
^--------- ADC starten
^---------- ADC einschalten
Der Vorteiler hängt von der Taktfrequenz des AVRs ab, er soll so gewählt
werden, dass der ADC mit 50kHz bis 200kHz getaktet wird. Er braucht
(ohne Umschaltung der Quellen) 13 Takte für eine Wandlung, hat also
Vorteiler mal 13 Takte ein neues Ergebnis, das so lange in ADCL und ADCH
verfügbar ist, bis es vom nächsten Ergebnis überschrieben wird. Un nun
das neueste Ergebnis zu erfahren, muss dein Programm es nur auslesen:
wert = ADCH
Wobei "wert" als Byte dimensioniert sein sollte. Da dies wieder nur eine
einfache Zuweisung ist, kostet das keinerlei Wartezeit. Und solltest Du
(durch ungünstige Programmplanung) den Wert zu oft abfragen, dann
bekommst Du den alten Wert eben nochmal, solange noch kein neuer
ermittelt wurde.
Ähnliches wie beim ADC wirst Du bei den Timern entdecken. Die Timer der
neueren Controller können viel mehr als Bascom per Config-Geraffel
bietet. Schau Dir das Datenblatt an, das ist verbindlich, verzichte auf
den Config-Kram und greife durch einfache Zuweisungen auf die interne
Peripherie der AVRs zu, Du wirst sehen, dass damit das Programmieren
auch in Bascom bedeutend einfacher und stressfreier wird.
...
****************************** 2 ******************************************
nach studium des textes wirst du wohl auch sehen, dass es manchmal sinvoller ist.. den kleinen micro mal direkt anzusprechen.
Lesezeichen