Da ich auch verstehen will wie C-Code in asm aussehen, will ich mal
wissen wie der Dissassemlingcode hier zu verstehen wäre?Die Fragen dazu
sind als Kommentare hier hinter dem Code.Ich möchte gern wissen wie hier
das 16bittige Register für die Ausgabe angepasst wird,wenn man mit 8Bit
durch den ganzen Wertebereich kommen will?
1
82: void PWM1_LoadDutyValue(uint16_t dutyValue)
2
83: {
3
84: dutyValue &= 0x03FF; // Anding mit Festwert 512 des Mainloops mit dem Wert des 16bittigen // Dutyvalue-Registers 1023
Was ist da jetzt nicht zu verstehen? Im PIC 8-bit MCU gibt es keine 16
bittigen Register, deshalb wird alles in high und low Byte aufgeteilt
und getrennt/erweitert behandelt. Ungefähr so wie das rechnen mit 2
stelligen zahlen in der Grundschule, bei dem 1 stelle nach der anderen
bearbeitet wird. 0x270(lowByte),271(highByte) ist wohl sicherlich der
Eingangswert, 0x370,371 der Zwischenspeicher/Rechenregister mit dem
finalen Ausgangs wert, der zum Schluß in die I/O-Zellen geschrieben
wird.
Wenn das Zwischenergebnis von 0x270 zu 0x370 wandert, warum steht dann
hinter dem ANDWF 0x270 das hier ", F" sollte das dann nicht in die selbe
Zelle überschrieben werden?Oder eben danach",W"... dann gehts ins
Arbeitsregister und würde von dort so übergeben werden:MOVLW 0x370??
Klar von der Logik her, würde es so wie du geschrieben hast Sinn machen
aber hier fehlen diese Zeilen der Übergabe?Wenn man das Programm manuell
so schreiben würde fehlt hier doch was?
Mir bietet diese Dissassemling-Angelegenheit jedenfalls mehr über
Assemblercode zu lernen, die man ja lieber doch nicht ganz weglassen
sollte.Zumal mir diese trotz allem noch übersichtlicher,
nachvollziehbarer erscheinen als reine C-Code!?Ich habe das Gefühl damit
besser klar zu kommen als augenblicklich noch mit C.
Klingt komisch ist bei mir aber so.:o)
Aber danke für deine Bestätigung meiner noch nicht sicheren Annahme!
Gruß André
Vorraus: Bei PIC-Assembler solltest du den genauen Typ angeben, da
gibt's deutliche Unterschiede zwischen den Versionen.
Die Adressen, die der Disassembler anzeigt (0x270/1, 0x370/1), sind
geraten. Im Opcode selbst stehen nur ein paar Bits drin (7 oder 8), die
restlichen sind im Bank Select Register und was da gerade drinsteht, rät
der. Anhand des C-Codes wird wohl beidesmal die gleiche Variable
"dutyValue" angesprochen (xx70 low-byte, xx71 high-byte) und der
Disassembler hat sich einmal vertan.
> Da ich auch verstehen will wie C-Code in asm aussehen,
Und dann fällt dir nix besseres als maschinengenerierter 8-Bit
PIC-Assemblercode ein? Alles andere wäre besser gewesen ...
Wegstaben V. schrieb:> Rudi R. schrieb:>> MOVLW 0xFF // Laden vom Wert 556 (1111 1111)>> Da solltest du noch mal drüber nachdenken.
jou...ein Fehler....256 sollte das sein! ;o)
foobar schrieb:> Vorraus: Bei PIC-Assembler solltest du den genauen Typ angeben, da> gibt's deutliche Unterschiede zwischen den Versionen.>> Die Adressen, die der Disassembler anzeigt (0x270/1, 0x370/1), sind> geraten. Im Opcode selbst stehen nur ein paar Bits drin (7 oder 8), die> restlichen sind im Bank Select Register und was da gerade drinsteht, rät> der. Anhand des C-Codes wird wohl beidesmal die gleiche Variable> "dutyValue" angesprochen (xx70 low-byte, xx71 high-byte) und der> Disassembler hat sich einmal vertan.>>> Da ich auch verstehen will wie C-Code in asm aussehen,>> Und dann fällt dir nix besseres als maschinengenerierter 8-Bit> PIC-Assemblercode ein? Alles andere wäre besser gewesen ...
Tja, das hier ist ja noch einfach!Ich bin noch an einer anderen Sache
dran die mit Timerinteruppt und zwei Tastern das Dutyvalue in beiden
Richtungen bearbeiten kann!Das hatte ich vorerst mit dem MCC generiert,
weil ich das mit Assemlercode noch nicht gebacken kriegen würde!Da es
aber im Netz leider zu oft nur C-Code gibt und sich scheinbar damit
niemand mehr befassen will, probiere ich es halt mal über
Dissassemling.Was hier natürlich immer kurriose Code rauswirft!...Wie
mir scheint kann man diese Möglichkeit dann auch nicht wirklich
verwenden!
Dann muss ich eben doch selbst mal ran...der erstellt mir hier unnütze
Variablen, die ja den Code viel zu lang machen!
Danke für den Hinweis mit dem Dutyvalue, das wär eigentlich auch das was
ich im Code erwartet hätte!Eigentlich müsste man Dissassemling noch mal
debuggen um zu sehen ob hier intern Mist gebaut wurde!...aber es ist ja
schon offensichtlich...
foobar schrieb:> Die Adressen, die der Disassembler anzeigt (0x270/1, 0x370/1), sind> geraten. Im Opcode selbst stehen nur ein paar Bits drin (7 oder 8), die> restlichen sind im Bank Select Register und was da gerade drinsteht, rät> der. Anhand des C-Codes wird wohl beidesmal die gleiche Variable> "dutyValue" angesprochen (xx70 low-byte, xx71 high-byte) und der> Disassembler hat sich einmal vertan.
Hi,
ich habe jetzt mal in der Target Memory-view das Fileregister auf die
Werte nach dem Debuggen kontrolliert und stellte fest, dass 271 und 371
die gleichen Werte haben(high-Register), also jetzt mal mit dem Dutywert
256,was dann die Dez 1 ergibt.Also wurde die Variable 2 mal geschrieben,
was auch immer das soll,einmal hätte ja wohl gereicht!Also das ist dann
wohl auch das,was der C-Code generiert!Toller C-Code...deswegen die
größere Speicherplatzbelegung bei C-Coden!?C-Code verjubeln unnötigen
Speicherplatz und der PIC wird dann auch lahm in der Abarbeitung wenn
unnötige Sprünge verursacht werden.Tja ich weiß nicht was ich davon
halten soll!?
.oO(Hat sich Rudi Ratlos einen Account zugelegt?)
Entweder liest du dir mal ein Buch über die Architektur der PICs durch
(oder überhaupt irgendeines Mikrocontrollers), und zwar ernsthaft, d.h.
mit der Intention, es zu verstehen, oder du suchst dir ein anderes
Hobby!