Martin W. schrieb:
> Der "Plan".
Das ist ziemlicher Mist. Die 1k-Widerstände begrenzen den Strom zu den
Brückentreibern viel zu sehr und sie sind bei sauberer Programmierung
auch überhaupt nicht nötig. Ersetze sie durch 0Ohm-Widerstände.
Ansonsten sollte das Prinzip aber so funktionieren, wie du dir das
vorstellst. Deine Fehlerbeschreibung weist tatsächlich darauf hin, dass
JTAG aktiv ist. Welche Fusewerte benutzt du denn? Poste einfach die drei
Hexwerte, das spart eine Menge Laber/Sülz.
Zu der sauberen Programmierung:
Du mußt dir einfach nur klar machen, dass das DDRC-Register nur wenige
gültige Bitkombinationen haben kann. Entweder legst du dir eine Tabelle
dieser Bitkombinationen an und schreibst nur Werte aus dieser Tabelle
nach DDRC oder du schreibst dir eine Funktion, die "on the fly" die
Kombination ausrechnet und benutzt immer nur diese Funktion zum Setzen
von DDRC. Dann kann nix schief gehen, weil immer einer der beiden
Ausgänge eines Paares hochohmig ist. In Assembler würde das (vor einer
Optimierung ;o) ungefähr so aussehen:
1 | ;->R16: in den unteren drei Bits sind die Kanal-Selektoren
|
2 | ; der drei Phasen, gesetztes Bit bedeutet Direktsteuerung
|
3 | ; über die Pins 0..2, gelöschtes Bit bedeutet PWM-Steuerung
|
4 | ; über die Pins 3..5.
|
5 | SelectDirectPWM:
|
6 | push R17
|
7 | mov R17,R16
|
8 | swap R17
|
9 | lsr R17
|
10 | com R17
|
11 | andi R16,0b00000111
|
12 | andi R17,0b00111000
|
13 | or R16,R17
|
14 | cli ;ab hier nur nötig, wenn PORTC6/7
|
15 | in R17,DDRC ;anderweitig genutzt werden sollen
|
16 | andi R17,0b11000000 ;ansonsten entfällt das alles bis
|
17 | or R16,R17 ;einschließlich
|
18 | sei ;dieser Zeile
|
19 | out DDRC,R16
|
20 | pop R17
|
21 | ret
|