PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie immer Dividieren



Egg
06.07.2008, 21:38
Good Evening together

Ja Ja bin wieder da!! Ich bin neu in dem Programmier Gebiet und brauch noch viel Unterstuetzung.

Also mein jetziges Problem ist fuer mich ein bisschen ein Krampf aber immer sehr wichtig.

Also ich moechte gerne Dividieren, hab zwar des gesamte Netz durchsucht und nur hinweise auf die Microchip seite bekommen, dort hab ich die Datei unter dem Namen nie so richtig gefunden.

Also ich moechte einfach mal den richtigen Ablauf vom Dividieren bekomen ,dass ich selber mal Schluessel daraus ziehen kann und nachvollziehen kann was es macht.

Was ich brauche ist die Division von einem Wort durch einem Byte.
Koennte mir jemand seine Routine mit einer kurzen erklaerung durchgeben??
Somit ich ein bisschen weiter komme mit meinem Programm.
Danke im Vorraus O:)

Lif79
06.07.2008, 22:05
Moin,

Ohne das ich mich da jetzt genauer mit auseinandersetzen kann,

AN617, AN660 sind "Application Notes" wo diverse Mathe Routinen zu finden sind.

Alle Routinen findest du unter Design --> Technical Documentation --> App Notes und dann Algorithm anklicken und Math auswählen...

Egg
09.07.2008, 23:09
](*,) Hallo

Also ich bin ueberhaupt nicht mit den Routinen von Microchip begeistert.

bei mir Klappen die gar nicht ich komm nie auf mein gewuenschtes Ergebnis.

Ich hab mal die erste bei AN617 rausgesucht fuer 16/8Bit Dividierung und hab die erste Routine gewaehlt. (Ich hab auch schon mal andere Routinen benutzt bin dabei aber auch nie auf mein Ergebnis gekommen.)


list p=16f873 ; list directive to define processor
#include <p16f873.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.






;***** VARIABLE DEFINITIONS
w_temp EQU 0x20 ; variable used for context saving
status_temp EQU 0x21 ; variable used for context saving

AARGB0 EQU 0x22
AARGB1 EQU 0x23
;geteil durch
BARG EQU 0x24
BARGB0 EQU 0x25
BARGB1 EQU 0x26
;Ergebnis
REMB0 EQU 0x27
REMB1 EQU 0x28

LOOPCOUNT EQU 0x29

;************************************************* *********************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program


;Initialisierung
ini
movlw d'250'
movwf BARG
movlw 0xE2
movwf AARGB0
movlw 0x04
movwf AARGB1
return
main
call ini

MOVF BARGB0,W
SUBWF REMB0, F
RLF AARGB0, F
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
ADDWF REMB0, F
RLF AARGB0, F
MOVLW 6
MOVWF LOOPCOUNT

LOOPS1608A
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608A

RLF AARGB1,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB1, F
MOVLW 7
MOVWF LOOPCOUNT

LOOPS1608B
RLF AARGB1,W

RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB1,0
SUBWF REMB0, F
BTFSS AARGB1,0
ADDWF REMB0, F
RLF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608B

BTFSS AARGB1,0
ADDWF REMB0, F
NOP
NOP
NOP
END ; directive 'end of program'

Ich teil bei der Routine 1250 durch 250 ergebnis muesste 5 sein bekomm aber 4 heraus.

Ich hab schon mit mehreren Zahlen gerechnet aber nie auf irgend ein richtiges Ergebnis gekommen.
Koennte mir einer dabei weiterhelfen richtige Werte auszurechnen?? [-o<
Gruss Egg

Egg
13.07.2008, 16:14
Hallo

Also mein Problem ist wiefolgt des Dividieren, aber die Routine funktioniert bei kleinen Zahlen 8bit durch 8 bit beschraenkt(so lange die Zahl nicht zu gross wird) aber die Routine ist eigentlich fuer 16/8 Bit gedacht.
Und ich muss mit grossen Zahlen Rechnen.

Muss ich irgendwas Wichtiges beachten beim Dividieren??

Meine Routine ist wie folgt:



list p=16f873 ; list directive to define processor
#include <p16f873.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _CPD_OFF


SDIV1608L macro AARGB0,AARGB1, BARGB0
MOVF BARGB0,W
SUBWF REMB0, F
RLF AARGB0, F
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
ADDWF REMB0, F
RLF AARGB0, F
MOVLW 6
MOVWF LOOPCOUNT
LOOPS1608A RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608A
RLF AARGB1,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB1, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPS1608B RLF AARGB1,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB1,0
SUBWF REMB0, F
BTFSS AARGB1,0
ADDWF REMB0, F
RLF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608B
BTFSS AARGB1,0
ADDWF REMB0, F
endm
;***** VARIABLE DEFINITIONS
w_temp EQU 0x20 ; variable used for context saving
status_temp EQU 0x21 ; variable used for context saving

AARGB0 EQU 0x22
AARGB1 EQU 0x23
;geteil durch
BARG EQU 0x24
BARGB0 EQU 0x25
BARGB1 EQU 0x26
;Ergebnis
REMB0 EQU 0x27
REMB1 EQU 0x28

LOOPCOUNT EQU 0x29
Nenner EQU 0x30
Zaehler EQU 0x31
TEMP EQU 0x32
AARGB5 EQU 0x33
Nenner1 EQU 0x34

;************************************************* *********************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program


;Initialisierung
ini

movlw 0x96
movwf Nenner
movlw 0x00
movwf Nenner1
movlw d'3'
movwf Zaehler
return
main
call ini
SDIV0808L Nenner,Nenner1,Zaehler
nop
nop
nop
END ; directive 'end of program'

PICture
14.07.2008, 18:11
Hallo Egg!

Ich verstehe nicht wie dein "main" (angeblich Hauptprogramm) funktioniert.

Was soll die Zeile "SDIV0808L Nenner, Nenner1, Zaehler"?
Was wird der PIC nach 3 NOPs tun?

MfG

Egg
15.07.2008, 15:09
Hallo PICture,

Nothing... Ist nur eine Testprogramm sollte nur Dividieren, ob ich des ins Main programm reinschreibe oder ein Makro call ist doch egal, oder??
Was in dem Main gemacht werden soll, ist nur irgendeine Zahl zu dividieren. Die in der Initialisierung in Nenner, Nenner1 fuer das Wort und das Byte in Zaehler reingeschrieben wird und dann mit einander dividiert wird. die Nops sind nur damit irgendwas nach der Dividierung darin weiter da steht nicht, dass er auf einmal steckenbleibt beim Testlauf. Ist ja nicht mein Eigentliche Programm, ist nur die Dividierung.

Und die Dividierung funktioniert nicht, ich bekomm irgendwelche Zahlen heraus und nicht die ich bekommen moechte und ich hab die Routine von der Microchip site. Muesste ja eigentlich funktionieren, deswegen denk ich mal dass ich irgendetwas nicht beachte. Irgendwas wichtiges beim Dividieren. Weil die Routine funktioniert nur bei kleinen Zahlen von 0x01 - 0x85 und groessere Zahlen funktionieren nicht. Ich hab darauf geachtet dass immer eine glatte zahl heraus kommen. Aber es kommt eine total falsche Zahl heraus.

MfG

PICture
15.07.2008, 16:13
Hi Egg!

Der Prozessor wird nicht stehen bleiben und du kannst ihn mit "sleep" stoppen, sonst ist es ungewiss, was er nach den 3 NOPs weiter macht.

Wo befindet sich SDIV0808L? In dem von Dir geposteten Code sehe ich es nicht.

Außerdem, damit die Routine funktioniert müssen die Zahlen in AARGB0,AARGB1 und BARGB0 geladen werden und nicht so wie Du das in "ini" machst in Nenner, Nenner1 und Zaehler.

Sorry, wenn ich etwas falsch verstehe, aber ich selber keine Makros benutze.

MfG

Egg
17.07.2008, 17:27
Hi PICture

Wie man kanns nicht sehen?? muesste eigentlich ganz oben stehen unter Config. .. egal


SDIV1608L macro AARGB0,AARGB1, BARGB0
MOVF BARGB0,W
SUBWF REMB0, F
RLF AARGB0, F
RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
ADDWF REMB0, F
RLF AARGB0, F
MOVLW 6
MOVWF LOOPCOUNT
LOOPS1608A RLF AARGB0,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB0, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608A
RLF AARGB1,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB0,0
SUBWF REMB0, F
BTFSS AARGB0,0
ADDWF REMB0, F
RLF AARGB1, F
MOVLW 7
MOVWF LOOPCOUNT
LOOPS1608B RLF AARGB1,W
RLF REMB0, F
MOVF BARGB0,W
BTFSC AARGB1,0
SUBWF REMB0, F
BTFSS AARGB1,0
ADDWF REMB0, F
RLF AARGB1, F
DECFSZ LOOPCOUNT, F
GOTO LOOPS1608B
BTFSS AARGB1,0
ADDWF REMB0, F
endm

Des ist der Code und der muesste eigentlich doch funktionieren aber Problem besteht weiterhin
Nenner, Nenner1 und Zaehler ist vieleicht ein bisschen verwirrend aber daran liegt der Fehler nicht wird schon in AARGB und BARG geladen.

MfG :-b

PICture
17.07.2008, 20:27
Hallo Egg!

Für dich ist "SDIV1608L" und "SDIV0808L" (was in deinem "main" steht) vielleicht das gleiche, aber für mich und den Prozessor sicher nicht und das ist nicht egal.

MfG