Siro
05.11.2007, 18:23
Ich habe meiner Meinung nach einen Chip Fehler im PIC24HJ256GP610
gefunden, den mir die Firma Microchip anscheinend nicht bestätigen will
oder kann, oder mein Problem nicht verstanden hat.
PROBLEM :
mov #0x1000,W0 ; W0 zeigt nun auf 0x1000
repeat #10 ; durchlauf die nächste Zeile 10+1 mal
com.w [W0],[W0++]
nop
dazu eine kurze Beschreibung was der code überhaupt soll:
complementiere die Speicherstelle (16 Bit) auf die das Register W0 zeigt.
schreibe das Ergebnis (16 Bit) an selbige Speicherstelle worauf W0 zeigt, dann erhöhe das W0 register um 1 Word, also um 2 Bytes.
wenn der Prozessor den "nop" Befehl erreicht, dann muss das "W0"
register 11 WORDS weiter gezählt haben (10+1), sollte also folglich wegen
dem Word Mode auf 0x1016 stehen. Dies funktioniert in der MPLAB IDE auch korrekt, jedoch im Prozessor selbst nicht. Das "RCOUNT" register steht dann zwar korrekterweise auf 0, das W0 register steht aber falsch. Das post increment scheint hier nicht richtig zu funktionieren, hier
gehen counts verloren.
Dazu tätigte ich einige Versuche mit verschiedenen Repeat Counts:
Repeat Count:
0 OK
1 OK
2 OK
3 hier fehlt 1 Word increment vom register W0
4 hier fehlt 1 Word increment vom register W0
5 hier fehlen 2 Word increments vom register W0
6 hier fehlen 2 Word increments vom register W0
7 hier fehlen 3 Word increments vom register W0
8 hier fehlen 3 Word increments vom register W0
9 hier fehlen 4 Word increments vom register W0
100 hier fehlen 49 Word increments vom register W0
1000 hier fehlen 499 Word increments vom register W0
dann testete ich selbigen Code mit dem W1 register
com.w [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
dann testete ich selbigen code im Byte Mode
com.B [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
dann ersetzte ich den "com" durch "neg"
NEG.w [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
Nun testete ich anstelle des post increments das pre increment
com.w [W1++],[W1]
und zum Erstaunen, hier funktioniert alles richtig.
Kann eventuell jemand dieses Fehlerverhalten überprüfen bzw. bestätigen ?
gefunden, den mir die Firma Microchip anscheinend nicht bestätigen will
oder kann, oder mein Problem nicht verstanden hat.
PROBLEM :
mov #0x1000,W0 ; W0 zeigt nun auf 0x1000
repeat #10 ; durchlauf die nächste Zeile 10+1 mal
com.w [W0],[W0++]
nop
dazu eine kurze Beschreibung was der code überhaupt soll:
complementiere die Speicherstelle (16 Bit) auf die das Register W0 zeigt.
schreibe das Ergebnis (16 Bit) an selbige Speicherstelle worauf W0 zeigt, dann erhöhe das W0 register um 1 Word, also um 2 Bytes.
wenn der Prozessor den "nop" Befehl erreicht, dann muss das "W0"
register 11 WORDS weiter gezählt haben (10+1), sollte also folglich wegen
dem Word Mode auf 0x1016 stehen. Dies funktioniert in der MPLAB IDE auch korrekt, jedoch im Prozessor selbst nicht. Das "RCOUNT" register steht dann zwar korrekterweise auf 0, das W0 register steht aber falsch. Das post increment scheint hier nicht richtig zu funktionieren, hier
gehen counts verloren.
Dazu tätigte ich einige Versuche mit verschiedenen Repeat Counts:
Repeat Count:
0 OK
1 OK
2 OK
3 hier fehlt 1 Word increment vom register W0
4 hier fehlt 1 Word increment vom register W0
5 hier fehlen 2 Word increments vom register W0
6 hier fehlen 2 Word increments vom register W0
7 hier fehlen 3 Word increments vom register W0
8 hier fehlen 3 Word increments vom register W0
9 hier fehlen 4 Word increments vom register W0
100 hier fehlen 49 Word increments vom register W0
1000 hier fehlen 499 Word increments vom register W0
dann testete ich selbigen Code mit dem W1 register
com.w [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
dann testete ich selbigen code im Byte Mode
com.B [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
dann ersetzte ich den "com" durch "neg"
NEG.w [W1],[W1++]
ebenfalls falsche Ergebnisse im W1 register
Nun testete ich anstelle des post increments das pre increment
com.w [W1++],[W1]
und zum Erstaunen, hier funktioniert alles richtig.
Kann eventuell jemand dieses Fehlerverhalten überprüfen bzw. bestätigen ?