O.K.Vielen Dank! Das soll auf dem PIC18F252 laufen. Na ja, bischen habe ich schon mit timer "gebastelt", da habe ich keine Angst.
MfG
Druckbare Version
O.K.Vielen Dank! Das soll auf dem PIC18F252 laufen. Na ja, bischen habe ich schon mit timer "gebastelt", da habe ich keine Angst.
MfG
Hallo!
Mein "Werkzeug" dazu habe ich schon fertig und mehrmals ausprobiert (z.B. für sehr genaue Einstellung Verzögerungschleifen). Es ist für den PIC18F2X2 geschrieben. Die konfiguration des Systemoscillators kann geändert werden (aktuell: externer Quarzoscillator). Das komplette Unter/Programm ohne RETURN (stattdessen 2xNOP) muss zwischen die zwei Sternlinien (wo jetzt zum Testen 10xNOP steht) kopiert und assembliert werden.
Nach dem Einschalten des programmierten PICs, steht die Ablaufzeit des Unter/Programms als hex Zahl in dem A Register (A3-A0) (obere Zeile des Displays links) und als dec Zahl in dem D Register (D3-D0) (untere Zeile des Displays rechts). Die maximale Zahl beträgt FFFFFFh (16777215d) Systemtakte (Fosc/4). Als Display habe ich die in dem Thema:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=13685
beschriebene Hardware benutzt. Die alle mit @ bezeichneten Unterprogramme gehören zu dem Display und können für anderes Display ersetzt werden. Falls jemand dafür interessiert ist, bin ich zur Hilfe bereit.
Dank dem "Werkzeug" konnte ich mir die Frage, ob die POSTINC und POSTDEC Programmablauf verlangsamen selber mit klarem NEIN beantworten und aus dem Forum löschen.
Inzwischen habe ich ein ASM Messprogramm geschrieben und in Wiki hochgeladen:
https://www.roboternetz.de/wissen/in...r#PIC_Profiler
MfGCode:; Profiler
LIST P=18F252
include "P18F252.inc"
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _EC_OSC_1H
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H
__CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
#define @PORT PORTB
#define @TRIS TRISB
#define @DT @PORT,7
#define @CK @PORT,6
;************************
#define _C STATUS,C
#define _Z STATUS,Z
#define _Fcra Flags,0
#define _Fcrp Flags,1
#define _Ferr Flags,2
;************************
A3 EQU 0x00
A2 EQU 0x01
A1 EQU 0x02
A0 EQU 0x03
B3 EQU 0x04
B2 EQU 0x05
B1 EQU 0x06
B0 EQU 0x07
C3 EQU 0x08
C2 EQU 0x09
C1 EQU 0x0A
C0 EQU 0x0B
D3 EQU 0x0C
D2 EQU 0x0D
D1 EQU 0x0E
D0 EQU 0x0F
Flags EQU 0x10
ATemp EQU 0x11
HTemp EQU 0x12
RTemp EQU 0x13
Tmp EQU 0x15
Tmp1 EQU 0x16
;************************
@Tmp EQU 0xFF
@Tmp1 EQU 0xFE
@Tmp2 EQU 0xFD
@Tmp3 EQU 0xFC
;************************
ORG 0x0000
call Init
Main bcf INTCON,GIE ; disable interrupts
movlw 7
movwf T0CON ; configure Timer0
clrf TMR0H ; clear Timer 0
clrf TMR0L
bsf T0CON,TMR0ON ; start Timer0
;*******************************************************
nop ; Hier wird das gemessene Programm kopiert
nop
nop
nop
nop
nop
nop
nop
nop
nop
;*******************************************************
movlw 0xA7 ; "stop" Timer0
movwf T0CON
call GetTime
call @
goto Main
GetTime movff TMR0L,A1
movff TMR0H,A2
movff TMR0L,HTemp
clrf ATemp
bcf TRISA,5
FToggle incf ATemp,1
bsf T0CON,T0SE
bcf T0CON,T0SE
movf TMR0L,0
subwf HTemp,0
btfsc _Z
goto FToggle
comf ATemp,1
incf ATemp,0
movwf A0
bcf T0CON,TMR0ON
bsf TRISA,5
Hex_Dec call CDClr ; Hex>A,D>Dec
movlw 1
movwf C0
movlw 0x18 ; 24 bit Hex (6digits) > 32 bit Dec (8 digits)
movwf HTemp
Hex_DecL btfsc A0,0
call AddDC
call CopyCB
call AddCB
call ARotRb
decfsz HTemp,1
goto Hex_DecL
call BCClr
return
BCClr movlw 8
movwf ATemp
lfsr FSR0,B3
BCClrL clrf POSTINC0
decfsz ATemp,1
goto BCClrL
return
CDClr movlw 8
movwf ATemp
lfsr FSR0,C3
CDClrL clrf POSTINC0
decfsz ATemp,1
goto CDClrL
return
CopyCB lfsr FSR0,C0
lfsr FSR1,B0
CopyReg movlw 4
movwf ATemp
CopyRegL movff POSTDEC0,POSTDEC1
decfsz ATemp,1
goto CopyRegL
return
AddCB lfsr FSR0,B0 ; C+B>C
lfsr FSR1,C0
goto AddReg
AddDC lfsr FSR0,C0 ; D+C>D
lfsr FSR1,D0
AddReg bcf _Ferr ; 32 bit, (4 Bytes)
bcf _Fcrp
movlw 4
movwf ATemp
AddRegL bcf _Fcra
movf INDF0,0
addwf INDF1,0
btfsc _C
bsf _Fcra
daw
movwf INDF1
btfsc _C
bsf _Fcra
btfss _Fcrp
goto AddRegN
movlw 1
addwf INDF1,0
daw
movwf INDF1
btfsc _C
bsf _Fcra
AddRegN bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movf POSTDEC0,1
movf POSTDEC1,1
decfsz ATemp,1
goto AddRegL
btfsc _Fcra
bsf _Ferr
return
ARotRb lfsr FSR0,A2 ; A register 3 Bytes (24 bit)
RRotRb movlw 3 ; rotates a register 1 bit right
movwf RTemp
bcf _Fcrp
btfsc A0,0
bsf _Fcrp
RRotRbL bcf _Fcra
btfsc INDF0,0
bsf _Fcra
bcf _C
btfsc _Fcrp
bsf _C
rrcf INDF0,1
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movf POSTINC0,1
decfsz RTemp,1
goto RRotRbL
return
Cls lfsr FSR0,0
ClsL clrf POSTINC0
btfss FSR0L,6
goto ClsL
return
@ lfsr FSR2,0x000
call @1st
call @Line
call @2nd
call @Line
return
@Line movlw 8
movwf @Tmp3
@LineL movf POSTINC2,0
call @Val
decfsz @Tmp3,1
goto @LineL
return
@1st movlw 0x80
goto @Cmd
@2nd movlw 0xC0
@Cmd movwf @Tmp2
bcf STATUS,C
goto @Send
@SPC movlw " "
goto @Char
@Val movwf @Tmp1
swapf @Tmp1,0
call @Num
movf @Tmp1,0
@Num andlw 0x0F
movwf @Tmp
movlw 0x0A
subwf @Tmp,0
btfsc STATUS,C
addlw 7
addlw 0x3A
@Char movwf @Tmp2
bsf STATUS,C
@Send bcf @CK
bcf @DT
bsf @DT
movlw 9
movwf @Tmp
@Ser bcf @CK
bcf @DT
btfsc @Tmp2,7
bsf @DT
bsf @CK
rlcf @Tmp2,1
decfsz @Tmp,1
goto @Ser
bcf @DT
bsf @DT
@DelS movlw 0x64
movwf @Tmp2
@DelSL decfsz @Tmp2,1
goto @DelSL
return
Init movlw 7
movwf ADCON1
clrf TRISA ; make all ports as output
clrf PORTA
clrf TRISC
clrf PORTC
clrf @TRIS
clrf @PORT
call Cls
movlw 0x38 ; initialise display
call @Cmd
movlw 0x0C
call @Cmd
movlw 6
goto @Cmd
END