- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Syntax - Verständnisprobleme

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22

    Syntax - Verständnisprobleme

    Anzeige

    Powerstation Test
    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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    ..Assemblerfragen passen im übrigen besser ..
    Da muß ich ihn in Schutz nehmen, Das ist bei C und Assembler das Gleiche
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    @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?

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    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!

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    ..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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    02.07.2006
    Beiträge
    22
    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)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress