Sandro279
21.04.2013, 20:11
Also der Drehzahlmesser hat einen PIC16F628. Die Software dazu hab ich schon, könnte man die abändern, dass er doppelt so viel anzeigt?
Ich weiß sicher, dass er in einem Schritt 15000000 durch die gemessene Drehzahl dividiert, also müsste ich doch 15000000 durch 30000000 ersetzen, oder?
Noch eine Frage, kann man den Chip öfter als ein mal beschreiben, oder geht das dann nicht mehr?
Zum beschreiben des Chips hab ich einen Batronix Bagero II für Motorsteuergeräte, mit dem sollte das doch funktionieren, oder? Jetzt weiß ich nur nicht, mit welchem Programm ich am besten die Software ändern kann, wisst ihr da eins?
Sandro279
23.04.2013, 18:15
Okay, ich hab gerade bei meiner Suche zu Hause ein altes Gerät gefunden, mit dem kann ich die PICs beschreiben
Nur weiß ich leider nicht, was ich genau an der Software ändern muss. Ich hab vier Dateien, eine .hex, eine .asm, eine .a16 und eine .inc
in der .asm hab ich folgendes gefunden:
Ber1
; 15 000 000 durch Meßwert teilen
; 15 000 000 = E4 E1 C0
; 15 000 000 nach f laden
movlw 0xE4
movwf f2
movlw 0xE1
movwf f1
movlw 0xC0
movwf f0
; nun durch den Meßwert dividieren
call Div24 ; f:= f / xw
wenn ich nach Div 24 suche, finde ich folgendes:
Div24
MOVFW f0
MOVWF AARGB3
MOVFW f1
MOVWF AARGB2
MOVFW f2
MOVWF AARGB1
MOVLW 0x00
MOVWF AARGB0
MOVFW xw0
MOVWF BARGB2
MOVFW xw1
MOVWF BARGB1
MOVFW xw2
MOVWF BARGB0
CALL FXD3224S
MOVFW AARGB3
MOVWF f0
MOVFW AARGB2
MOVWF f1
MOVFW AARGB1
MOVWF f2
return
Muss ich dort irgendwas ändern oder in einer anderen Datei?
Sry, wenn ich mich nicht sonderlich gut auskenne.
Sandro279
23.04.2013, 19:04
list p=16f628
;************************************************* *************
;* PORTA: 0 Ziffer 3 -----------------------------------------------------+
;* 1 Ziffer 2 -------------------------------------+ I
;* 2 Ziffer 1 ---------------------+ I I
;* 3 Ziffer 0 -----+ I I I
;* 4 Segment G I I I I
;* PORTB: 0 Segment B AAAAA AAAAA AAAAA AAAAA
;* 1 Segment F F B F B F B F B
;* 2 Segment A F B F B F B F B
;* 3 Pulseingang GGGGG GGGGG GGGGG GGGGG
;* 4 Segment H E C E C E C E C
;* 5 Segment C E C E C E C E C
;* 6 Segment E DDDDD HH DDDDD HH DDDDD HH DDDDD HH
;* 7 Segment D
;
; 7-Segment-Tabelle fuer VQE
;Segmente
; addwf PCL, f
;; 76543210
;; DECHgAFB
; retlw B'00011000' ; 0
; retlw B'11011110' ; 1
; retlw B'00110010' ; 2
; retlw B'01010010' ; 3
; retlw B'11010100' ; 4
; retlw B'01010001' ; 5
; retlw B'00010001' ; 6
; retlw B'11011010' ; 7
; retlw B'00010000' ; 8
; retlw B'01010000' ; 9
; retlw B'11111111' ; dunkel
; retlw B'10110111' ; -
;
; zukuenftig sollte man Segment H weglassen und mit RB4 Segment G treiben
;
;************************************************* *************
;
;sprut (zero) Bredendiek 01/2004 .. 10/2008
;
; Drehzahlmesser fuer PC Luefter mit 16F628
;
; Prozessor 16F628 o.ä.
; Prozessor-Takt 4 MHz
; Meßimpulseingang RB3
;
; Frequenzzähler mit 4-stellige LED-Anzeige
; Messen der Luefterdrehzahl anhand des Tachosignals
; es kommen 2 Pulse pro Umdrehung kommen
;
;
;************************************************* *************
; einige Festlegungen fuer die Division aus der Microchip-Bibliothek AN617
TRUE EQU 1
FALSE EQU 0
P16C5X SET FALSE ; If P16C5X, use INHX8M file format.
P16CXX SET FALSE ; If P16CXX, use INHX8M file format.
P17CXX SET FALSE ; If P17CXX, the INHX32 file format is required
; in the LIST directive
RESET_V SET 0x0000 ; Default Reset Vector address of 0h
; (16Cxx and 17Cxx devices)
P16_MAP1 SET FALSE ; FOR 16C60/61/70/71/84 Memory Map
P16_MAP2 SET FALSE ; For all other 16Cxx Memory Maps
P16CXX SET TRUE ; If P16CXX, use INHX8M file format.
P16_MAP2 SET TRUE
; Includedatei für den 16F628 einbinden
#include <P16f628.INC>
#INCLUDE <MATH16.INC> ; PIC16 math library definitions, belegt 0x20 bis 0x4B
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES
; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF & _LVP_OFF
;************************************************* *************
; Variablen festlegen
; 0x20 bis 0x4B ist durch Divisionsroutine belegt
w_copy equ 0x4D ; nur für INT
s_copy equ 0x4E ; nur für INT
p_copy equ 0x4F ; nur für INT
Flags equ 0x50
Fehler equ 0x51 ; Fehlerregister für Mathematik
; Dezimalstellen
Digit equ 0x52 ; aktuell angezeigte Stelle
Ziffer0 equ 0x53 ; Tausender
Ziffer1 equ 0x54 ; Hunderter
Ziffer2 equ 0x55 ; Zehner
Ziffer3 equ 0x56 ; Einer
HdT equ 0x57 ;4 Tausender
HdH equ 0x58 ;3 Hunderter
HdZ equ 0x59 ;2 Zehner
HdE equ 0x5A ;1 Einer
HdX equ 0x5B ; Puffer für eine Dezimalstelle
;24 Bit Rechenregister
f0 equ 0x5C ;
f1 equ 0x5D ;
f2 equ 0x5E ;
;24 Bit Rechenregister
xw0 equ 0x5F ;
xw1 equ 0x60 ;
xw2 equ 0x61 ;
;24 Bit Rechenregister
g0 equ 0x62 ;
g1 equ 0x63 ;
g2 equ 0x64
; Meßwert wird hier gespeichert
PeriodeL equ 0x65
PeriodeH equ 0x66
; Konstanten festlegen
#define Datenda Flags,6 ; neuer Meßwert wurde gemessen
#define Kommaan Flags,5 ; Dezimalpunkt ein, da neue Messung fertig
Ini_opt equ B'10000100' ; Timer0 int 32:1, pull-up on
;************************************************* *************
org 0
goto Init
;************************************************* *************
; die Interuptserviceroutine
; wird vom capture-Modul ausgeloest
org 4
intvec
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
clrf STATUS
movwf s_copy ;
movf PCLATH, W
movwf p_copy
clrf PCLATH ; Bank 0
; Intrupt servic routine
clrf TMR1L ; Timer 1 zurücksetzen
clrf TMR1H
bcf PIR1,CCP1IF ; Interupt-Flag löschen
btfss PIR1,TMR1IF ; Timer1 übergelaufen?
goto Int_copy ; nein, weitermachen
; ja: Drehzahl zu niedrig, dann Anzeige ' --'
movlw D'10'
movwf Ziffer0 ; tausender Stelle dunkel
movwf Ziffer1 ; hunderter Stelle dunkel
movlw D'11'
movwf Ziffer2
movwf Ziffer3 ; Anzeige ' --'
goto Int_end
Int_copy
; Meßwert retten
movfw CCPR1L
movwf PeriodeL
movfw CCPR1H
movwf PeriodeH
bsf Datenda ; neuen Meßwert melden
bsf Kommaan ; Dezimalpunkt einschalten
Int_end
bcf PIR1,TMR1IF ; Timer1 Überlaufflag löschen
bcf PIR1,CCP1IF ; Interupt-Flag löschen
movf p_copy, W
movwf PCLATH
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
retfie
;************************************************* *************
; 7-Segment-Tabelle
;* PORTB: 0 Segment A AAAAA
;* 1 Segment F F B
;* 2 Segment E F B
;* 3 Segment D GGGGG
;* 4 Segment H E C
;* 5 Segment C E C
;* 6 Segment G DDDDD HH
;* 7 Segment B
;
; 7-Segment-Tabelle fuer VQE
Segmente
addwf PCL, f
; 76543210
; DECHgAFB
retlw B'00011000' ; 0
retlw B'11011110' ; 1
retlw B'00110010' ; 2
retlw B'01010010' ; 3
retlw B'11010100' ; 4
retlw B'01010001' ; 5
retlw B'00010001' ; 6
retlw B'11011010' ; 7
retlw B'00010000' ; 8
retlw B'01010000' ; 9
retlw B'11111111' ; dunkel
retlw B'11110111' ; -
;************************************************* *************
; Routine zum multiplexen Anzeigen am LED-Display
Display
bsf PORTA, 3 ; Ziffer0 aus
bsf PORTA, 2 ; Ziffer1 aus
bsf PORTA, 1 ; Ziffer2 aus
bsf PORTA, 0 ; Ziffer3 aus
bsf PORTA, 4 ; Segmente aus
movlw B'11110111'
iorwf PORTB,f
decf Digit,f ; Ziffernzähler verringern
;anstehende Arbeit:
;Digit=4: falls neuer Meßwert da ist: Rechnen
;Digit=3: anzeigen Ziffer 3 1er
;Digit=2: anzeigen Ziffer 2 10er
;Digit=1: anzeigen Ziffer 1 100er
;Digit=0: anzeigen Ziffer 0 1000er
btfsc STATUS, Z
goto Disp_0 ; Z-Flag=1 ergo Digit=0
decf Digit, w
btfsc STATUS, Z
goto Disp_1 ; Digit=1
btfsc Digit,2
goto Disp_4 ; Digit=4
btfss Digit,0
goto Disp_2 ; Digit=2
goto Disp_3 ; Digit=3
Disp_0
movlw 5
movwf Digit ; Digit wieder auf 5 einstellen
movfw Ziffer0 ; Wert der 1. Ziffer (1000er)
btfss STATUS,Z ; führende '0' wird nicht angezeigt!
bcf PORTA, 3 ; 1. Ziffer einschalten
goto Disp_end
Disp_1
movfw Ziffer1 ; Wert der 2. Ziffer (100er)
bcf PORTA, 2 ; 2. Ziffer einschalten
goto Disp_end
Disp_2
movfw Ziffer2 ; Wert der 3. Ziffer (10er)
bcf PORTA, 1 ; 3. Ziffer einschalten
goto Disp_end
Disp_3
movfw Ziffer3 ; Wert der 3. Ziffer (1er)
bcf PORTA, 0 ; 4. Ziffer einschalten
goto Disp_end
Disp_4
btfsc Datenda ; ist neuer Meßwert da?
call Berechnung ; ja: Drehzahl berechnen
goto Disp_end2 ; keine Segmente einschalten
Disp_end
call Segmente ; 7-Segment-Code für aktuelle Ziffer holen
movwf PORTB ; Segmente einschalten
bsf PORTA,4 ; Segment G nicht vergessen
andlw B'00001000'
btfsc STATUS,Z
bcf PORTA,4
; Dezimalpunkt nur nach Messung ein
btfss Kommaan
goto Disp_end2
;Komma anschalten nach 2. Stelle
decf Digit, w
movfw Digit
btfsc STATUS, Z ; 2. Stelle aktiv?
bcf PORTB,4 ; ja: Dezimalpunkt an
bcf Kommaan ; Dez.p. aus bis zur nächsten Messung
Disp_end2
return
;************************************************* *************
; Das Programm beginnt mit der Initialisierung
Init movlw B'11111111'
movwf PORTB ; LEDs aus
bsf PORTA, 4
bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on; Timer0 32:1 interner Takt
movwf OPTION_REG
movlw B'00001000' ; PortB alle outputs außer RB3
movwf TRISB
movlw B'11100000' ; PortRA0..4 outputs
movwf TRISA
bcf STATUS, RP0 ; Bank 0
movlw B'11111111'
movwf PORTB ; LEDs aus
bsf PORTA, 4
; 16F628 alle Comparatoreingänge auf Digital umschalten
BSF CMCON, CM0
BSF CMCON, CM1
BSF CMCON, CM2
clrf INTCON ; Interupt disable
; Anzeige initialisieren
movlw 4
movwf Digit
movlw D'11'
movwf Ziffer0
movwf Ziffer1
movwf Ziffer2
movwf Ziffer3 ; Anzeige '----'
; Timer0 initialisieren für LED-Multiplex-Anzeige
; 16:1 Vorteiler.
; Immer nach 256 x 16 Zyklen (~4.1 ms) läuft der Timer0 über -> 244 Hz
; da ein Anzeigezyklus aud 5 Schritten besteht, -> 49 Hz Anzeigefrequenz = flackerfrei
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000011' ; internen Takt zählen, Vorteiler zum Timer0, 16:1
movwf OPTION_REG
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf TMR0
bcf INTCON, T0IE ; Timer0 interupt verbieten
bsf INTCON, GIE ; Interupt erlauben
bcf INTCON, T0IF ; Flag löschen
; Timer1 auf 8µs-Takt einstellen für Messung
; interner Takt, Vorteiler 8:1
; 4MHz / 4 / 8 = 125 kHz
movlw B'00110001' ; internen Takt zählen, Vorteiler 8:1
movwf T1CON
; Capture Mode
movlw B'00000110' ; Capture mode, jede 4. steigende Flanke
movwf CCP1CON
; als Lebenszeichen auf der hintersten Stelle ein Punkt
bcf PORTB, 4 ; Dezimalpunkt
bcf PORTA, 0 ; 4. Ziffer einschalten
; Messung erst starten, wenn 2x Capturen erfolgte
; damit der 1. Meßwert schon richtig ist
clrf TMR1L
clrf TMR1H
bcf PIR1,CCP1IF
sync1
btfss PIR1,CCP1IF
goto sync1
clrf TMR1L
clrf TMR1H
bcf PIR1,CCP1IF
bcf PIR1,TMR1IF
; int erlauben
bsf STATUS, RP0 ; auf Bank 1 umschalten
clrf PIE1
bsf PIE1,CCP1IE
bcf STATUS, RP0 ; auf Bank 0
bcf Datenda
clrf INTCON
bsf INTCON,PEIE
bsf INTCON,GIE
; Anzeigeschleife
disploop
btfss INTCON, T0IF
goto disploop
bcf INTCON, T0IF
call Display
goto disploop
;************************************************* *************
; Neuberechnung des Anzeigewerts
Berechnung
; Meßwert in xw laden
bcf INTCON,GIE
movfw PeriodeL
movwf xw0
movfw PeriodeH
movwf xw1
clrf xw2
bsf INTCON,GIE
; falls Drehzahl zu hoch, dann Anzeige '----'
movlw D'11'
movwf Ziffer0
movwf Ziffer1
movwf Ziffer2
movwf Ziffer3 ; Anzeige '----'
; bei Meßwerten<3x512 abbrechen (Fehlmessung oder >9765 rpm)
; 06-00 = 0000.0110-0000.0000
movlw 0x06
subwf xw1, w
btfss STATUS,C
goto BerLoop ; Messergebnis zu klein, Drehzahl zu hoch
movfw xw2
; Drehzahl ist nicht zu hoch, Berechnung kann beginnen
Ber1
; 15 000 000 durch Meßwert teilen
; 15 000 000 = E4 E1 C0
; 15 000 000 nach f laden
movlw 0xE4
movwf f2
movlw 0xE1
movwf f1
movlw 0xC0
movwf f0
; nun durch den Meßwert dividieren
call Div24 ; f:= f / xw
debug
; Divisionsergebnis in BCD wandeln & anzeigen (4-stellig)
call OutDez16
; wieder in den Timer0-Rythmus synchronisieren,
; da ansonsten letze Displaystelle dunkler erscheint
bcf INTCON, T0IF
BerLoop
btfss INTCON, T0IF
goto BerLoop
bcf INTCON, T0IF
bcf Datenda ; Berechnung des Meßwertes erledigt
return
;************************************************* *************
;+++Mathematik-Routinen ***************************************
;************************************************* *************
; 24 Bit Subtraktion, bei Überlauf (neg. Ergebnis) ist C gesetzt
Sub24 ; 24 bit f:=f-xw calc=xw cnt=f
clrf Fehler ; extraflags löschen
movf xw0, w ; f0=f0-xw0
subwf f0, f
btfsc STATUS,C
goto sb0
movlw 0x01 ; borgen von f1
subwf f1, f
btfsc STATUS,C
goto sb0
subwf f2 ,f ; borgen von f2
btfss STATUS,C
bsf Fehler, C ; unterlauf
sb0 movf xw1, w ; f1=f1-xw1
subwf f1, f
btfsc STATUS,C
goto sb1
movlw 0x01 ; borgen von f2
subwf f2 ,f
btfss STATUS,C
bsf Fehler, C ; Unterlauf
sb1 movf xw2,w ; f2=f2-xw2
subwf f2, f
btfss STATUS,C
bsf Fehler, C ; Unterlauf
bcf STATUS, C
btfsc Fehler, C
bsf STATUS, C
return
;************************************************* *************
;24 bit Adition, C-Flag bei Überlauf gesetzt
Add24 ; 24-bit add: f = f + xw
movf xw0,w ; low byte
addwf f0,f ; low byte add
movf xw1,w ; next byte
btfsc STATUS,C ; skip to simple add if C was reset
incfsz xw1,w ; add C if it was set
addwf f1,f ; high byte add if NZ
movf xw2,w ; high byte
btfsc STATUS,C ; überspringe falls C nicht gesetzt
incfsz xw2,w ; addiere C falls gesetzt
addwf f2,f ; next byte add wenn NZ
return ; fertig
;************************************************* *************
; 24 bit Division f:= f / xw
; aus der Microchip-Bibliothek AN617
; AARG := AARG / BARG
; Microchip numeriert die Bytes anders herum als ich: aufpassen!
; A0-A1-A2-A3 B0-B1-B2
; f3-f2-f1-f0 x2-x2-x0
Div24
MOVFW f0
MOVWF AARGB3
MOVFW f1
MOVWF AARGB2
MOVFW f2
MOVWF AARGB1
MOVLW 0x00
MOVWF AARGB0
MOVFW xw0
MOVWF BARGB2
MOVFW xw1
MOVWF BARGB1
MOVFW xw2
MOVWF BARGB0
CALL FXD3224S
MOVFW AARGB3
MOVWF f0
MOVFW AARGB2
MOVWF f1
MOVFW AARGB1
MOVWF f2
return
;************************************************* *************
; positiven 16 Bit Wert (f1,f0) in 4 dezimale Ziffern wandeln
OutDez16
call Hex2Dez16 ; 16-bit(f1,f0) in 4-stellen Bcd (T,H,Z,E)
movfw HdT
movwf Ziffer0
movfw HdH
movwf Ziffer1
movfw HdZ
movwf Ziffer2
movfw HdE
movwf Ziffer3
return
; 16-bit(f1,f0) in 4-stellen Bcd (T,H,Z,E)
; 1000 = 0000 03E8 h
; 100 = 0000 0064 h
; 10 = 0000 000A h
; 1 = 0000 0001 h
Hex2Dez16
clrf f2
movlw 0x00 ; 1000 = 0000 03E8 h
movwf xw2
movlw 0x03
movwf xw1
movlw 0xE8
movwf xw0
clrf HdX
decf HdX, f
HdLoop5
incf HdX, f
call Sub24
btfss STATUS, C ; Überlauf
goto HdLoop5 ; Stelle 1 mehr
call Add24
movfw HdX
movwf HdT
movlw 0x00 ; 100 = 00 00 64 h
movwf xw2
movwf xw1
movlw 0x64
movwf xw0
clrf HdX
decf HdX, f
HdLoop3
incf HdX, f
call Sub24
btfss STATUS, C ; Überlauf
goto HdLoop3 ; Stelle 1 mehr
call Add24
movfw HdX
movwf HdH
movlw 0x00 ; 10 = 00 00 0A h
movwf xw2
movwf xw1
movlw 0x0A
movwf xw0
clrf HdX
decf HdX, f
HdLoop4
incf HdX, f
call Sub24
btfss STATUS, C ; Überlauf
goto HdLoop4 ; Stelle 1 mehr
call Add24
movfw HdX
movwf HdZ
movfw f0
movwf HdE
return
; Microchip-Bibliothek AN617
;************************************************* *************
; All arguments to the fixed point routines in the math library are passed through
; the locations
; AARGB0,AARGB1,AARGB2,AARGB3
; BARGB0,BARGB1,BARGB2,BARGB3
; with the result in
; AARGB0,AARGB1,AARGB2,AARGB3,AARGB4,AARGB5,AARGB6,A ARGB7
; All fixed point operands are left justified to xARGB0, and are either unsigned or
; in signed two's complement representation.
; To divide the 32 bit signed integer AARG = 0x83-5A-3F-C1 the the 24 bit signed integer
; BARG = 0x5C-3B-E5, simply load AARG and BARG with the appropriate values and call
; FXD3224S. The 32 bit signed quotient, 0xFF-FF-FE-A7, is left justified in AARG and the
; 24 bit signed remainder, 0xA6-F7-5E, is left justified in REM.
#INCLUDE <FXD24.A16>
end
Also wie diese Source es offen legt stammt sie von der Homepage von Sprut (http://www.sprut.de). Das ist eine Seite, die ausschließlich von einer Privatperson verwaltet wird und nur Wissen an private Menschen vermitteln soll. Leider werden seine Projekte immer wieder für den Kommerziellen vertrieb genutzt (ohne das Wissen des Autors). Solltest du einen Bausatz gekauft haben (Beispiel eBay), dann ist das ganze eine 100% negative Bewertung wert, sowie einen Vermerk an den Betreiber der Vertriebsseite.
Solltest du den Drehzahlmesser so selber nur nachgebaut haben bin ich sehr enttäuscht, das wir nichts über die Quelle erfahren haben (http://www.sprut.de/electronic/pic/projekte/dehfan/drehfan.htm).
Naja, als Privatperson unterstütze ich gerne. Ich habe dir mal die überarbeiteten Quellen im Anhang. Um im weiteren Verlauf die Auswertgeschwindigkeit erhöhen zu können habe ich lieber den Vorteiler des Timer 1 von 1:8 auf 1:4 angepasst.
Gruß Rico
(Zip-Download: http://www.file-upload.net/download-7508525/drehzahlmesser.zip.html)
Sorry wenn ich da jetzt etwas -Offtopic- werde, aber ich habe folgenden einfachen Digi Drehzahlmesser in 2 Varianten erfolgreich gebaut:
Keine Programmierung oder µC nötig, einfacher Lochraster reicht...
http://www.digitaler-drehzahlmesser.de/
Auf der Seite mit der maus über "Drehzahlmesser" fahren, dann kommen die Unterseiten. Im download Bereich gibts Schaltpläne etc.
Die sehr einfache Schaltung macht aus der Zündspulenfrequenz eine Spannung, und diese Spannung wird dann über Spannungsteiler auf mehrere ICs verteilt
die jeweils ihre paar LEDs passend bestromen. Von deren Anzahl hängt auch die maximale Auflösung/ LED Zahl ab.
Der Drehzahlmesser braucht zum Glück kein TÜV, solang er nicht den Tacho o.ä. verdeckt. Bei mir gabs dort keine Probleme damit.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.