Forum: Mikrocontroller und Digitale Elektronik PIC macht Rechenfehler?


von Ge E. (re_n)


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.

von Teo D. (teoderix)


Lesenswert?

Hab kein Plan von 24er Pics!

Sprungweite, Page grenzen, ...?

von (prx) A. K. (prx)


Lesenswert?

GT steht bei den meisten Prozessoren für Vergleich mit Vorzeichen. Bei 
16 Bits ist 40000 aber negativ.

von Ge E. (re_n)


Lesenswert?

Teo D. schrieb:
> Hab kein Plan von 24er Pics!
>
> Sprungweite, Page grenzen, ...?

Die 24er können global springen ohne page umschalten usw.. Weil die 
glaube ich mit 24 Bit Adressierung arbeiten

von Uwe N. (ulegan)


Lesenswert?

Das 'S' in CPSGT steht für 'signed'.
Die Register sind 16 Bit breit, also ist 4000 keine gültige 
vorzeichenbehaftete Zahl.
Sie wird wohl als negative Zahl betrachtet und dann stimmt der Sprung 
wieder.

Uwe

von Horst M. (horst)


Lesenswert?

CPSGT ist signed compare.
Dein mov #40000,W1 ist zu groß und wird deshalb negativ.

von Ge E. (re_n)


Lesenswert?

A. K. schrieb:
> GT steht bei den meisten Prozessoren für Vergleich mit Vorzeichen. Bei
> 16 Bits ist 40000 aber negativ.

in dem Fall steht das GT für "greater than" und das lt für "less than"..

von Vorzeichen steht zumindest nix in der Befehlsbeschreibung..

von Ge E. (re_n)


Lesenswert?

Horst M. schrieb:
> CPSGT ist signed compare.
> Dein mov #40000,W1 ist zu groß und wird deshalb negativ.

und gibt es auch ein unsigned compare?

von (prx) A. K. (prx)


Lesenswert?

Uwe N. schrieb:
> Das 'S' in CPSGT steht für 'signed'.

CPS = compare and skip if ...

Conditions allgemein:
GT  = signed >
GTU = unsigned >

Bei CPS gibts aber nur GT und EQ.

von (prx) A. K. (prx)


Lesenswert?

Ge E. schrieb:
> von Vorzeichen steht zumindest nix in der Befehlsbeschreibung..

In meinem Exemplar steht bei CPSGT:
Signed Compare Wb with Wn, Skip if Greater Than (Wb > Wn)

von Der Andere (Gast)


Lesenswert?

Ge E. schrieb:
> von Vorzeichen steht zumindest nix in der Befehlsbeschreibung..

Wenn ich nur 1 Minute google, finde ich:
http://www.cs.unca.edu/~bruce/Fall11/255/PIC24_instruction_set_summary.pdf

Und dort steht explizit:
CPSGT Wb,Wn    Wb – Wn; skip if signed >

signed!

von (prx) A. K. (prx)


Lesenswert?

Ge E. schrieb:
> und gibt es auch ein unsigned compare?

Der Befehl CP vergleicht mit und ohne Vorzeichen. Ein anschliessender 
bedingter Sprungbefehl kann das Ergebnis mit (GT) und ohne Vorzeichen 
(GTU) auswerten

von Ge E. (re_n)


Lesenswert?

A. K. schrieb:
> Ge E. schrieb:
>> von Vorzeichen steht zumindest nix in der Befehlsbeschreibung..
>
> In meinem Exemplar steht bei CPSGT:
> Signed Compare Wb with Wn, Skip if Greater Than (Wb > Wn)

Bei mir steht: Compare Wb with Wn, skip if >

und ich hatte definitiv schon PICs die konnten mit dem Befehl ein 
unsigned 16 Bit Compare machen

von Ge E. (re_n)


Lesenswert?

A. K. schrieb:
> Ge E. schrieb:
>> und gibt es auch ein unsigned compare?
>
> Der Befehl CP vergleicht mit und ohne Vorzeichen. Ein anschliessender
> bedingter Sprungbefehl kann das Ergebnis mit (GT) und ohne Vorzeichen
> (GTU) auswerten

CPGTU "frisst" der Compiler nicht :/

von (prx) A. K. (prx)


Lesenswert?

Ge E. schrieb:
> und ich hatte definitiv schon PICs die konnten mit dem Befehl ein
> unsigned 16 Bit Compare machen

Aber vmtl. keine, die einen bedingten Skip mit drin hatten.

von Ge E. (re_n)


Lesenswert?

Wenn alle Stränge reißen muss ich halt ne Subtraktion mit C Auswertung 
machen

von (prx) A. K. (prx)


Lesenswert?

Ge E. schrieb:
> Wenn alle Stränge reißen muss ich halt ne Subtraktion mit C Auswertung
> machen

Denk an... ;-)

Aber das mit dem C-Flag solltest du dann doch besser dem Assembler 
überlassen, also ob ein gesetztes C-Flag für >= oder < steht.

: Bearbeitet durch User
von Ge E. (re_n)


Lesenswert?

A. K. schrieb:
> Ge E. schrieb:
>> und ich hatte definitiv schon PICs die konnten mit dem Befehl ein
>> unsigned 16 Bit Compare machen
>
> Aber vmtl. keine, die einen bedingten Skip mit drin hatten.

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 ^^'

: Bearbeitet durch User
von jau (Gast)


Lesenswert?

Hier ist er, der Unterschied zwischen "ich weiß was ich mache" und "hab 
ich immer schon so gemacht"

von Klaus (Gast)


Lesenswert?

Ge E. schrieb:
> Ein PIC (24EP128MC202)

Mache zwar einiges mit PIC24, wußte aber garnicht, daß der auch 
Assembler kann;)

MfG Klaus

von Oldie (Gast)


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!

von HabSelbstNullAhnung (Gast)


Lesenswert?

Oldie schrieb:
> Bin ich froh, dass ich mich (zufällig) auf AVR eingeschossen habe. -

Kannst du denn dann hier überhaupt qualifiziert mitreden?

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von W.A. (Gast)


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.

von picfan (Gast)


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

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.