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.