PIC macht Rechenfehler?

OP #4382161
Lesenswert?

Folgendes: Ein PIC (24EP128MC202) von mir macht mal wieder 
'Rechenfehler'

mov  #20000,W1
mov  #10000,W2
CPSGT  W1,W2    ; skip if W1 > W2
goto  LED_ON    ; if W1 < W2
goto  LED_OFF         ; if W1 > W2

LED_OFF wird ausgeführt, bis hier hin stimmts

mov  #40000,W1
mov  #20000,W2
CPSGT  W1,W2    ; skip if W1 > W2
goto  LED_ON    ; if W1 < W2
goto  LED_OFF         ; if W1 > W2

und hier müsste ebenfalls zu LED_OFF gesprungen werden, allerdings geht 
er auf LED_ON..

SPLIM und SPINIT sind korrekt initialisiert..

Ich hatte das Problem früher schonmal bei einem anderen PIC und habe es 
aber irgendwie in den Griff bekommen.
Gast #4382744
Lesenswert?

Bin ich froh, dass ich mich (zufällig) auf AVR eingeschossen
habe. - Neulich gab es auch schon eine Frage bezüglich der 
Vergleichsoperation beim PIC über mehrere Bytes (WORD, LONG
etc.)

Beim AVR ist alles gut in der HILFE zum AVR-Studio
beschrieben. Und auch sonst im NET leicht zugänglich.

Beim PIC sind wohl entweder die Rechen- und Vergleichs-Befehle
dürftig, oder zumindest deren nachvollziehbare Dokumentation...

Naja, dafür kann man beim PIC direkt mit Werten im Speicher
arbeiten. Hat wohl jeder seine Vor- und Nachteile.

Ich bevorzuge es jedenfalls, mit einem gut dokumentierten
System zu arbeiten!

Wenn nächstes Mal die Anfänger-Frage kommt: "WELCHEN µC???"
- Habe ich jetzt Argumente!
#4382763
Lesenswert?

Oldie schrieb:
> Beim PIC sind wohl entweder die Rechen- und Vergleichs-Befehle
> dürftig,

Im Gegenteil, die 16-Bit PICs 24/30/33 haben eine recht ordentliche 
Architektur, was Asm-Programmierbarkeit und Zielmaschine für Compiler 
angeht. Dass der TO sich damit schwer tut ist nicht Microchip 
anzulasten.

> oder zumindest deren nachvollziehbare Dokumentation...

Im Datasheet steht kaum was, aber das ist bei den AVRs auch nicht 
anders. Dafür gibts aber ein mehrere hundert Seiten langes Programmer’s
Reference Manual, das die komplette Architektur mitsamt Befehle 
ausführlich beschreibt, während Atmels Pendant die Register im Datasheet 
beschreibt und die Befehle getrennt davon in der Referenz.

> Neulich gab es auch schon eine Frage bezüglich der
> Vergleichsoperation beim PIC über mehrere Bytes (WORD, LONG
> etc.)

Ging es dabei auch um die 16-Bitter, oder bezog sich das auf die 8-Bit 
PICs? Die 8-Bitter sind etwas "gewöhnungsbedürftig" und 16/32-Bit 
Operationen machen auf keiner Akkumulator-Maschine wirklich Spass.
Gast #4382772
Lesenswert?

Ge E. schrieb:
> Habe immer mit diesem Befehl gearbeitet, aber habe langsam den Eindruck
> das ich bisher nur 15 Bit Zahlen miteinander verglichen habe und bis
> dahin funzt es ja ^^'

Wegen sowas hat schon eine Ariane 5 Rakete den Abgang gemacht - mit 
einem bewährten Softwaremodul von der Ariane 4.
Gast #4387692
Lesenswert?

Hallo,
Ge E. schrieb:
> Ich hatte das Problem früher schonmal bei einem anderen PIC und habe es
> aber irgendwie in den Griff bekommen.

auch ich verzweifelte mal mit Assembler für dspic30f (derselbe Assembler 
wie pic24).
Also programmierte ich das ganze mit C (XC16, MPLABX) und siehe da, es 
funzte!
Da ich aber neugierig war, wo der Fehler lag, habe ich das C-Programm 
disassembliert und mal betrachtet.
Bei mir war's weil die von mir in Assembler benutzten  W-Register noch 
andere Sonderfunktionen hatten, d.h. sie wechselten bei gewissen 
Manipulationen ihren Wert, so dass meine gewünschten Berechnungen nicht 
Zustande kamen...
freundliche Grüsse picfan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren