'**************************************************************** '* Name : K42Test.PBP * '* Author : Mike Holler * '* Notice : Copyright (c) 2018 Ecoceptor, LLC * '* : All Rights Reserved * '* Date : 1/4/2018 * '* Version : 1.0 * '* Notes : PIC18F26K42 * '* : Working platform to test the K42 Functions. * '**************************************************************** CLEAR DEFINE OSC 4 #CONFIG CONFIG FEXTOSC = OFF ;Oscillator not enabled CONFIG RSTOSC = HFINTOSC_64MHZ ;HFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1 CONFIG CLKOUTEN = OFF ;CLKOUT function is disabled CONFIG PR1WAY = OFF ;PRLOCK bit can be set and cleared repeatedly CONFIG CSWEN = ON ;Writing to NOSC and NDIV is allowed CONFIG FCMEN = ON ;Fail-Safe Clock Monitor enabled CONFIG MCLRE = INTMCLR ;If LVP = 0, MCLR pin function is port defined function CONFIG PWRTS = PWRT_OFF ;PWRT is disabled CONFIG MVECEN = ON ;Interrupt contoller does not use vector table to prioritze interrupts CONFIG IVT1WAY = OFF ;IVTLOCK bit can be cleared and set repeatedly CONFIG LPBOREN = OFF ;ULPBOR disabled CONFIG BOREN = ON ;Brown-out Reset enabled according to SBOREN CONFIG BORV = VBOR_245 ;Brown-out Reset Voltage (VBOR) set to 2.45V; CONFIG ZCD = OFF ;ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON CONFIG PPS1WAY = OFF ;PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence) CONFIG STVREN = ON ;Stack full/underflow will cause Reset CONFIG DEBUG = OFF ;Background debugger disabled CONFIG XINST = OFF ;Extended Instruction Set and Indexed Addressing Mode disabled CONFIG WDTCPS = WDTCPS_31 ;Divider ratio 1:65536; software control of WDTPS CONFIG WDTE = SWDTEN ;WDT enabled/disabled by SWDTEN bit CONFIG WDTCWS = WDTCWS_7 ;Window always open (100%); software control; keyed access not required CONFIG WDTCCS = LFINTOSC ;WDT reference clock is the 31.0 kHz LFINTOSC CONFIG BBSIZE = BBSIZE_512 ;Boot Block size is 512 words CONFIG BBEN = OFF ;Boot block disabled CONFIG SAFEN = OFF ;SAF disabled CONFIG WRTAPP = OFF ;Application Block not write protected CONFIG WRTB = OFF ;Configuration registers (300000-30000Bh) not write-protected CONFIG WRTC = OFF ;Boot Block (000000-0007FFh) not write-protected CONFIG WRTD = OFF ;Data EEPROM not write-protected CONFIG WRTSAF = OFF ;SAF not Write Protected CONFIG LVP = OFF ;HV on MCLR/VPP must be used for programming CONFIG CP = OFF ;PFM and Data EEPROM code protection disabled #ENDCONFIG GOTO Start Start: ;Aliases: Butt VAR PORTA.0 ;Pin 2 LED2 VAR LATC.0 ;Pin 11 En VAR LATC.1 RS VAR LATC.2 LED VAR LATC.3 ;Pin 14 ;Special Function Registers: OSCCON1 = %01100000 ;64 MHz / 16 = 4 M Hz OSCFRQ = %00000010 ;4 MHz OSCEN = %01010100 ;HFINTOSC, LFINTOSC, ADC_OSC TRISA = %00000001 TRISB = %00000000 TRISC = %00100000 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00100000 PPSLOCK = $55 PPSLOCK = $AA PPSLOCK = 0 ;Unlock PPS INT0PPS = %00000000 ;INT0 on RA0 PPSLOCK = $55 PPSLOCK = $AA PPSLOCK = 1 ;Lock PPS ; --- *** Interrupt Related SFRs *** ----------------------------------------------------------------------------------- INTCON0 = %01000000 PIR4.0 = 0 ;TMR1IF PIE4.0 = 1 ;TMR1IE PIR1.0 = 0 ;INT0IF PIE1.0 = 1 ;INT0IE @ CALL Vector_Table_Init T1CON = %00000000 T1CLK = %00000100 ;LFINTOSC ;Variables: b0 VAR BYTE ButBit VAR BIT BANK0 SYSTEM Cycle VAR BIT BANK0 SYSTEM DispH VAR BYTE BANK0 SYSTEM DispL VAR BYTE BANK0 SYSTEM DispVal VAR WORD DispValA VAR BYTE[5] Dram VAR BYTE Line VAR BYTE[16] ;Labels: Main: PAUSE 200 ButBit = 0 DispL = 1 GOSUB Init_LCD TMR1H = $86 ;0.25 Second Interrupt Intervals TMR1L = $E7 T1CON = %00000001 INTCON0.7 = 1 DO IF Butt = 0 THEN ButBit = 0 PIE1.0 = 1 ENDIF DispVal.LOWBYTE = DispL DispVal.HIGHBYTE = DispH GOSUB Disp ASM MOVLB 0 Wait BTFSS Cycle GOTO Wait BCF Cycle ENDASM TOGGLE LED ; DO ; LOOP WHILE Cycle = 0 ; Cycle = 0 LOOP Init_LCD: RS = 0 LATB = $30 En = 1 pauseus 4 En = 0 pause 5 LATB = $30 En = 1 pauseus 4 En = 0 pauseus 160 LATB = $30 En = 1 pauseus 4 En = 0 pauseus 160 LATB = $38 gosub Send LATB = $10 gosub Send LATB = $0C gosub Send LATB = $06 gosub Send PAUSE 1 RS = 0 LATB = 1 gosub Send pause 1 ARRAYWRITE Line, [" Rife Project "] Dram = $80 GOSUB Set_LCD PAUSE 1 ARRAYWRITE Line, [" Frequency "] Dram = $C0 GOSUB Set_LCD PAUSE 1 ARRAYWRITE Line, [" Generator "] Dram = $90 GOSUB Set_LCD pause 1 ARRAYWRITE Line, [" Version 1.0 "] Dram = $D0 GOSUB Set_LCD PAUSE 2000 RETURN Disp: RS = 0 LATB = 1 GOSUB Send LATB = $80 GOSUB Send RS = 1 ARRAYWRITE DispValA, [#DispVal] IF DispVal < 10000 THEN DispValA[4] = DispValA[3] DispValA[3] = DispValA[2] DispValA[2] = DispValA[1] DispValA[1] = DispValA[0] DispValA[0] = " " ENDIF IF DispVal < 1000 THEN DispValA[4] = DispValA[3] DispValA[3] = DispValA[2] DispValA[2] = DispValA[1] DispValA[1] = " " DispValA[0] = " " ENDIF IF DispVal < 100 THEN DispValA[4] = DispValA[3] DispValA[3] = DispValA[2] DispValA[2] = " " DispValA[1] = " " DispValA[0] = " " ENDIF IF DispVal < 10 THEN DispValA[4] = DispValA[3] DispValA[3] = " " DispValA[2] = " " DispValA[1] = " " DispValA[0] = " " ENDIF LATB = DispValA[0] GOSUB Send LATB = DispValA[1] GOSUB Send LATB = DispValA[2] GOSUB Send LATB = DispValA[3] GOSUB Send LATB = DispValA[4] GOSUB Send RETURN Set_LCD: RS = 0 pause 1 LATB = Dram gosub Send RS = 1 pause 1 for b0 = 0 to 15 LATB = Line[b0] gosub Send next b0 RS = 0 RETURN Send: En = 1 pauseus 8 En = 0 pause 1 return ASM Vector_Table_Init: MOVLW 0x00 ;Vector Table Start Address: 00 4008h MOVWF IVTBASEU, ACCESS MOVLW 0x40 MOVWF IVTBASEH, ACCESS MOVLW 0x08 MOVWF IVTBASEL, ACCESS MOVLW 0x00 ;TMR1_INT = Vector #32 MOVWF TBLPTRU, ACCESS ;4008h + [(32d) 20h * 2] = 4048 MOVLW 0x40 MOVWF TBLPTRH, ACCESS MOVLW 0x48 MOVWF TBLPTRL, ACCESS MOVLW 0x30 ;T1ISR >> 2; 08C0h >> 2 = 0230h MOVWF TABLAT, ACCESS TBLWT*+ MOVLW 0x02 MOVWF TABLAT, ACCESS TBLWT*+ BANKSEL NVMCON1 MOVLW 0x84 ;Setting to write to PFM MOVWF NVMCON1 MOVLW 0x55 ;Required unlock sequence MOVWF NVMCON2 MOVLW 0xAA MOVWF NVMCON2 BSF NVMCON1, WR ;Start writing to PFM BTFSC NVMCON1, WR ;Wait for write to complete GOTO $-2 MOVLW 0x00 ;INT0_INT = Vector #8 MOVWF TBLPTRU, ACCESS ;4008h + [(8d) 8h * 2] = 4018 MOVLW 0x40 MOVWF TBLPTRH, ACCESS MOVLW 0x18 MOVWF TBLPTRL, ACCESS MOVLW 0x38 ;INT0ISR >> 2; 08E0h >> 2 = 0238h MOVWF TABLAT, ACCESS TBLWT*+ MOVLW 0x02 MOVWF TABLAT, ACCESS TBLWT*+ BANKSEL NVMCON1 MOVLW 0x84 ;Setting to write to PFM MOVWF NVMCON1 MOVLW 0x55 ;Required unlock sequence MOVWF NVMCON2 MOVLW 0xAA MOVWF NVMCON2 BSF NVMCON1, WR ;Start writing to PFM BTFSC NVMCON1, WR ;Wait for write to complete GOTO $-2 RETURN 1 ENDASM ASM ORG 0x08C0 T1ISR: ;ISR code at 0x08C0 in PFM BANKSEL PIR4 ;BANKSELECT for PIR4 BCF PIR4,0 ;Clear TMR1IF ; BANKSEL LATC ;BANKSELECT for LATC ; BTG _LED ;Bit Toggle LATC.3 (LED) MOVLW 086h BANKSEL TMR1H ;BANKSELECT for TMR1 MOVWF TMR1H, 1 ; TMR1H = $86 MOVLW 0E7h ;34535d = 1 Second Interrupts MOVWF TMR1L, 1 ; TMR1L = $E7 BANKSEL T1CON ;BANKSELECT for T1CON MOVLW 1 ;T1CON = %00000001 MOVWF T1CON, 1 ; T1CON = %00000001 MOVLB 0 BSF Cycle INFSNZ DispL INCF DispH RETFIE FAST ;RETURN & Restore ENDASM ASM ORG 0x08E0 INT0ISR: BANKSEL PIR1 ;BANKSELECT for PIR1 BCF PIR1,0 ;Clear INT0IF BANKSEL PIE1 BCF PIE1,0 BANKSEL LATC ;BANKSELECT for LATC BTG _LED2 ;Bit Toggle LATC.0 (LED2) BSF ButBit RETFIE FAST ;RETURN & Restore ENDASM