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.
GT steht bei den meisten Prozessoren für Vergleich mit Vorzeichen. Bei 16 Bits ist 40000 aber negativ.
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
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
CPSGT ist signed compare. Dein mov #40000,W1 ist zu groß und wird deshalb negativ.
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..
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?
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.
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)
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!
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
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
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 :/
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.
Wenn alle Stränge reißen muss ich halt ne Subtraktion mit C Auswertung machen
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
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
Hier ist er, der Unterschied zwischen "ich weiß was ich mache" und "hab ich immer schon so gemacht"
Ge E. schrieb: > Ein PIC (24EP128MC202) Mache zwar einiges mit PIC24, wußte aber garnicht, daß der auch Assembler kann;) MfG Klaus
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!
Oldie schrieb: > Bin ich froh, dass ich mich (zufällig) auf AVR eingeschossen habe. - Kannst du denn dann hier überhaupt qualifiziert mitreden?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.