PICture
23.04.2009, 13:21
Hallo!
Zuletzt habe ich mir einen kleinen (80x40x28 mm) einfachen mit einem 2,4 V / 140 mAh (Varta 110) betriebenen Frequenzzähler mit dem LPH2673-1 Display von Pollin gebaut. Ich habe wegen minimalsten Stromverbrauch keinen Eingangsverstärker eingebaut. Die Skizze der Hardware und der ASM Quellcode befinden sich im Code.
Das Programm basiert auf dem in unserem Wiki erklärtem, wo die leere Schleife durch eine endlose Schleife fürs Display ersetzt wurde.
Der Frequenzzähler misst 1 s und als Ergebnis werden max. 6 Ziffer ohne führenden Nullen in zwei Bereichen angezeigt. Ohne Doppelpunkt wird die Frequenz in Hz dargestellt und der sichtbare Doppelpunkt zeigt, dass die gemessene Frequenz mindestens 1 MHz ist und trent die zwei MHz stellen von den anderen. Für einen Uhrenquarz wird 32768 und für 16 MHz 16:0000 gezeigt.
Das Display wurde "auf dem Kopf gestellt" damit sich der Doppelpunkt auf der richtiger Stelle befindet. Genauere Beschreibung der Funktionsweise ist in: https://www.roboternetz.de/community/threads/23308-Testprogramm-f%C3%BCr-LPH2673-1 . Zum Laden des Akkus wurde an die Spitze und GND Krokoklemme durch Zeitschaltuhr angeschlossenes stabiliesiertes Netzgerät +5 V vorgesehen. Der Stromverbrauch bei 2,4V beträgt ca. 2,7 mA.
Weil das Programm ziemlich groß ist, musste ich es auf zwei Beiträge verteilen. Die beide Teile muss man in eine Datei nacheinander kopieren.
MfG
Ziffer 1 2 3 4 5 6
-------------------------------------------- a
| -- -- -- -- -- -- | ---
| | | | | PROG | | | | o | | | | STOP | f| g |b
| -- -- -- -- -- -- | ---
| | | | | DATE | | | | o | | | | START | e| |c
| -- -- -- -- -- -- | ---
-------------------------------------------- d
Pin1| | | | | | | | | | | | | | | | | | |Pin19
--------------------------------------------------------------------------
|Seg1|Sg2|Sg3|Sg4|Sg5|Seg6|Sg7|Sg8|Sg9|S10|Sg11|Sg 12|Sg13|Sg14|Sg15|Seg16|
-------------------------------------------------------------------------------
|Com3|STOP| a1| b1| a2| b2|DATE| a3| b3| a4| b4| dp | a5 | b5 | a6 | b6 |START|Pin19
-------------------------------------------------------------------------------
|Com2| - | f1| g1| f2| g2| c2 | f3| g3| f4| g4| c4 | f5 | g5 | f6 | g6 | c6 |Pin18
-------------------------------------------------------------------------------
|Com1|PROG| e1| d1| c1| e2| d2 | e3| d3| c3| e4| d4 | e5 | d5 | c5 | e6 | d6 |Pin17
-------------------------------------------------------------------------------
Pin1 P2 Pin3 Pin4 P5 Pin6 Pin7 P8 P9 P10 P11 Pin12 P13 Pin14 P15 Pin16
VCC
+
| ___
10k +-|___|-+
|
___ |
10k +-|___|-+
| |
| \] |
100µ +--|]---+
| /]+ |
=== .-.
GND Rs*| |
6k8| |
'-'
18x150k (2 Netzwerke 9x150k) |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | | | | |
| .-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-.
| | || || || || || || || || || || || || || || || || || |
| | || || || || || || || || || || || || || || || || || |
| '-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-'
| | | | | | | | | | | | | | | | | | |
V V V V V V V V V V V V V V V V V V V Display
1 19
220
___
+-----------------------|___|--+
| .----U----. |
| -|VPP B7|- |
| D19<-|A0 B6|->D2 o
| D18<-|A1 B5|->D3 __--o-+
| D17<-|A2 B4|->D4 +-o |
| ___ -|A3 B3|->D5 | |+
Spitze <-----+-|___|-|A4 B2|->D6 | -
470 -|A5 B1|->D7 +--+ ---
+--+----------------|VDD B0|->D8 | | | Akku
| | || /----------|OSC1 VCC|-------+ --- - 2,4V
=== +-||-+22p+-------|OSC2 VDD|-------+ --- µ1 ---
GND | || | | D16<-|C0 C7|->D9 | | |-
| _-_ | D15<-|C1 C6|->D10 +--+-------+
| |___| | D14<-|C2 C5|->D11 |
| - | D13<-|C3 C4|->D12 |
| || | | '---------' |
+-||-+---+ PIC16F870 |
|| 7,3728 MHz \|/
X
22p / \
/ \
D2...D19 - Displaypins GND
; Programm zum Messen der Frequenz am T0CKI Pin mit 7,3728 MHz Quarz und Display LPH2673-1
LIST P=16F870
include "P16F870.inc"
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
; TOCKI PORTA,4 ;I Frequenzeingang
#define _C STATUS,C
#define _Z STATUS,Z
#define _DC STATUS,DC
#define _RP0 STATUS,RP0
#define _Fcra Flags,0
#define _Fcrp Flags,1
#define _Fdca Flags,2
#define _Ferr Flags,3 ;Überlauf (Fehler)
#define _Frs Flags,4
#define _Fnz Flags,5
#define _Flow Flags,6
#define _Ftmp Flags,7 ;Zwischenspeicher
#define DATE TB3,2 ;Segmentszuweisung
#define START TC3,0
#define dp TC3,5 ;Doppelpunkt
#define a1 TB3,6
#define b1 TB3,5
#define c1 TB1,4
#define d1 TB1,5
#define e1 TB1,6
#define f1 TB2,6
#define g1 TB2,5
#define a2 TB3,4
#define b2 TB3,3
#define c2 TB2,2
#define d2 TB1,2
#define e2 TB1,3
#define f2 TB2,4
#define g2 TB2,3
#define a3 TB3,1
#define b3 TB3,0
#define c3 TC1,7
#define d3 TB1,0
#define e3 TB1,1
#define f3 TB2,1
#define g3 TB2,0
#define a4 TC3,7
#define b4 TC3,6
#define c4 TC2,5
#define d4 TC1,5
#define e4 TC1,6
#define f4 TC2,7
#define g4 TC2,6
#define a5 TC3,4
#define b5 TC3,3
#define c5 TC1,2
#define d5 TC1,3
#define e5 TC1,4
#define f5 TC2,4
#define g5 TC2,3
#define a6 TC3,2
#define b6 TC3,1
#define c6 TC2,0
#define d6 TC1,0
#define e6 TC1,1
#define f6 TC2,2
#define g6 TC2,1
;Com1 PORTA,2 ;Portszuweisung
;Com2 PORTA,1
;Com3 PORTA,0
;Seg1 PORTB,7
;Seg2 PORTB,6
;Seg3 PORTB,5
;Seg4 PORTB,4
;Seg5 PORTB,3
;Seg6 PORTB,2
;Seg7 PORTB,1
;Seg8 PORTB,0
;Seg9 PORTC,7
;Seg10 PORTC,6
;Seg11 PORTC,5
;Seg12 PORTC,4
;Seg13 PORTC,3
;Seg14 PORTC,2
;Seg15 PORTC,1
;Seg16 PORTC,0
A3 equ 20 ;Register fürs Rechnen Hex_Dec
A2 equ 21
A1 equ 22
A0 equ 23
B3 equ 24
B2 equ 25
B1 equ 26
B0 equ 27
C3 equ 28
C2 equ 29
C1 equ 2A
C0 equ 2B
D3 equ 2C
D2 equ 2D
D1 equ 2E
D0 equ 2F
Flags equ 30
Tmp equ 31 ;vorläufige Register
ATmp equ 32
HTmp equ 33 ;Zwischenspeicher
RTmp equ 34
DTmp equ 35 ;temporary (temp) für Display
DTmp1 equ 36
PA equ 37 ;temp für PORTA
PB equ 38 ;temp für PORTB
PC equ 39 ;temp für PORTC
TA1 equ 3A ;temp für TRISA bei Com1
TA2 equ 3B ;temp für TRISA bei Com2
TA3 equ 3C ;temp für TRISA bei Com3
TB1 equ 3D ;temp für TRISB bei Com1
TB2 equ 3E ;temp für TRISB bei Com2
TB3 equ 3F ;temp für TRISB bei Com3
TC1 equ 40 ;temp für TRISC bei Com1
TC2 equ 41 ;temp für TRISC bei Com2
TC3 equ 42 ;temp für TRISC bei Com3
SWR equ 43 ;sicherung vom W-Register
SSR equ 44 ;Sicherung vom STATUS-Register
ORG 0
call Init ;alles initialisieren
Main goto DispLoop ;und in die endlose Schleife springen
ORG 4 ;hier fängt ISR (interrupt service routine) an
bcf INTCON,GIE ;alle interrupts sperren
movwf SWR ;W-Register sichern
movf STATUS,0 ;STATUS Register
movwf SSR ;sichern
btfss INTCON,T0IF ;ist Timer0 überlaufen ?
goto CheckTMR1 ;nein, dann prüfe Timer1
bcf INTCON,T0IF ;ja, Timer0 interrupt flag löschen und bearbeiten
movlw 1
addwf A2,1 ;erhöhe A2 durch Addition
btfsc _C ;um Überlauf von A2 zu erkennen und
incf A3,1 ;increment A3, wenn A2 überlaufen ist
CheckTMR1 btfss PIR1,TMR1IF ;ist Timer1 überlaufen ?
goto ISREnd ;nein, dann ISR beenden und interrupts erlauben
bcf PIR1,TMR1IF ;Timer1 interrupt flag löschen
call Multip ;Interrupts vom Timer1 im UP "Multip" zählen
ISREnd movf SSR,0 ;STATUS Register
movwf STATUS ;wiederherstellen
movf SWR,0 ;W-Register wiederherstellen
retfie ;ISR beenden und interrupts erlauben
Multip incf Tmp,1 ;Interruptszähler von Timer1 erhöhen
btfss Tmp,2 ;schon 4.interrupt?
return ;nein, dann zurück
bsf _RP0 ;ja, weiter
movf TRISA,0 ;stopp Timer 0 usw.
andlw 0xEF
movwf TRISA ;TOCKI Pin (A4) als Ausgang
bcf _RP0
bcf T1CON,TMR1ON ;stopp Timer1
GetFreq movf TMR0,0 ;Prescaler ins Register A0 kopieren
movwf A1
movwf RTmp
clrf ATmp
incf ATmp,1
bsf _RP0
bsf OPTION_REG,T0SE
bcf OPTION_REG,T0SE
bcf _RP0
movf TMR0,0
subwf RTmp,0
btfsc _Z
goto $-8
comf ATmp,1
incf ATmp,0
movwf A0
GetFreq1 call Hex_Dec ;Messergebnis auf Decimal wandeln
call DispSet ;und auf das Display übergeben
call AClr
clrf Tmp
call TMRStart ;beide Timer starten
return
AClr clrf A0 ;Register A löschen
clrf A1
clrf A2
clrf A3
return
TMRStart clrf TMR0 ;TMR0 und Prescaler löschen
movlw 30 ;Timer1 konfigurieren
movwf T1CON ;(Psc=8) und laden
movlw 7B ;berechneter Wert: TMR1H=7Ch
movwf TMR1H
movlw 0xF8 ;berechneter Wert: TMR1L=0
movwf TMR1L
bsf _RP0 ;start Timer0
movf TRISA,0
iorlw 10
movwf TRISA ;TOCKI Pin (A4)als Eingang
bcf _RP0
bsf T1CON,TMR1ON ;start Timer1
return
Hex_Dec call DClr ;Hex>A, D>Dec
movlw 1
movwf C0
movlw 20 ;32 bit Hex > 32 bit Dec (8 Stellen)
movwf HTmp
btfsc A0,0
call AddDC
call CopyCB
call AddCB
call ARotRb
decfsz HTmp,1
goto $-6
return
DClr clrf D0
clrf D1
clrf D2
clrf D3
clrf C0
clrf C1
clrf C2
clrf C3
return
CopyCB movf C0,0
movwf B0
movf C1,0
movwf B1
movf C2,0
movwf B2
movf C3,0
movwf B3
return
AddCB movlw B0 ;C+B>C
movwf FSR
goto AddR
AddDC movlw C0 ;D+C>D
movwf FSR
AddR bcf _Ferr ;Addiere zwei Register
bcf _Fcrp
movlw 4 ;X=4 Bytes lang
movwf ATmp
bcf _Fdca
bcf _Fcra
movf INDF,0
movwf RTmp
movlw 4 ;X=4
addwf FSR,1
btfss _Fcrp
goto $+4
movlw 1
addwf INDF,1
call DecCor
movf RTmp,0
addwf INDF,1
call DecCor
btfss _Fdca
goto $+3
movlw 6
addwf INDF,1
btfss _Fcra
goto $+5
movlw 60
addwf INDF,1
btfsc _C
bsf _Fcra
movf INDF,0
andlw 0xF0
sublw 0xA0
btfss _Z
goto $+6
movf INDF,0
andlw 0x0F
clrf INDF
addwf INDF,1
bsf _Fcra
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movlw 5 ;X+1=5
subwf FSR,1
decfsz ATmp,1
goto $-28
btfsc _Fcra
bsf _Ferr
return
DecCor btfsc _DC ;dezimale Korrektur (equ "DAW" bei PIC18FXXX)
bsf _Fdca
btfsc _C
bsf _Fcra
movf INDF,0
andlw 0F
sublw 9
btfss _C
bsf _Fdca
movf INDF,0
andlw 0xF0
sublw 90
btfss _C
bsf _Fcra
return
ARotRb movlw A3 ;rotiere A Register 1 Bit rechts
movwf FSR
RRotRb movlw 4 ;rotiere X=4 Bytes
movwf ATmp
bcf _Fcrp
btfsc A0,0
bsf _Fcrp
bcf _Fcra
btfsc INDF,0
bsf _Fcra
bcf _C
btfsc _Fcrp
bsf _C
rrf INDF,1
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
incf FSR,1
decfsz ATmp,1
goto $-0C ;RRotRbL
return
Zuletzt habe ich mir einen kleinen (80x40x28 mm) einfachen mit einem 2,4 V / 140 mAh (Varta 110) betriebenen Frequenzzähler mit dem LPH2673-1 Display von Pollin gebaut. Ich habe wegen minimalsten Stromverbrauch keinen Eingangsverstärker eingebaut. Die Skizze der Hardware und der ASM Quellcode befinden sich im Code.
Das Programm basiert auf dem in unserem Wiki erklärtem, wo die leere Schleife durch eine endlose Schleife fürs Display ersetzt wurde.
Der Frequenzzähler misst 1 s und als Ergebnis werden max. 6 Ziffer ohne führenden Nullen in zwei Bereichen angezeigt. Ohne Doppelpunkt wird die Frequenz in Hz dargestellt und der sichtbare Doppelpunkt zeigt, dass die gemessene Frequenz mindestens 1 MHz ist und trent die zwei MHz stellen von den anderen. Für einen Uhrenquarz wird 32768 und für 16 MHz 16:0000 gezeigt.
Das Display wurde "auf dem Kopf gestellt" damit sich der Doppelpunkt auf der richtiger Stelle befindet. Genauere Beschreibung der Funktionsweise ist in: https://www.roboternetz.de/community/threads/23308-Testprogramm-f%C3%BCr-LPH2673-1 . Zum Laden des Akkus wurde an die Spitze und GND Krokoklemme durch Zeitschaltuhr angeschlossenes stabiliesiertes Netzgerät +5 V vorgesehen. Der Stromverbrauch bei 2,4V beträgt ca. 2,7 mA.
Weil das Programm ziemlich groß ist, musste ich es auf zwei Beiträge verteilen. Die beide Teile muss man in eine Datei nacheinander kopieren.
MfG
Ziffer 1 2 3 4 5 6
-------------------------------------------- a
| -- -- -- -- -- -- | ---
| | | | | PROG | | | | o | | | | STOP | f| g |b
| -- -- -- -- -- -- | ---
| | | | | DATE | | | | o | | | | START | e| |c
| -- -- -- -- -- -- | ---
-------------------------------------------- d
Pin1| | | | | | | | | | | | | | | | | | |Pin19
--------------------------------------------------------------------------
|Seg1|Sg2|Sg3|Sg4|Sg5|Seg6|Sg7|Sg8|Sg9|S10|Sg11|Sg 12|Sg13|Sg14|Sg15|Seg16|
-------------------------------------------------------------------------------
|Com3|STOP| a1| b1| a2| b2|DATE| a3| b3| a4| b4| dp | a5 | b5 | a6 | b6 |START|Pin19
-------------------------------------------------------------------------------
|Com2| - | f1| g1| f2| g2| c2 | f3| g3| f4| g4| c4 | f5 | g5 | f6 | g6 | c6 |Pin18
-------------------------------------------------------------------------------
|Com1|PROG| e1| d1| c1| e2| d2 | e3| d3| c3| e4| d4 | e5 | d5 | c5 | e6 | d6 |Pin17
-------------------------------------------------------------------------------
Pin1 P2 Pin3 Pin4 P5 Pin6 Pin7 P8 P9 P10 P11 Pin12 P13 Pin14 P15 Pin16
VCC
+
| ___
10k +-|___|-+
|
___ |
10k +-|___|-+
| |
| \] |
100µ +--|]---+
| /]+ |
=== .-.
GND Rs*| |
6k8| |
'-'
18x150k (2 Netzwerke 9x150k) |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | | | | |
| .-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-.
| | || || || || || || || || || || || || || || || || || |
| | || || || || || || || || || || || || || || || || || |
| '-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-''-'
| | | | | | | | | | | | | | | | | | |
V V V V V V V V V V V V V V V V V V V Display
1 19
220
___
+-----------------------|___|--+
| .----U----. |
| -|VPP B7|- |
| D19<-|A0 B6|->D2 o
| D18<-|A1 B5|->D3 __--o-+
| D17<-|A2 B4|->D4 +-o |
| ___ -|A3 B3|->D5 | |+
Spitze <-----+-|___|-|A4 B2|->D6 | -
470 -|A5 B1|->D7 +--+ ---
+--+----------------|VDD B0|->D8 | | | Akku
| | || /----------|OSC1 VCC|-------+ --- - 2,4V
=== +-||-+22p+-------|OSC2 VDD|-------+ --- µ1 ---
GND | || | | D16<-|C0 C7|->D9 | | |-
| _-_ | D15<-|C1 C6|->D10 +--+-------+
| |___| | D14<-|C2 C5|->D11 |
| - | D13<-|C3 C4|->D12 |
| || | | '---------' |
+-||-+---+ PIC16F870 |
|| 7,3728 MHz \|/
X
22p / \
/ \
D2...D19 - Displaypins GND
; Programm zum Messen der Frequenz am T0CKI Pin mit 7,3728 MHz Quarz und Display LPH2673-1
LIST P=16F870
include "P16F870.inc"
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
; TOCKI PORTA,4 ;I Frequenzeingang
#define _C STATUS,C
#define _Z STATUS,Z
#define _DC STATUS,DC
#define _RP0 STATUS,RP0
#define _Fcra Flags,0
#define _Fcrp Flags,1
#define _Fdca Flags,2
#define _Ferr Flags,3 ;Überlauf (Fehler)
#define _Frs Flags,4
#define _Fnz Flags,5
#define _Flow Flags,6
#define _Ftmp Flags,7 ;Zwischenspeicher
#define DATE TB3,2 ;Segmentszuweisung
#define START TC3,0
#define dp TC3,5 ;Doppelpunkt
#define a1 TB3,6
#define b1 TB3,5
#define c1 TB1,4
#define d1 TB1,5
#define e1 TB1,6
#define f1 TB2,6
#define g1 TB2,5
#define a2 TB3,4
#define b2 TB3,3
#define c2 TB2,2
#define d2 TB1,2
#define e2 TB1,3
#define f2 TB2,4
#define g2 TB2,3
#define a3 TB3,1
#define b3 TB3,0
#define c3 TC1,7
#define d3 TB1,0
#define e3 TB1,1
#define f3 TB2,1
#define g3 TB2,0
#define a4 TC3,7
#define b4 TC3,6
#define c4 TC2,5
#define d4 TC1,5
#define e4 TC1,6
#define f4 TC2,7
#define g4 TC2,6
#define a5 TC3,4
#define b5 TC3,3
#define c5 TC1,2
#define d5 TC1,3
#define e5 TC1,4
#define f5 TC2,4
#define g5 TC2,3
#define a6 TC3,2
#define b6 TC3,1
#define c6 TC2,0
#define d6 TC1,0
#define e6 TC1,1
#define f6 TC2,2
#define g6 TC2,1
;Com1 PORTA,2 ;Portszuweisung
;Com2 PORTA,1
;Com3 PORTA,0
;Seg1 PORTB,7
;Seg2 PORTB,6
;Seg3 PORTB,5
;Seg4 PORTB,4
;Seg5 PORTB,3
;Seg6 PORTB,2
;Seg7 PORTB,1
;Seg8 PORTB,0
;Seg9 PORTC,7
;Seg10 PORTC,6
;Seg11 PORTC,5
;Seg12 PORTC,4
;Seg13 PORTC,3
;Seg14 PORTC,2
;Seg15 PORTC,1
;Seg16 PORTC,0
A3 equ 20 ;Register fürs Rechnen Hex_Dec
A2 equ 21
A1 equ 22
A0 equ 23
B3 equ 24
B2 equ 25
B1 equ 26
B0 equ 27
C3 equ 28
C2 equ 29
C1 equ 2A
C0 equ 2B
D3 equ 2C
D2 equ 2D
D1 equ 2E
D0 equ 2F
Flags equ 30
Tmp equ 31 ;vorläufige Register
ATmp equ 32
HTmp equ 33 ;Zwischenspeicher
RTmp equ 34
DTmp equ 35 ;temporary (temp) für Display
DTmp1 equ 36
PA equ 37 ;temp für PORTA
PB equ 38 ;temp für PORTB
PC equ 39 ;temp für PORTC
TA1 equ 3A ;temp für TRISA bei Com1
TA2 equ 3B ;temp für TRISA bei Com2
TA3 equ 3C ;temp für TRISA bei Com3
TB1 equ 3D ;temp für TRISB bei Com1
TB2 equ 3E ;temp für TRISB bei Com2
TB3 equ 3F ;temp für TRISB bei Com3
TC1 equ 40 ;temp für TRISC bei Com1
TC2 equ 41 ;temp für TRISC bei Com2
TC3 equ 42 ;temp für TRISC bei Com3
SWR equ 43 ;sicherung vom W-Register
SSR equ 44 ;Sicherung vom STATUS-Register
ORG 0
call Init ;alles initialisieren
Main goto DispLoop ;und in die endlose Schleife springen
ORG 4 ;hier fängt ISR (interrupt service routine) an
bcf INTCON,GIE ;alle interrupts sperren
movwf SWR ;W-Register sichern
movf STATUS,0 ;STATUS Register
movwf SSR ;sichern
btfss INTCON,T0IF ;ist Timer0 überlaufen ?
goto CheckTMR1 ;nein, dann prüfe Timer1
bcf INTCON,T0IF ;ja, Timer0 interrupt flag löschen und bearbeiten
movlw 1
addwf A2,1 ;erhöhe A2 durch Addition
btfsc _C ;um Überlauf von A2 zu erkennen und
incf A3,1 ;increment A3, wenn A2 überlaufen ist
CheckTMR1 btfss PIR1,TMR1IF ;ist Timer1 überlaufen ?
goto ISREnd ;nein, dann ISR beenden und interrupts erlauben
bcf PIR1,TMR1IF ;Timer1 interrupt flag löschen
call Multip ;Interrupts vom Timer1 im UP "Multip" zählen
ISREnd movf SSR,0 ;STATUS Register
movwf STATUS ;wiederherstellen
movf SWR,0 ;W-Register wiederherstellen
retfie ;ISR beenden und interrupts erlauben
Multip incf Tmp,1 ;Interruptszähler von Timer1 erhöhen
btfss Tmp,2 ;schon 4.interrupt?
return ;nein, dann zurück
bsf _RP0 ;ja, weiter
movf TRISA,0 ;stopp Timer 0 usw.
andlw 0xEF
movwf TRISA ;TOCKI Pin (A4) als Ausgang
bcf _RP0
bcf T1CON,TMR1ON ;stopp Timer1
GetFreq movf TMR0,0 ;Prescaler ins Register A0 kopieren
movwf A1
movwf RTmp
clrf ATmp
incf ATmp,1
bsf _RP0
bsf OPTION_REG,T0SE
bcf OPTION_REG,T0SE
bcf _RP0
movf TMR0,0
subwf RTmp,0
btfsc _Z
goto $-8
comf ATmp,1
incf ATmp,0
movwf A0
GetFreq1 call Hex_Dec ;Messergebnis auf Decimal wandeln
call DispSet ;und auf das Display übergeben
call AClr
clrf Tmp
call TMRStart ;beide Timer starten
return
AClr clrf A0 ;Register A löschen
clrf A1
clrf A2
clrf A3
return
TMRStart clrf TMR0 ;TMR0 und Prescaler löschen
movlw 30 ;Timer1 konfigurieren
movwf T1CON ;(Psc=8) und laden
movlw 7B ;berechneter Wert: TMR1H=7Ch
movwf TMR1H
movlw 0xF8 ;berechneter Wert: TMR1L=0
movwf TMR1L
bsf _RP0 ;start Timer0
movf TRISA,0
iorlw 10
movwf TRISA ;TOCKI Pin (A4)als Eingang
bcf _RP0
bsf T1CON,TMR1ON ;start Timer1
return
Hex_Dec call DClr ;Hex>A, D>Dec
movlw 1
movwf C0
movlw 20 ;32 bit Hex > 32 bit Dec (8 Stellen)
movwf HTmp
btfsc A0,0
call AddDC
call CopyCB
call AddCB
call ARotRb
decfsz HTmp,1
goto $-6
return
DClr clrf D0
clrf D1
clrf D2
clrf D3
clrf C0
clrf C1
clrf C2
clrf C3
return
CopyCB movf C0,0
movwf B0
movf C1,0
movwf B1
movf C2,0
movwf B2
movf C3,0
movwf B3
return
AddCB movlw B0 ;C+B>C
movwf FSR
goto AddR
AddDC movlw C0 ;D+C>D
movwf FSR
AddR bcf _Ferr ;Addiere zwei Register
bcf _Fcrp
movlw 4 ;X=4 Bytes lang
movwf ATmp
bcf _Fdca
bcf _Fcra
movf INDF,0
movwf RTmp
movlw 4 ;X=4
addwf FSR,1
btfss _Fcrp
goto $+4
movlw 1
addwf INDF,1
call DecCor
movf RTmp,0
addwf INDF,1
call DecCor
btfss _Fdca
goto $+3
movlw 6
addwf INDF,1
btfss _Fcra
goto $+5
movlw 60
addwf INDF,1
btfsc _C
bsf _Fcra
movf INDF,0
andlw 0xF0
sublw 0xA0
btfss _Z
goto $+6
movf INDF,0
andlw 0x0F
clrf INDF
addwf INDF,1
bsf _Fcra
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movlw 5 ;X+1=5
subwf FSR,1
decfsz ATmp,1
goto $-28
btfsc _Fcra
bsf _Ferr
return
DecCor btfsc _DC ;dezimale Korrektur (equ "DAW" bei PIC18FXXX)
bsf _Fdca
btfsc _C
bsf _Fcra
movf INDF,0
andlw 0F
sublw 9
btfss _C
bsf _Fdca
movf INDF,0
andlw 0xF0
sublw 90
btfss _C
bsf _Fcra
return
ARotRb movlw A3 ;rotiere A Register 1 Bit rechts
movwf FSR
RRotRb movlw 4 ;rotiere X=4 Bytes
movwf ATmp
bcf _Fcrp
btfsc A0,0
bsf _Fcrp
bcf _Fcra
btfsc INDF,0
bsf _Fcra
bcf _C
btfsc _Fcrp
bsf _C
rrf INDF,1
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
incf FSR,1
decfsz ATmp,1
goto $-0C ;RRotRbL
return