Jakob N. schrieb:
> Irgendwelche Bits muss ich ja schreiben
Der grobe Ablauf bei eigentlich jeder PWM Hardware ist folgender:
Taktquelle und Taktteiler für den Timer wählen
Timer in PWM mode versetzen.
Ggf noch Art des PWM modes wählen (up, down, up/down)
Timer Rückladewert ins Register schreiben.
Bei jedem Timerüberlauf wird der Timer automatisch resettet und der von
dir gewählte Timer Rückladewert in den Timer geladen.
Von da an zählt der dann weiter bis zum nächsten Überlauf.
Aus Taktquelle, Taktteiler und Timer Rückladewert ergibt sich die PWM
Wiederholfrequenz.
In das Capture Compare register schreibst Du den Wert für den Duty
cycle.
Erreicht der Timer diesen Wert führt ein positiver vergleich beider
register zu einem wechsel des PWm Pins (high / low, je nachdem was Du
gewählt hast)
Solange Du nichts neues in die Register schreibst, macht die PWM
hardware endlos weiter. Das ist ja der Sinn einer PWM Hardware.
Willst Du den Duty cycle verändern kannst Du Dir selbst aussuchen in
welcher Geschwindigkeit. Das kannst Du mit einer separaten Timer IRQ
machen, immer wenn es einen Timer Überlauf gegeben hat, oder was auch
immer Dir dazu einfällt.
Wenn Du allerdings ständig in dem Register rummachst, bevor der Zyklus
abgelaufen ist, kann die PWM Hardware ihren Job nicht machen.
Jakob N. schrieb:
> Ist leider das erste mal das ich mit
> Registern etc. auseinander setze
DB + Family reference Datasheet aufmerksam lesen
Les alles zu dem Timer und den PWM Registern, schau dir jedes Register
an und beachte auch die logig Bildchen die es teilweise zur
Verdeutlichung der Hardware gibt.
Du hast die Arduino Welt verlassen und bist bare metal unterwegs.
Das ist garnicht so schwer, nur ungewohnt.
Dafür kannst Du damit Sachen anstellen für die es keine Lib gibt.
Ist nämlich meistens nicht die Hälfte davon in einer Lib umgesetzt was
die MCUs können, wenn man ihre HW flexibel verwendet.
Bei den PICs:
Immer explizit auf digital io stellen, sonst hat die ADC HW immer einen
Fuss in der Tür auch wenn Du den ADC nicht benutzt.
Führt zu merkwürdigen Ergebnissen.
Lerne den Debugger zu benutzen, breakpoints zu setzen und wie man sich
mit Debugger die CPU Register oder Code Variablen ansieht.
Die Zeiten des Arduino Pin friggel debugings oder mühseeligem Uart
debugging sind damit vorbei.
Man muss Code nicht blind laufen lassen und dann wild raten was da wohl
passiert.
Mit Debugger hättest Du z.B. den Timer Überlauf IRQ aktivieren können
und einen Breakpoint in die IRQ Routine gesetzt.
Da hättest Du sofort bemerkt wenn der Überlauf nicht kommt.
Bevor Du einen Pin verwenden kannst must Du entscheiden was der ist und
was der kann. Ist das ein ADC Eingang, ein digital IO, ist der open
Kollektor oder push pull, invertiert, ist der Pull up aktiv oder nicht.
Hat der Pic eine IO matrix musst du auch festlegen welche interne HW an
welchen Pin gelegt wird.
Was Du nicht machst, wird nicht gemacht.
Kein Arduino Gefriggel im Hintergrund, das dutzende verschiedene MCUs
auf den kleinsten gemeinsamen Nenner kastriert und einem vieles abnimmt.
Aber wenn Du Dir die Mühe machst, kannst Du geile Sachen mit der HW
anstellen.
Statt dem Aufruf einer Routine die Du nicht verstehst, der du x
Parameter mitgibts, damit die dann erstmal auseinanderklamüstert was Du
eigentlich willst, setzt Du nur eine handvoll Register.
Ist m.E. oft einfacher als den Funktionsaufruf zu verstehen und dann
rauszufinden das die das eine Ding nicht kann, das Du willst und das die
HW auch könnte.