PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Syntax - Verständnisprobleme



R2D3212
03.07.2006, 16:56
Hallo!

Bin Anfänger und hab mich gestern in Assembler eingelesen versteh da aber was nicht (keine Angst, nicht _völlig_ OT, die Source schaut im C eh fast gehauso aus, Assemblerforum hab ich keins gefunden:)).

Also, ich möchte nen Hardware PWM machen. In Application Note 130 - Setup and Use the AVR® Timers hab ich da folgende Source gefunden:

-------------
-------------
init_Ex4: ; 8 bit PWM non-inverted (Fck/510)
ldi r16,(1<<PWM2)|(1<<COM21)|(1<<CS20)
out TCCR2,r16 ; 8 bit PWM non-inverted (Fck/510)
ldi r16,0xE0
out OCR2,r16 ; Set compare value/duty cycle ratio
ldi r16,0x8F
out DDRD,r16 ; Set PD7/OC2 and low nibble Port D as output
ret
---------------
---------------
Mein Problem liegt bei Zeile 2.
ldi r16,(1<<PWM2)|(1<<COM21)|(1<<CS20)
bin mit der Syntax (die << und die | ) irgendwie nich vertraut. Wenn ich das richtig verstanden habe, dann setze ich in TCCR2 durch r16 einfach irgendwelche bits, nach denen der Timer configuriert wird. Warum mach ich nich gleich so
ldi r16, 0b00100010? Warum macht man das nach oben genannter Syntax (die sieht man eben auch in C recht häufig)?

Sorry für die Anfängerfrage, aber ich glaub es würd mir sehr weiterhelfen, wenn mich jemand erleuchten würde (oder mir nen Link zu nem Tutorial geben könnte, wo obrige Syntax behandelt wird...vorzugsweise für Assembler).

Tschüß,
R2D3212

PicNick
03.07.2006, 17:54
Liegt einfach daran: Es hat sich eingebürgert, die div. Switches in den Registern als Bit-Nummer zu definieren, also als Zahlen von 0-7.
Dadurch kann man mit dem gleichen Symbol
SBIC ioreg, SYMBOLNAME als Bitnummer
LDI register, (1<<SYMBOLNAME) als BitMaske
arbeiten. (Das shiften macht eh der Compiler beim Übersetzen, der Maschinencode sieht dann ja eh' aus (in C und im Assembler) wie von dir
beschrieben.

Logo ? Anderenfalls würde man zwei verschiedene Symbole brauchen.
SYM_BITNR = 4 und
SYM_BITMSK = 0b00010000

Hanni
03.07.2006, 18:44
Die einfachste Erklärung für diese scheinbare Unlogik liegt übrigens in der besseren Lesbarkeit der einzelnen Zeilen.
Mir zumindest geht es mit den "0b01010101" Dingern jedenfalls recht häufig so, das ich nach kürzester Zeit nicht mehr weiss, was ich da eigentlich gesetzt hab .

€dit: Assemblerfragen passen im übrigen besser in das folgende Unterboard:

Atmel AVR Controller

Grüße,

da Hanni

PicNick
03.07.2006, 19:27
..Assemblerfragen passen im übrigen besser ..

Da muß ich ihn in Schutz nehmen, Das ist bei C und Assembler das Gleiche

R2D3212
03.07.2006, 22:30
@PicNick:
Ähmm, so ganz hab ichs noch nich verstanden. Erlaube mir mal zu rekapitulieren (Wissen ist noch frisch von gestern)....

Bitmaske = definierte Abfolge von 0 u. 1 in einem Byte, also 8 Bits.
Zweck = durch And/or/xor auf andere Bytes wirken lassen um Bits im Zielbyte gleichzeitig zu verändern.

z.B.:
ldi r16,(1<<PWM2)
lädt die Bitmaske PWM2 in Register r16 (was heisst das "1<<"?).

Was macht aber:
ldi r16,(1<<PWM2)|(1<<COM21)|(1<<CS20)
?
Ich vermute mal, das kombiniert die Bitmasken miteinander ( | = oder?), sodass im r16 alle bits von PWM2, COM21 und CS20 aktiviert sind?

Zitat:
---------
Dadurch kann man mit dem gleichen Symbol
SBIC ioreg, SYMBOLNAME als Bitnummer
LDI register, (1<<SYMBOLNAME) als BitMaske
arbeiten. (Das shiften macht eh der Compiler beim Übersetzen, der Maschinencode sieht dann ja eh' aus (in C und im Assembler) wie von dir
beschrieben.

Logo ? Anderenfalls würde man zwei verschiedene Symbole brauchen.
SYM_BITNR = 4 und
SYM_BITMSK = 0b00010000
-------

Ähh, das check ich noch nich:)
SBIC ioreg, SYMBOLNAME als Bitnummer
So definiert man ne Bitmaske? SBIC ist mir bis heute (also in den letzten paar stunden, lol) noch nich untergekommen:)
Andernfalls 2 verschiedene Symbole? ÄHHH, verstehs nich, sorry.

Also momentan is meine Vorstellung von PWM2 ect. so...:
Da gibts ne Tabelle im Assembler, wo er beim assemblieren als PWM2 ne Bitmaske einsetzt. Quasi zur besseren lesbarkeit des Codes.

Hast du vielleicht nen Link zu nem Tutorial, was das beschreibt?

PicNick
04.07.2006, 09:01
Also: z.B.
COM21 ist ein Symbol (.equ) für eine Zahl 0-7, in diesem Fall eben eine Bitnummer
<< heißt (für den Compiler) shift left (nach links schieben)
( 1<<COM21) heißt, schiebe einen 1-er "com21-mal nach links
ergibt also ein Byte mit einem Einser irgendwo drin.
(1 << 0 ) ---> 0b00000001
(1 << 7 ) ---> 0b10000000
"|" heißt f. den Compiler oder
(1 << 0 ) | (1 << 7 ) ---> 0b10000001

R2D3212
04.07.2006, 14:34
Passt! Jetzt hab ichs kapiert! Vielen Dank für deine Hilfe!

Hab gestern versucht den HardwarePWM ala
ldi r16, 0b010100 (oder so...bits aus der Amtel Anleitung)
zu implementieren und es hat sogar geklappt (hab zum kontrollieren nen piezo lautsprecher angeschlossen..die LED blinkt einfach zu schnell ums zu erkennen)

Jetzt weiß ich auch, was mit COM21 ect. gemeint ist.

Die Schreibweise mit dem (1<<BITNAME) ist wirklich besser nachvollziehbar ==> Werd ich in Zukunft auch verwenden!

PicNick
04.07.2006, 14:43
..mit dem (1<<BITNAME) ist wirklich besser nachvollziehbar

Nunja, Im VMS (was immer das für ein Betriebssystem auch sei) gibt es tatsächlich immer 2 definitionen: mit prefix _V_name für die Bitnummer und mit prefix _M_name für die Maske. Hab ich auch hübsch gefunden. aber was solls

R2D3212
05.07.2006, 01:41
Dann hab ich gar nich sooo falsch gedacht:)
Von nem Betriebsystem auf nem AVR bin ich noch weiiit entfernt (so "Fallen" sind allerdings immer ärgerlich...bisschen Fehlertoleranz sollt in nem Betriebsystem IMHO schon drin sein:)).
Freu mich aber z.Z. schon darüber, wenn die LED das macht, was ich will:)

Muss ich noch das mit den "Long Delays" auf die Reihe kriegen (App.Note), dann ist mein erstes "Projekt" fast abgeschlossen...: Will mit nem Servo in definierten Zeitintervallen (5min - 1d) ne Digicam auslösen um die Bilder dann aufm PC zu nem Film zu schneiden (so ala Zeitraffer). Eigentlich eh ein recht ansprechendes und nicht "zu großes" Projekt für nen blutigen Anfänger.

Dazu werd ich mir wahrscheinlich noch C aneignen müssen (aufm PC komm ich soweit klar damit...und Basic müsst ich auch erst "lernen"), weil es sicher der Horror ist, sich in nen AssemblerCode wieder reinzulesen, den man ne Woche lang nicht angeschaut hat (und der wär dann mit LCD ansteuerung sicher recht unfangreich).

Also, ihr dürfts euch noch auf ne menge Fragen freuen, lol:))