Forum: Compiler & IDEs Verständnisfrage zum Disassemlingcode PWM-Erzeugung


von Rudi R. (microwitsch)


Lesenswert?

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 
4
07B0  30FF     MOVLW 0xFF                              // Laden vom Wert 556 (1111 1111)
5
07B1  05F0     ANDWF 0x270, F                          // Welcher Wert steht in File-Adresse 0x270 ??
6
07B2  3003     MOVLW 0x3                               // Laden vom Wert 3 (0000 0011)
7
07B3  05F1     ANDWF 0x271, F                          // Welcher Wert steht im File-Adresse 0x271 ??
8
85:                
9
86:                // Load duty cycle value
10
87:                if(CCP1CONbits.CCP1FMT)
11
07B4  0146     MOVLB 0x6
12
07B5  1E0E     BTFSS CCP1CON, 0x4
13
07B6  2FBC     GOTO 0x7BC
14
88:                {
15
89:                    dutyValue <<= 6;
16
07B7  3006     MOVLW 0x6
17
07B8  35F0     LSLF 0x370, F
18
07B9  0DF1     RLF 0x371, F
19
07BA  0B89     DECFSZ WREG, F
20
07BB  2FB8     GOTO 0x7B8
21
90:                    CCPR1H = dutyValue >> 8;
22
07BC  0871     MOVF 0x371, W
23
07BD  008D     MOVWF CCPR1H
24
91:                    CCPR1L = dutyValue;
25
07BE  0870     MOVF 0x370, W
26
07BF  008C     MOVWF CCPR1
27
92:                }
28
93:                else
29
94:                {
30
95:                    CCPR1H = dutyValue >> 8;
31
96:                    CCPR1L = dutyValue;
32
97:                }
33
98:            }
34
07C0  0008     RETURN

von zmx (Gast)


Lesenswert?

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.

von Rudi R. (microwitsch)


Lesenswert?

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é

von foobar (Gast)


Lesenswert?

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 ...

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Rudi R. schrieb:
> MOVLW 0xFF                   // Laden vom Wert 556 (1111 1111)

Da solltest du noch mal drüber nachdenken.

von Rudi R. (microwitsch)


Lesenswert?

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)

von foobar (Gast)


Lesenswert?

> > MOVLW 0xFF                   // Laden vom Wert 556 (1111 1111)

> 256 sollte das sein!

Aller guten Dingen sind drei ...

von Rudi R. (microwitsch)


Lesenswert?

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...

von Rudi R. (microwitsch)


Lesenswert?

foobar schrieb:
>> > MOVLW 0xFF                   // Laden vom Wert 556 (1111 1111)
>
>> 256 sollte das sein!
>
> Aller guten Dingen sind drei ...

255...:)

: Bearbeitet durch User
von Rudi R. (microwitsch)


Lesenswert?

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!?

von foobar (Gast)


Lesenswert?

.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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.