- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Wie immer Dividieren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2008
    Ort
    Hounslow
    Alter
    37
    Beiträge
    10

    Wie immer Dividieren

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.06.2007
    Ort
    Aurich
    Beiträge
    36
    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...

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2008
    Ort
    Hounslow
    Alter
    37
    Beiträge
    10

    Komm immer noch nicht weiter

    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.)

    Code:
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2008
    Ort
    Hounslow
    Alter
    37
    Beiträge
    10
    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:


    Code:
    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'

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2008
    Ort
    Hounslow
    Alter
    37
    Beiträge
    10
    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

  7. #7
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    05.07.2008
    Ort
    Hounslow
    Alter
    37
    Beiträge
    10
    Hi PICture

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

    Code:
    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

  9. #9
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests