FREQUENCIMETRO COM PIC 16F628 16F84 E DISPLAY LCD 16X2
16F628 ASM E HEX
Para PIC 16F628A
Para PIC 16F628-04
ASM 16F628
Para PIC 16F628A
********************************************************************
;===============================================================================
; Filename: freq_628.asm
; Date: 23/03/2004
; File Version: 1.0
; Orig. Files: Peter Halicky OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
; Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
;================================================================================
; Files required: vdisplay.inc
;================================================================================
; Notes:
; Remoção das rotinas de Lcd, inclusão da vdisplay.inc
; Correção da diretiva Radix
; Inclusão de pag. de memória
; Relocação de variáveis
; Recálculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
; T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz
;================================================================================
;================================================================================
;DIRETIVAS DE COMPILAÇÃO
;================================================================================
LIST P=16F628A ;list directive to define processor
#INCLUDE <p16f628A.inc> ;processor specific variable definitions
__IDLOCS 2003 ;dados a serem gravados na EEPROM
ERRORLEVEL -302 ;suppress bank selection messages
RADIX DEC ;set to decimal
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF
;=================================================================================
;VARIABLE DEFINITIONS
;=================================================================================
CBLOCK 0x20 ;endereço inicial p/ variáveis
Index ;dummy register
Count ;inkremental register
Help ;dummy register
LED0
LED1
LED2
LED3
LED4
LED5
LED6
TimerH ;the highest byte of SW counter
LowB ;low byte of resulted frequency
MidB ;middle byte of resulted frequency
HigB ;high byte of resulted frequency
TEMP ;temporary register
HIndex ;index register
LEDIndex ;LED pointer
R1 ;Timing counters
R2
R3
temp
w_temp ;variable used for context saving
status_temp ;variable used for context saving
tmpLcdRegister ;devem permanecer no final
LcdDelayCounter ;pois ocupam 4 bytes
ENDC
;=================================================================================
;PAGINAÇÃO DE MEMÓRIA
;=================================================================================
#DEFINE BANK0 BCF STATUS,RP0 ;seta bank0 de memória
#DEFINE BANK1 BSF STATUS,RP0 ;seta bank1 de memória
;=================================================================================
;Timing Loop values ; QRP BR - AQUI SÃO OS AJUSTES
;=================================================================================
T1 equ 252 ;first timing loop
T2 equ 11 ;second timing loop
T3 equ 4 ;third timing loop
T4 equ 2 ;last timing loop
;=================================================================================
;Vetor de Reset
;=================================================================================
org 0x00
goto Init
;=================================================================================
;Inicialização
;=================================================================================
Init clrf STATUS ; Do initialization, Select bank 0
clrf INTCON ; Clear int-flags, Disable interrupts
clrf PCLATH ; Keep in lower 2KByte
clrf PORTA ; ALL PORT output should output Low.
clrf PORTB
clrf Index
clrf LEDIndex
clrf LED0
clrf LED1
clrf LED2
clrf LED3
clrf LED4
clrf LED5
clrf LED6
clrf LowB
clrf MidB
clrf HigB
bsf STATUS,RP0
movlw b'00010000' ; RA0..RA3 outputs
movwf TRISA ; RA4 input
movlw 0xF0 ; RB0..RB3 outputs, rest inputs
movwf TRISB
bsf OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups
clrwdt
movlw b'10100111' ; Prescaler -> TMR0,
movwf OPTION_REG ; 1:256, rising edge
bcf STATUS,RP0 ;
BANK1
movlw 0x0F
andwf TRISB,W
movwf TRISB ; Set Port for output
BANK0
;=================================================================================
;Initialization of LCD display
call LcdInit
call ShowLoad
call ShowName
call ShowHello
call LcdClear
call ShowName
;=================================================================================
goto Start
;=================================================================================
; Numeric routines
;=================================================================================
; 3 byte substraction of the constant from the table which sets carry if
; result is negative
;=================================================================================
Subc24 clrf TEMP ; it will TEMPorary save C
movf Index,W ; pointer to low byte of constant
movwf HIndex ; W -> HIndex
call DecTable ; W returned with low byte of constant
bsf STATUS,C ; set C
subwf LowB,F ; LowB - W -> LowB
; if underflow -> C=0
btfsc STATUS,C
goto Step1
bsf STATUS,C
movlw 1
subwf MidB,F ; decrement MidB
; if underflow -> C=0
btfsc STATUS,C
goto Step1
bsf STATUS,C
movlw 1
subwf HigB,F ; decrement HigB
btfsc STATUS,C ; if underflow -> C=0
goto Step1
bsf TEMP,C ; set C
Step1 decf HIndex,F
movf HIndex,W ; pointer to middle byte of const
call DecTable
bsf STATUS,C
subwf MidB,F ; MidB - W -> MidB
btfsc STATUS,C ; if underflow -> C=0
goto Step2
bsf STATUS,C
movlw 1
subwf HigB,1 ; decrement HigB
btfsc STATUS,C ; if underflow -> C=0
goto Step2
bsf TEMP,C ; set C
Step2 decf HIndex,F
movf HIndex,W ; pointer to middle byte of constatnt
call DecTable
bsf STATUS,C
subwf HigB,F ; HigB - W -> HigB
btfsc STATUS,C ; if underflow -> C=0
goto ClearCF
bsf STATUS,C
goto SubEnd
ClearCF rrf TEMP,C ; C -> STATUS
SubEnd retlw 0
;=================================================================================
; 3 byte addition of the constant from the table which sets carry if
; result overflows
;=================================================================================
Addc24 clrf TEMP ; register for TEMPorary storage of C
movf Index,W ; pointer to lower byte of const into W
movwf HIndex ; save it into HIndex
call DecTable ; W contains low byte of const
bcf STATUS,C ; clear C
addwf LowB,1 ; W + LowB -> LowB
btfss STATUS,C ; test overflow
goto Add2
bcf STATUS,C ; clear C
movlw 1
addwf MidB,F ; increment MidB
btfss STATUS,C
goto Add2
bcf STATUS,C
movlw 1
addwf HigB,F ; increment HigB
btfss STATUS,C ; test overflow
goto Add2
bsf TEMP,C ; store C
Add2 decf HIndex,F ; pointer to middle byte into W
movf HIndex,W
call DecTable
bcf STATUS,C
addwf MidB,1 ; W + MidB -> MidB
btfss STATUS,C
goto Add3
bcf STATUS,C ; clear C
movlw 1
addwf HigB,1 ; increment HigB
btfss STATUS,C
goto Add3
bsf TEMP,C
Add3 decf HIndex,F ; pointer to higher byte into W
movf HIndex,W
call DecTable
bsf STATUS,C
addwf HigB,F ; W + HigB -> HigB,
btfss STATUS,C
goto ClarCF
bsf STATUS,C
goto AddEnd
ClarCF rrf TEMP,C ; C -> STATUS
AddEnd retlw 0
;=================================================================================
;Tables for 3 byte constants
;Table of decades
;=================================================================================
DecTable addwf PCL,F ; W + PCL -> PCL
retlw 0 ; 10
retlw 0 ;
retlw 0Ah ;
retlw 0 ; 100
retlw 0 ;
retlw 064h ;
retlw 0 ; 1 000
retlw 03h ;
retlw 0E8h ;
retlw 0 ; 10 000
retlw 027h ;
retlw 010h ;
retlw 01h ; 100 000
retlw 086h ;
retlw 0A0h ;
retlw 0Fh ; 1 000 000
retlw 042h ;
retlw 040h ;
;=================================================================================
;Entry point for main cycle
;=================================================================================
;Routine for the conversion of 3 byte number into 7 decimal numbers
;=================================================================================
Start movlw 6*3-1 ; pointer to dec. table
movwf Index ; 6*3-1 -> Index
movlw 9 ; maximum of substractions
movwf Count ; 9 -> Count
clrf Help
movlw 6
movwf LEDIndex
Divide call Subc24 ; substract untill result is negative,
btfsc STATUS,C ; add last substracted number
goto Add24 ; next digit
incf Help,F
decf Count,F
btfss STATUS,Z
goto Divide
movlw 3
subwf Index,F
goto Next
Add24 call Addc24
movlw 03h
subwf Index,F
Next movlw 9
movwf Count
movlw LED1 ; LED1 -> W
addwf LEDIndex,W ; LED1 + LEDIndex -> W
movwf TEMP
decf TEMP,F ; LEDIndex+LED1-1 -> TEMP
movf TEMP,W
movwf FSR ; W -> FSR
movf Help,W ; Help -> W
clrf Help ; save result at LEDx
movwf INDF ; W -> LED(6..1)
decf LEDIndex,F
movlw 1
addwf Index,W
btfss STATUS,Z
goto Divide
movf LowB,W
movwf LED0 ; the rest -> LED0
;=================================================================================
;registers LED0..LED6 are filled with values - ready to be displayed
;=================================================================================
movlw 6
movwf LEDIndex
movlw 10H ;Locate LCD cursor on row 1, col 0
call LcdLocate
LEDCycle movlw LED0 ;LED0 -> W
addwf LEDIndex,W ;LED1 + LEDIndex -> W
movwf FSR ;W -> FSR
movf INDF,W ;LED(0..6) -> W
iorlw 030h
call LcdSendData ;Display character
;movlw 5 ;test for decimal point
movlw 5 ;test for decimal point
bsf STATUS,Z
subwf LEDIndex,W
btfss STATUS,Z
goto NoDot
movlw '.' ;this can be ' ' or ',' ......
call LcdSendData ;Display character
NoDot decfsz LEDIndex,F
goto LEDCycle ;continue with next number
movlw LED0 ;LED0 -> W
addwf LEDIndex,W ;LED0 + LEDIndex -> W
movwf FSR ;W -> FSR
movf INDF,W ;[FSR] -> W
iorlw 030h
call LcdSendData ;Display character
movlw ' '
call LcdSendData ;Display character
movlw 'M'
call LcdSendData ;Display character
movlw 'H'
call LcdSendData ;Display character
movlw 'z'
call LcdSendData ;Display character
movlw 10H ;Locate LCD cursor on row 1, col 0
call LcdLocate
;=================================================================================
;It is time to prepare new measuring cycle
;=================================================================================
clrf TimerH
clrf TMR0
nop ;it is SUGGESTED...
nop
clrf LEDIndex
movlw T1 ;set initial counter values
movwf R1
movlw T2
movwf R2
movlw T3
movwf R3
clrf INTCON ;global INT disable, TMR0 INT disable
;clear TMR0 overflow bite
;=================================================================================
;Start measurement: RA3 + RA4 set input
;=================================================================================
movlw b'00010000' ;all ports set L, RA4 set H
movwf PORTA
bsf STATUS,RP0
movlw b'00011111' ;RA0..RA4 input
movwf TRISA
bcf STATUS,RP0
;=================================================================================
;It is opened now...
;=================================================================================
Cycle btfss INTCON,2 ;1 Test for TMR0 overflow
goto Nothing ;3
incf TimerH,F ;3
bcf INTCON,2 ;4
goto Nxt ;6
Nothing nop ;4
nop ;5
nop ;6
Nxt decfsz R1,F ;7
goto Cycle ;9
movlw T1 ;9*T1
movwf R1 ;9*T1+1
decfsz R2,F ;9*T1+2
goto Cycle ;9*T1+4
movlw T2 ;9*T1+4)*T2
movwf R2 ;(9*T1+4)*T2+1
decfsz R3,F ;(9*T1+4)*T2+2
goto Cycle ;(9*T1+4)*T2+4
;=================================================================================
;Final test for TMR0 overflow
;=================================================================================
movlw T4 ;((9*T1+4)*T2+4)*T3
movwf Help ;((9*T1+4)*T2+4)*T3+1
Cycle2 btfss INTCON,2 ;1
goto Not2Do ;3
incf TimerH,F ;3
bcf INTCON,2 ;4
goto Nx ;6
Not2Do nop ;4
nop ;5
nop ;6
Nx decfsz Help,F ;7
goto Cycle2 ;9
nop ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
;=================================================================================
; Z times fine tuning nops ; altere aqui os nop para calibrar, aumentando
nop ; ou diminuindo.
nop
nop
;=================================================================================
; Stop the measurement
;=================================================================================
clrw ;1
movwf PORTB ;2
movlw b'00010000' ;3 RA0..RA3 = 0
movwf PORTA ;4 W -> PORTA
;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
bsf STATUS,RP0 ;
movlw b'00010111' ;RA3 output
movwf TRISA ;RA0..RA2,RA4 input
bcf STATUS,RP0 ;
;=================================================================================
; Analyse precounter and store counted value in registers
;=================================================================================
movf TMR0,W
movwf MidB ;TMR0 -> MidB
movf TimerH,W
movwf HigB ;TimerH -> HigB
clrf TEMP
CountIt incf TEMP,F
bsf PORTA,3 ;_| false impulz
bcf PORTA,3 ;|_
bcf INTCON,2
movf TMR0,W ;actual TMR0 -> W
bcf STATUS,Z
subwf MidB,W
btfsc STATUS,Z
goto CountIt
incf TEMP,F
comf TEMP,F
incf TEMP,F
incf TEMP,W
movwf LowB
goto Start ;start new cycle
;================================================================================
;Include Files
;================================================================================
#INCLUDE <vdisplay.inc>
END
************************************************************************
HEX 16F628
Para PIC 16F628A
************************************************************************
:020000040000FA
:10000000012883018B018A0185018601A001B001CD
:10001000A301A401A501A601A701A801A901AB01A3
:10002000AC01AD01831610308500F03086008117D9
:100030006400A7308100831283160F300605860006
:10004000831232218721AD21CA214921AD21912876
:10005000AE012008AF007E200314AB0203183B283A
:1000600003140130AC0203183B2803140130AD0225
:1000700003183B282E14AF032F087E200314AC0274
:100080000318482803140130AD02031848282E1421
:10009000AF032F087E200314AD0203185128031468
:1000A00052282E0C0034AE012008AF007E20031031
:1000B000AB07031C662803100130AC07031C66283D
:1000C00003100130AD07031C66282E14AF032F0860
:1000D0007E200310AC07031C732803100130AD070A
:1000E000031C73282E14AF032F087E200314AD07C2
:1000F000031C7C2803147D282E0C00348207003456
:1001000000340A3400340034643400340334E834F6
:1001100000342734103401348634A0340F34423490
:1001200040341130A0000930A100A2010630B00017
:1001300028200318A228A20AA103031D982803302F
:10014000A002A52853200330A0020930A1002430CA
:100150003007AE00AE032E0884002208A201800002
:10016000B00301302007031D98282B08A300063098
:10017000B00010304E2123303007840000083038A2
:100180005921053003153002031DC8282E3059218E
:10019000B00BBB28233030078400000830385921C9
:1001A000203059214D305921483059217A30592178
:1001B00010304E21AA01810100000000B001FC3086
:1001C000B1000B30B2000430B3008B011030850059
:1001D00083161F30850083120B1DF128AA0A0B110C
:1001E000F428000000000000B10BEC28FC30B10046
:1001F000B20BEC280B30B200B30BEC280230A2009B
:100200000B1D0529AA0A0B11082900000000000097
:10021000A20B00290000000000000000030186007E
:100220001030850083161730850083120108AC005A
:100230002A08AD00AE01AE0A851585110B11010823
:1002400003112C0203191B29AE0AAE09AE0A2E0AAD
:10025000AB009128B900B8010000B80B2C29B90BEC
:100260002C2908001E302A210611061686160613B0
:10027000861380218021802106128616061386139C
:10028000802128305C2106305C210C305C21492122
:10029000080001305C2102302A210800B7008030BC
:1002A000B80037080F39B804371A381738085C21F6
:1002B000080006155F21080006115F210800B7003D
:1002C0000612861206138613371A0616B71A8616F2
:1002D000371B0617B71B86178021061286120613D6
:1002E000861337180616B718861637190617B71962
:1002F00086178021080018305C2196302A210800DA
:10030000861501302A21861101302A21080000308B
:100310004E214C3059216F305921613059216430C0
:100320005921693059216E305921673059212E30B9
:1003300059212E3059212E305921FF302A211030D9
:100340004E210D30B40023305921FF302A21B40B47
:10035000A329FF302A214921080000304E214630D0
:1003600059215230592145305921513059215530A8
:100370005921453059214E305921433059214930B6
:1003800059214130592120305921FF302A21FF3095
:100390002A21080010304E21513059215230592164
:1003A00050305921203059214230592152305921A1
:1003B0002030592146305921523059214530592198
:1003C000513059212030592121305921FF302A2123
:0E03D000FF302A21FF302A21FF302A210800A9
:084000000200000000000300B3
:02400E00213F50
:00000001FF
************************************************************************
ASM
Para PIC 16F628A
************************************************************************
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001 ;===============================================================================
00002 ; Filename: freq_628.asm
00003 ; Date: 23/03/2004
00004 ; File Version: 1.0
00005 ; Orig. Files: Peter Halicky OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
00006 ; Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
00007 ;================================================================================
00008 ; Files required: vdisplay.inc
00009 ;================================================================================
00010 ; Notes:
00011 ; Remo o das rotinas de Lcd, inclus o da vdisplay.inc
00012 ; Corre o da diretiva Radix
00013 ; Inclus o de pag. de mem ria
00014 ; Reloca o de vari veis
00015 ; Rec lculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
00016 ; T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz
00017 ;================================================================================
00018
00019 ;================================================================================
00020 ;DIRETIVAS DE COMPILA O
00021 ;================================================================================
00022 LIST P=16F628A ;list directive to define processor
00023 #INCLUDE <p16f628A.inc> ;processor specific variable definitions
00001 LIST
00002 ; P16F628A.INC Standard Header File, Version 1.10 Microchip Technology, Inc.
00265 LIST
2000 0002 0000 0000 00024 __IDLOCS 2003 ;dados a serem gravados na EEPROM
0003
00025 ERRORLEVEL -302 ;suppress bank selection messages
00026 RADIX DEC ;set to decimal
2007 3F21 00027 __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF
00028
00029
00030 ;=================================================================================
00031 ;VARIABLE DEFINITIONS
00032 ;=================================================================================
00033 CBLOCK 0x20 ;endere o inicial p/ vari veis
00000020 00034 Index ;dummy register
00000021 00035 Count ;inkremental register
00000022 00036 Help ;dummy register
00037
00000023 00038 LED0
00000024 00039 LED1
00000025 00040 LED2
00000026 00041 LED3
00000027 00042 LED4
00000028 00043 LED5
00000029 00044 LED6
00045
0000002A 00046 TimerH ;the highest byte of SW counter
00047
0000002B 00048 LowB ;low byte of resulted frequency
0000002C 00049 MidB ;middle byte of resulted frequency
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 2
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0000002D 00050 HigB ;high byte of resulted frequency
00051
0000002E 00052 TEMP ;temporary register
0000002F 00053 HIndex ;index register
00000030 00054 LEDIndex ;LED pointer
00055
00000031 00056 R1 ;Timing counters
00000032 00057 R2
00000033 00058 R3
00059
00000034 00060 temp
00000035 00061 w_temp ;variable used for context saving
00000036 00062 status_temp ;variable used for context saving
00000037 00063 tmpLcdRegister ;devem permanecer no final
00000038 00064 LcdDelayCounter ;pois ocupam 4 bytes
00065 ENDC
00066
00067 ;=================================================================================
00068 ;PAGINA O DE MEM RIA
00069 ;=================================================================================
00070 #DEFINE BANK0 BCF STATUS,RP0 ;seta bank0 de mem ria
00071 #DEFINE BANK1 BSF STATUS,RP0 ;seta bank1 de mem ria
00072
00073 ;=================================================================================
00074 ;Timing Loop values ; QRP BR - AQUI S O OS AJUSTES
00075 ;=================================================================================
000000FC 00076 T1 equ 252 ;first timing loop
0000000B 00077 T2 equ 11 ;second timing loop
00000004 00078 T3 equ 4 ;third timing loop
00000002 00079 T4 equ 2 ;last timing loop
00080
00081 ;=================================================================================
00082 ;Vetor de Reset
00083 ;=================================================================================
0000 00084 org 0x00
0000 2801 00085 goto Init
00086
00087 ;=================================================================================
00088 ;Inicializa o
00089 ;=================================================================================
0001 0183 00090 Init clrf STATUS ; Do initialization, Select bank 0
0002 018B 00091 clrf INTCON ; Clear int-flags, Disable interrupts
0003 018A 00092 clrf PCLATH ; Keep in lower 2KByte
0004 0185 00093 clrf PORTA ; ALL PORT output should output Low.
0005 0186 00094 clrf PORTB
00095
0006 01A0 00096 clrf Index
0007 01B0 00097 clrf LEDIndex
00098
0008 01A3 00099 clrf LED0
0009 01A4 00100 clrf LED1
000A 01A5 00101 clrf LED2
000B 01A6 00102 clrf LED3
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 3
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
000C 01A7 00103 clrf LED4
000D 01A8 00104 clrf LED5
000E 01A9 00105 clrf LED6
00106
000F 01AB 00107 clrf LowB
0010 01AC 00108 clrf MidB
0011 01AD 00109 clrf HigB
00110
0012 1683 00111 bsf STATUS,RP0
00112
0013 3010 00113 movlw b'00010000' ; RA0..RA3 outputs
0014 0085 00114 movwf TRISA ; RA4 input
00115
0015 30F0 00116 movlw 0xF0 ; RB0..RB3 outputs, rest inputs
0016 0086 00117 movwf TRISB
00118
0017 1781 00119 bsf OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups
00120
0018 0064 00121 clrwdt
0019 30A7 00122 movlw b'10100111' ; Prescaler -> TMR0,
001A 0081 00123 movwf OPTION_REG ; 1:256, rising edge
001B 1283 00124 bcf STATUS,RP0 ;
00125
001C 1683 00126 BANK1
001D 300F 00127 movlw 0x0F
001E 0506 00128 andwf TRISB,W
001F 0086 00129 movwf TRISB ; Set Port for output
0020 1283 00130 BANK0
00131
00132 ;=================================================================================
00133 ;Initialization of LCD display
0021 2132 00134 call LcdInit
0022 2187 00135 call ShowLoad
0023 21AD 00136 call ShowName
0024 21CA 00137 call ShowHello
0025 2149 00138 call LcdClear
0026 21AD 00139 call ShowName
00140 ;=================================================================================
0027 2891 00141 goto Start
00142
00143 ;=================================================================================
00144 ; Numeric routines
00145 ;=================================================================================
00146 ; 3 byte substraction of the constant from the table which sets carry if
00147 ; result is negative
00148 ;=================================================================================
0028 01AE 00149 Subc24 clrf TEMP ; it will TEMPorary save C
0029 0820 00150 movf Index,W ; pointer to low byte of constant
002A 00AF 00151 movwf HIndex ; W -> HIndex
002B 207E 00152 call DecTable ; W returned with low byte of constant
002C 1403 00153 bsf STATUS,C ; set C
002D 02AB 00154 subwf LowB,F ; LowB - W -> LowB
00155 ; if underflow -> C=0
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 4
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
002E 1803 00156 btfsc STATUS,C
002F 283B 00157 goto Step1
0030 1403 00158 bsf STATUS,C
0031 3001 00159 movlw 1
0032 02AC 00160 subwf MidB,F ; decrement MidB
00161 ; if underflow -> C=0
0033 1803 00162 btfsc STATUS,C
0034 283B 00163 goto Step1
00164
0035 1403 00165 bsf STATUS,C
0036 3001 00166 movlw 1
0037 02AD 00167 subwf HigB,F ; decrement HigB
0038 1803 00168 btfsc STATUS,C ; if underflow -> C=0
0039 283B 00169 goto Step1
003A 142E 00170 bsf TEMP,C ; set C
00171
003B 03AF 00172 Step1 decf HIndex,F
003C 082F 00173 movf HIndex,W ; pointer to middle byte of const
003D 207E 00174 call DecTable
003E 1403 00175 bsf STATUS,C
003F 02AC 00176 subwf MidB,F ; MidB - W -> MidB
0040 1803 00177 btfsc STATUS,C ; if underflow -> C=0
0041 2848 00178 goto Step2
0042 1403 00179 bsf STATUS,C
0043 3001 00180 movlw 1
0044 02AD 00181 subwf HigB,1 ; decrement HigB
0045 1803 00182 btfsc STATUS,C ; if underflow -> C=0
0046 2848 00183 goto Step2
0047 142E 00184 bsf TEMP,C ; set C
00185
0048 03AF 00186 Step2 decf HIndex,F
0049 082F 00187 movf HIndex,W ; pointer to middle byte of constatnt
004A 207E 00188 call DecTable
004B 1403 00189 bsf STATUS,C
004C 02AD 00190 subwf HigB,F ; HigB - W -> HigB
004D 1803 00191 btfsc STATUS,C ; if underflow -> C=0
004E 2851 00192 goto ClearCF
004F 1403 00193 bsf STATUS,C
0050 2852 00194 goto SubEnd
0051 0C2E 00195 ClearCF rrf TEMP,C ; C -> STATUS
0052 3400 00196 SubEnd retlw 0
00197
00198 ;=================================================================================
00199 ; 3 byte addition of the constant from the table which sets carry if
00200 ; result overflows
00201 ;=================================================================================
0053 01AE 00202 Addc24 clrf TEMP ; register for TEMPorary storage of C
0054 0820 00203 movf Index,W ; pointer to lower byte of const into W
0055 00AF 00204 movwf HIndex ; save it into HIndex
0056 207E 00205 call DecTable ; W contains low byte of const
0057 1003 00206 bcf STATUS,C ; clear C
0058 07AB 00207 addwf LowB,1 ; W + LowB -> LowB
0059 1C03 00208 btfss STATUS,C ; test overflow
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 5
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
005A 2866 00209 goto Add2
005B 1003 00210 bcf STATUS,C ; clear C
005C 3001 00211 movlw 1
005D 07AC 00212 addwf MidB,F ; increment MidB
005E 1C03 00213 btfss STATUS,C
005F 2866 00214 goto Add2
0060 1003 00215 bcf STATUS,C
0061 3001 00216 movlw 1
0062 07AD 00217 addwf HigB,F ; increment HigB
0063 1C03 00218 btfss STATUS,C ; test overflow
0064 2866 00219 goto Add2
0065 142E 00220 bsf TEMP,C ; store C
0066 03AF 00221 Add2 decf HIndex,F ; pointer to middle byte into W
0067 082F 00222 movf HIndex,W
0068 207E 00223 call DecTable
0069 1003 00224 bcf STATUS,C
006A 07AC 00225 addwf MidB,1 ; W + MidB -> MidB
006B 1C03 00226 btfss STATUS,C
006C 2873 00227 goto Add3
006D 1003 00228 bcf STATUS,C ; clear C
006E 3001 00229 movlw 1
006F 07AD 00230 addwf HigB,1 ; increment HigB
0070 1C03 00231 btfss STATUS,C
0071 2873 00232 goto Add3
0072 142E 00233 bsf TEMP,C
0073 03AF 00234 Add3 decf HIndex,F ; pointer to higher byte into W
0074 082F 00235 movf HIndex,W
0075 207E 00236 call DecTable
0076 1403 00237 bsf STATUS,C
0077 07AD 00238 addwf HigB,F ; W + HigB -> HigB,
0078 1C03 00239 btfss STATUS,C
0079 287C 00240 goto ClarCF
007A 1403 00241 bsf STATUS,C
007B 287D 00242 goto AddEnd
007C 0C2E 00243 ClarCF rrf TEMP,C ; C -> STATUS
007D 3400 00244 AddEnd retlw 0
00245
00246 ;=================================================================================
00247 ;Tables for 3 byte constants
00248 ;Table of decades
00249 ;=================================================================================
007E 0782 00250 DecTable addwf PCL,F ; W + PCL -> PCL
007F 3400 00251 retlw 0 ; 10
0080 3400 00252 retlw 0 ;
0081 340A 00253 retlw 0Ah ;
00254
0082 3400 00255 retlw 0 ; 100
0083 3400 00256 retlw 0 ;
0084 3464 00257 retlw 064h ;
00258
0085 3400 00259 retlw 0 ; 1 000
0086 3403 00260 retlw 03h ;
0087 34E8 00261 retlw 0E8h ;
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 6
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00262
0088 3400 00263 retlw 0 ; 10 000
0089 3427 00264 retlw 027h ;
008A 3410 00265 retlw 010h ;
00266
008B 3401 00267 retlw 01h ; 100 000
008C 3486 00268 retlw 086h ;
008D 34A0 00269 retlw 0A0h ;
00270
008E 340F 00271 retlw 0Fh ; 1 000 000
008F 3442 00272 retlw 042h ;
0090 3440 00273 retlw 040h ;
00274
00275 ;=================================================================================
00276 ;Entry point for main cycle
00277 ;=================================================================================
00278 ;Routine for the conversion of 3 byte number into 7 decimal numbers
00279 ;=================================================================================
0091 3011 00280 Start movlw 6*3-1 ; pointer to dec. table
0092 00A0 00281 movwf Index ; 6*3-1 -> Index
00282
0093 3009 00283 movlw 9 ; maximum of substractions
0094 00A1 00284 movwf Count ; 9 -> Count
00285
0095 01A2 00286 clrf Help
00287
0096 3006 00288 movlw 6
0097 00B0 00289 movwf LEDIndex
00290
0098 2028 00291 Divide call Subc24 ; substract untill result is negative,
0099 1803 00292 btfsc STATUS,C ; add last substracted number
009A 28A2 00293 goto Add24 ; next digit
009B 0AA2 00294 incf Help,F
009C 03A1 00295 decf Count,F
009D 1D03 00296 btfss STATUS,Z
009E 2898 00297 goto Divide
009F 3003 00298 movlw 3
00A0 02A0 00299 subwf Index,F
00A1 28A5 00300 goto Next
00301
00A2 2053 00302 Add24 call Addc24
00A3 3003 00303 movlw 03h
00A4 02A0 00304 subwf Index,F
00305
00A5 3009 00306 Next movlw 9
00A6 00A1 00307 movwf Count
00A7 3024 00308 movlw LED1 ; LED1 -> W
00A8 0730 00309 addwf LEDIndex,W ; LED1 + LEDIndex -> W
00A9 00AE 00310 movwf TEMP
00AA 03AE 00311 decf TEMP,F ; LEDIndex+LED1-1 -> TEMP
00AB 082E 00312 movf TEMP,W
00313
00AC 0084 00314 movwf FSR ; W -> FSR
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 7
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00AD 0822 00315 movf Help,W ; Help -> W
00AE 01A2 00316 clrf Help ; save result at LEDx
00AF 0080 00317 movwf INDF ; W -> LED(6..1)
00B0 03B0 00318 decf LEDIndex,F
00319
00B1 3001 00320 movlw 1
00B2 0720 00321 addwf Index,W
00B3 1D03 00322 btfss STATUS,Z
00B4 2898 00323 goto Divide
00324
00B5 082B 00325 movf LowB,W
00B6 00A3 00326 movwf LED0 ; the rest -> LED0
00327
00328 ;=================================================================================
00329 ;registers LED0..LED6 are filled with values - ready to be displayed
00330 ;=================================================================================
00B7 3006 00331 movlw 6
00B8 00B0 00332 movwf LEDIndex
00333
00B9 3010 00334 movlw 10H ;Locate LCD cursor on row 1, col 0
00BA 214E 00335 call LcdLocate
00336
00BB 3023 00337 LEDCycle movlw LED0 ;LED0 -> W
00BC 0730 00338 addwf LEDIndex,W ;LED1 + LEDIndex -> W
00339
00BD 0084 00340 movwf FSR ;W -> FSR
00BE 0800 00341 movf INDF,W ;LED(0..6) -> W
00342
00BF 3830 00343 iorlw 030h
00C0 2159 00344 call LcdSendData ;Display character
00345
00346 ;movlw 5 ;test for decimal point
00C1 3005 00347 movlw 5 ;test for decimal point
00C2 1503 00348 bsf STATUS,Z
00C3 0230 00349 subwf LEDIndex,W
00C4 1D03 00350 btfss STATUS,Z
00C5 28C8 00351 goto NoDot
00C6 302E 00352 movlw '.' ;this can be ' ' or ',' ......
00C7 2159 00353 call LcdSendData ;Display character
00354
00C8 0BB0 00355 NoDot decfsz LEDIndex,F
00C9 28BB 00356 goto LEDCycle ;continue with next number
00357
00CA 3023 00358 movlw LED0 ;LED0 -> W
00CB 0730 00359 addwf LEDIndex,W ;LED0 + LEDIndex -> W
00360
00CC 0084 00361 movwf FSR ;W -> FSR
00CD 0800 00362 movf INDF,W ;[FSR] -> W
00363
00CE 3830 00364 iorlw 030h
00CF 2159 00365 call LcdSendData ;Display character
00366
00D0 3020 00367 movlw ' '
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 8
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00D1 2159 00368 call LcdSendData ;Display character
00D2 304D 00369 movlw 'M'
00D3 2159 00370 call LcdSendData ;Display character
00D4 3048 00371 movlw 'H'
00D5 2159 00372 call LcdSendData ;Display character
00D6 307A 00373 movlw 'z'
00D7 2159 00374 call LcdSendData ;Display character
00375
00D8 3010 00376 movlw 10H ;Locate LCD cursor on row 1, col 0
00D9 214E 00377 call LcdLocate
00378
00379 ;=================================================================================
00380 ;It is time to prepare new measuring cycle
00381 ;=================================================================================
00DA 01AA 00382 clrf TimerH
00DB 0181 00383 clrf TMR0
00DC 0000 00384 nop ;it is SUGGESTED...
00DD 0000 00385 nop
00386
00DE 01B0 00387 clrf LEDIndex
00388
00DF 30FC 00389 movlw T1 ;set initial counter values
00E0 00B1 00390 movwf R1
00E1 300B 00391 movlw T2
00E2 00B2 00392 movwf R2
00E3 3004 00393 movlw T3
00E4 00B3 00394 movwf R3
00395
00E5 018B 00396 clrf INTCON ;global INT disable, TMR0 INT disable
00397 ;clear TMR0 overflow bite
00398
00399 ;=================================================================================
00400 ;Start measurement: RA3 + RA4 set input
00401 ;=================================================================================
00E6 3010 00402 movlw b'00010000' ;all ports set L, RA4 set H
00E7 0085 00403 movwf PORTA
00404
00E8 1683 00405 bsf STATUS,RP0
00E9 301F 00406 movlw b'00011111' ;RA0..RA4 input
00EA 0085 00407 movwf TRISA
00EB 1283 00408 bcf STATUS,RP0
00409
00410 ;=================================================================================
00411 ;It is opened now...
00412 ;=================================================================================
00EC 1D0B 00413 Cycle btfss INTCON,2 ;1 Test for TMR0 overflow
00ED 28F1 00414 goto Nothing ;3
00EE 0AAA 00415 incf TimerH,F ;3
00EF 110B 00416 bcf INTCON,2 ;4
00F0 28F4 00417 goto Nxt ;6
00418
00F1 0000 00419 Nothing nop ;4
00F2 0000 00420 nop ;5
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 9
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00F3 0000 00421 nop ;6
00422
00F4 0BB1 00423 Nxt decfsz R1,F ;7
00F5 28EC 00424 goto Cycle ;9
00F6 30FC 00425 movlw T1 ;9*T1
00426
00F7 00B1 00427 movwf R1 ;9*T1+1
00F8 0BB2 00428 decfsz R2,F ;9*T1+2
00F9 28EC 00429 goto Cycle ;9*T1+4
00FA 300B 00430 movlw T2 ;9*T1+4)*T2
00431
00FB 00B2 00432 movwf R2 ;(9*T1+4)*T2+1
00FC 0BB3 00433 decfsz R3,F ;(9*T1+4)*T2+2
00FD 28EC 00434 goto Cycle ;(9*T1+4)*T2+4
00435
00436 ;=================================================================================
00437 ;Final test for TMR0 overflow
00438 ;=================================================================================
00FE 3002 00439 movlw T4 ;((9*T1+4)*T2+4)*T3
00FF 00A2 00440 movwf Help ;((9*T1+4)*T2+4)*T3+1
00441
0100 1D0B 00442 Cycle2 btfss INTCON,2 ;1
0101 2905 00443 goto Not2Do ;3
0102 0AAA 00444 incf TimerH,F ;3
0103 110B 00445 bcf INTCON,2 ;4
0104 2908 00446 goto Nx ;6
00447
0105 0000 00448 Not2Do nop ;4
0106 0000 00449 nop ;5
0107 0000 00450 nop ;6
00451
0108 0BA2 00452 Nx decfsz Help,F ;7
0109 2900 00453 goto Cycle2 ;9
010A 0000 00454 nop ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
00455 ;=================================================================================
00456 ; Z times fine tuning nops ; altere aqui os nop para calibrar, aumentando
010B 0000 00457 nop ; ou diminuindo.
010C 0000 00458 nop
010D 0000 00459 nop
00460
00461 ;=================================================================================
00462 ; Stop the measurement
00463 ;=================================================================================
010E 0103 00464 clrw ;1
010F 0086 00465 movwf PORTB ;2
0110 3010 00466 movlw b'00010000' ;3 RA0..RA3 = 0
0111 0085 00467 movwf PORTA ;4 W -> PORTA
00468 ;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
0112 1683 00469 bsf STATUS,RP0 ;
0113 3017 00470 movlw b'00010111' ;RA3 output
0114 0085 00471 movwf TRISA ;RA0..RA2,RA4 input
0115 1283 00472 bcf STATUS,RP0 ;
00473
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 10
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00474 ;=================================================================================
00475 ; Analyse precounter and store counted value in registers
00476 ;=================================================================================
0116 0801 00477 movf TMR0,W
0117 00AC 00478 movwf MidB ;TMR0 -> MidB
00479
0118 082A 00480 movf TimerH,W
0119 00AD 00481 movwf HigB ;TimerH -> HigB
00482
011A 01AE 00483 clrf TEMP
00484
011B 0AAE 00485 CountIt incf TEMP,F
011C 1585 00486 bsf PORTA,3 ;_| false impulz
011D 1185 00487 bcf PORTA,3 ;|_
00488
011E 110B 00489 bcf INTCON,2
011F 0801 00490 movf TMR0,W ;actual TMR0 -> W
0120 1103 00491 bcf STATUS,Z
0121 022C 00492 subwf MidB,W
0122 1903 00493 btfsc STATUS,Z
0123 291B 00494 goto CountIt
0124 0AAE 00495 incf TEMP,F
0125 09AE 00496 comf TEMP,F
0126 0AAE 00497 incf TEMP,F
0127 0A2E 00498 incf TEMP,W
00499
0128 00AB 00500 movwf LowB
0129 2891 00501 goto Start ;start new cycle
00502
00503 ;================================================================================
00504 ;Include Files
00505 ;================================================================================
00506 #INCLUDE <vdisplay.inc>
00001 ;===============================================================================
00002 ; Filename: vdisplay.inc
00003 ; Date: 18/06/2003
00004 ; File Version: 1.0 para QRP QB a pedido de PY2RLM
00005 ; Original file: OM3CPH
00006 ; Author: Vila Real
00007 ; Company: WVR-2000
00008 ;================================================================================
00009 ; Files required:
00010 ;================================================================================
00011 ; Notes:
00012 ;================================================================================
00013
00014 ;================================================================================
00015 ;CONSTANTS DEFINITIONS
00016 ;================================================================================
00017 ;LCD Control lines
00000002 00018 LCD_RS equ 2 ;Register Select
00000003 00019 LCD_E equ 3 ;Enable
00020
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 11
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00021 ;LCD data line bus
00000004 00022 LCD_DB4 equ 4 ;LCD data line DB4
00000005 00023 LCD_DB5 equ 5 ;LCD data line DB5
00000006 00024 LCD_DB6 equ 6 ;LCD data line DB6
00000007 00025 LCD_DB7 equ 7 ;LCD data line DB7
00026
00027 ;=================================================================================
00028 ;Rotina de retardo, onde w=tempo em ms - clock=20MHz
00029 ;=================================================================================
012A 00B9 00030 LcdDelay movwf LcdDelayCounter+1 ;duas vari veis em uma
012B 01B8 00031 clrf LcdDelayCounter+0
00032 ;return ;retorno p/debug********
*********
012C 00033 LcdDelayLoop ;goto $+1 ;1 ms (about) internal loop
00034 ;goto $+1 ;equivale a 2xnop
00035 ;goto $+1 ;todas linhas comentadas
00036 ;goto $+1 ;p/ 4Mhz
00037 ;goto $+1 ;
00038 ;goto $+1 ;
00039 ;goto $+1 ;
00040 ;goto $+1 ;
012C 0000 00041 nop ;
012D 0BB8 00042 decfsz LcdDelayCounter+0,F ;dec. o prim. cont.
012E 292C 00043 goto LcdDelayLoop
012F 0BB9 00044 decfsz LcdDelayCounter+1,F ;dec. o seg. cont.
0130 292C 00045 goto LcdDelayLoop
0131 0008 00046 return
00047
00048 ;=================================================================================
00049 ;Rotinas de controle do LCD
00050 ;=================================================================================
0132 301E 00051 LcdInit movlw 30 ;Wait 30 ms
0133 212A 00052 call LcdDelay
00053
0134 1106 00054 bcf PORTB,LCD_RS ;Set LCD command mode
00055
0135 1606 00056 bsf PORTB,LCD_DB4 ;0011->48
0136 1686 00057 bsf PORTB,LCD_DB5
0137 1306 00058 bcf PORTB,LCD_DB6
0138 1386 00059 bcf PORTB,LCD_DB7
0139 2180 00060 call LcdPulse_E ;sequ ncia de reset
013A 2180 00061 call LcdPulse_E
013B 2180 00062 call LcdPulse_E
00063
013C 1206 00064 bcf PORTB,LCD_DB4 ;0010->32
013D 1686 00065 bsf PORTB,LCD_DB5
013E 1306 00066 bcf PORTB,LCD_DB6
013F 1386 00067 bcf PORTB,LCD_DB7
0140 2180 00068 call LcdPulse_E
00069
0141 3028 00070 movlw 28H ;Set 4 bit data bus length
0142 215C 00071 call LcdSendCommand
0143 3006 00072 movlw 06H ;Entry mode set, increment, no shift
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 12
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0144 215C 00073 call LcdSendCommand
0145 300C 00074 movlw 0CH ;Display ON, Curson OFF, Blink OFF
0146 215C 00075 call LcdSendCommand
0147 2149 00076 call LcdClear ;clear display
0148 0008 00077 return
00078
0149 3001 00079 LcdClear movlw 01H
014A 215C 00080 call LcdSendCommand
014B 3002 00081 movlw 2 ;Wait 2 ms
014C 212A 00082 call LcdDelay
014D 0008 00083 return
00084
014E 00B7 00085 LcdLocate movwf tmpLcdRegister+0 ;Locate cursor on LCD
014F 3080 00086 movlw 80H ;W = D7-D4 row, D3-D0 co
l
0150 00B8 00087 movwf tmpLcdRegister+1 ;00h=linha0/10h=linha1
0151 0837 00088 movf tmpLcdRegister+0,W
0152 390F 00089 andlw 0FH
0153 04B8 00090 iorwf tmpLcdRegister+1,F
0154 1A37 00091 btfsc tmpLcdRegister+0,4
0155 1738 00092 bsf tmpLcdRegister+1,6
0156 0838 00093 movf tmpLcdRegister+1,W
0157 215C 00094 call LcdSendCommand
0158 0008 00095 return
00096
0159 1506 00097 LcdSendData bsf PORTB,LCD_RS
015A 215F 00098 call LcdSendByte
015B 0008 00099 return
00100
015C 1106 00101 LcdSendCommand bcf PORTB,LCD_RS
015D 215F 00102 call LcdSendByte
015E 0008 00103 return
00104
015F 00B7 00105 LcdSendByte movwf tmpLcdRegister ;Send a byte to LCD by 4 bit data bus
00106
0160 1206 00107 bcf PORTB,LCD_DB4 ;Send highter four bits
0161 1286 00108 bcf PORTB,LCD_DB5
0162 1306 00109 bcf PORTB,LCD_DB6
0163 1386 00110 bcf PORTB,LCD_DB7
00111
0164 1A37 00112 btfsc tmpLcdRegister,4
0165 1606 00113 bsf PORTB,LCD_DB4
0166 1AB7 00114 btfsc tmpLcdRegister,5
0167 1686 00115 bsf PORTB,LCD_DB5
0168 1B37 00116 btfsc tmpLcdRegister,6
0169 1706 00117 bsf PORTB,LCD_DB6
016A 1BB7 00118 btfsc tmpLcdRegister,7
016B 1786 00119 bsf PORTB,LCD_DB7
00120
016C 2180 00121 call LcdPulse_E
00122
016D 1206 00123 bcf PORTB,LCD_DB4 ;Send lower four bits
016E 1286 00124 bcf PORTB,LCD_DB5
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 13
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
016F 1306 00125 bcf PORTB,LCD_DB6
0170 1386 00126 bcf PORTB,LCD_DB7
00127
0171 1837 00128 btfsc tmpLcdRegister,0
0172 1606 00129 bsf PORTB,LCD_DB4
0173 18B7 00130 btfsc tmpLcdRegister,1
0174 1686 00131 bsf PORTB,LCD_DB5
0175 1937 00132 btfsc tmpLcdRegister,2
0176 1706 00133 bsf PORTB,LCD_DB6
0177 19B7 00134 btfsc tmpLcdRegister,3
0178 1786 00135 bsf PORTB,LCD_DB7
00136
0179 2180 00137 call LcdPulse_E
017A 0008 00138 return
00139
017B 3018 00140 LcdShiftL movlw 18h ;Shift Mensagem
017C 215C 00141 call LcdSendCommand
017D 3096 00142 movlw 150
017E 212A 00143 call LcdDelay
017F 0008 00144 return
00145
0180 1586 00146 LcdPulse_E bsf PORTB,LCD_E ;Enables LCD
0181 3001 00147 movlw 1 ;Wait 1ms
0182 212A 00148 call LcdDelay
0183 1186 00149 bcf PORTB,LCD_E ;Disabled LCD
0184 3001 00150 movlw 1 ;Wait 1ms
0185 212A 00151 call LcdDelay
0186 0008 00152 return
00153
00154 ;===============================================================================
00155 ;Rotinas gen ricas
00156 ;===============================================================================
0187 3000 00157 ShowLoad movlw 00H ;Locate LCD cursor on row 0, col 0
0188 214E 00158 call LcdLocate
0189 304C 00159 movlw 'L' ;Shows "Loading..." string on LCD
018A 2159 00160 call LcdSendData
018B 306F 00161 movlw 'o'
018C 2159 00162 call LcdSendData
018D 3061 00163 movlw 'a'
018E 2159 00164 call LcdSendData
018F 3064 00165 movlw 'd'
0190 2159 00166 call LcdSendData
0191 3069 00167 movlw 'i'
0192 2159 00168 call LcdSendData
0193 306E 00169 movlw 'n'
0194 2159 00170 call LcdSendData
0195 3067 00171 movlw 'g'
0196 2159 00172 call LcdSendData
0197 302E 00173 movlw '.'
0198 2159 00174 call LcdSendData
0199 302E 00175 movlw '.'
019A 2159 00176 call LcdSendData
019B 302E 00177 movlw '.'
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 14
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
019C 2159 00178 call LcdSendData
019D 30FF 00179 movlw 255 ;retardo p/ efeito
019E 212A 00180 call LcdDelay
00181
019F 3010 00182 movlw 10H ;Locate LCD cursor on row 1, col 0
01A0 214E 00183 call LcdLocate
00184
01A1 300D 00185 movlw 13 ;n mero de vezes que o caracter vai
01A2 00B4 00186 movwf temp ;se repetir
01A3 3023 00187 PutChar movlw '#' ;car cter a ser impresso
01A4 2159 00188 call LcdSendData
01A5 30FF 00189 movlw 255
01A6 212A 00190 call LcdDelay
01A7 0BB4 00191 decfsz temp,f
01A8 29A3 00192 goto PutChar
00193
01A9 30FF 00194 movlw 255 ;retardo p/ efeito
01AA 212A 00195 call LcdDelay
01AB 2149 00196 call LcdClear ;limpa LCD
01AC 0008 00197 return
00198
01AD 3000 00199 ShowName movlw 00H ;Locate LCD cursor on row 0, col 0
01AE 214E 00200 call LcdLocate
01AF 3046 00201 movlw 'F' ;Shows "WVR-2002" string on LCD
01B0 2159 00202 call LcdSendData
01B1 3052 00203 movlw 'R'
01B2 2159 00204 call LcdSendData
01B3 3045 00205 movlw 'E'
01B4 2159 00206 call LcdSendData
01B5 3051 00207 movlw 'Q'
01B6 2159 00208 call LcdSendData
01B7 3055 00209 movlw 'U'
01B8 2159 00210 call LcdSendData
01B9 3045 00211 movlw 'E'
01BA 2159 00212 call LcdSendData
01BB 304E 00213 movlw 'N'
01BC 2159 00214 call LcdSendData
01BD 3043 00215 movlw 'C'
01BE 2159 00216 call LcdSendData
01BF 3049 00217 movlw 'I'
01C0 2159 00218 call LcdSendData
01C1 3041 00219 movlw 'A'
01C2 2159 00220 call LcdSendData
01C3 3020 00221 movlw ' '
01C4 2159 00222 call LcdSendData
01C5 30FF 00223 movlw 255 ;retardo p/ efeito
01C6 212A 00224 call LcdDelay
01C7 30FF 00225 movlw 255
01C8 212A 00226 call LcdDelay
01C9 0008 00227 return
00228
01CA 3010 00229 ShowHello movlw 10H ;Locate LCD cursor on row 1, col 0
01CB 214E 00230 call LcdLocate
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 15
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
01CC 3051 00231 movlw 'Q' ;Shows "HELLO WORLD" string on LCD
01CD 2159 00232 call LcdSendData
01CE 3052 00233 movlw 'R'
01CF 2159 00234 call LcdSendData
01D0 3050 00235 movlw 'P'
01D1 2159 00236 call LcdSendData
01D2 3020 00237 movlw ' '
01D3 2159 00238 call LcdSendData
01D4 3042 00239 movlw 'B'
01D5 2159 00240 call LcdSendData
01D6 3052 00241 movlw 'R'
01D7 2159 00242 call LcdSendData
01D8 3020 00243 movlw ' '
01D9 2159 00244 call LcdSendData
01DA 3046 00245 movlw 'F'
01DB 2159 00246 call LcdSendData
01DC 3052 00247 movlw 'R'
01DD 2159 00248 call LcdSendData
01DE 3045 00249 movlw 'E'
01DF 2159 00250 call LcdSendData
01E0 3051 00251 movlw 'Q'
01E1 2159 00252 call LcdSendData
01E2 3020 00253 movlw ' '
01E3 2159 00254 call LcdSendData
01E4 3021 00255 movlw '!'
01E5 2159 00256 call LcdSendData
01E6 30FF 00257 movlw 255 ;retardo p/ efeito
01E7 212A 00258 call LcdDelay
01E8 30FF 00259 movlw 255
01E9 212A 00260 call LcdDelay
01EA 30FF 00261 movlw 255
01EB 212A 00262 call LcdDelay
01EC 30FF 00263 movlw 255
01ED 212A 00264 call LcdDelay
01EE 0008 00265 return
00266
00507
00508 END
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 16
SYMBOL TABLE
LABEL VALUE
ADEN 00000003
Add2 00000066
Add24 000000A2
Add3 00000073
AddEnd 0000007D
Addc24 00000053
BANK0 BCF STATUS,RP0
BANK1 BSF STATUS,RP0
BRGH 00000002
C 00000000
C1INV 00000004
C1OUT 00000006
C2INV 00000005
C2OUT 00000007
CCP1CON 00000017
CCP1IE 00000002
CCP1IF 00000002
CCP1M0 00000000
CCP1M1 00000001
CCP1M2 00000002
CCP1M3 00000003
CCP1X 00000005
CCP1Y 00000004
CCPR1H 00000016
CCPR1L 00000015
CIS 00000003
CM0 00000000
CM1 00000001
CM2 00000002
CMCON 0000001F
CMIE 00000006
CMIF 00000006
CREN 00000004
CSRC 00000007
ClarCF 0000007C
ClearCF 00000051
Count 00000021
CountIt 0000011B
Cycle 000000EC
Cycle2 00000100
DC 00000001
DecTable 0000007E
Divide 00000098
EEADR 0000009B
EECON1 0000009C
EECON2 0000009D
EEDATA 0000009A
EEIE 00000007
EEIF 00000007
F 00000001
FERR 00000002
FSR 00000004
GIE 00000007
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 17
SYMBOL TABLE
LABEL VALUE
HIndex 0000002F
Help 00000022
HigB 0000002D
INDF 00000000
INTCON 0000000B
INTE 00000004
INTEDG 00000006
INTF 00000001
IRP 00000007
Index 00000020
Init 00000001
LCD_DB4 00000004
LCD_DB5 00000005
LCD_DB6 00000006
LCD_DB7 00000007
LCD_E 00000003
LCD_RS 00000002
LED0 00000023
LED1 00000024
LED2 00000025
LED3 00000026
LED4 00000027
LED5 00000028
LED6 00000029
LEDCycle 000000BB
LEDIndex 00000030
LcdClear 00000149
LcdDelay 0000012A
LcdDelayCounter 00000038
LcdDelayLoop 0000012C
LcdInit 00000132
LcdLocate 0000014E
LcdPulse_E 00000180
LcdSendByte 0000015F
LcdSendCommand 0000015C
LcdSendData 00000159
LcdShiftL 0000017B
LowB 0000002B
MidB 0000002C
NOT_BO 00000000
NOT_BOD 00000000
NOT_BOR 00000000
NOT_PD 00000003
NOT_POR 00000001
NOT_RBPU 00000007
NOT_T1SYNC 00000002
NOT_TO 00000004
Next 000000A5
NoDot 000000C8
Not2Do 00000105
Nothing 000000F1
Nx 00000108
Nxt 000000F4
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 18
SYMBOL TABLE
LABEL VALUE
OERR 00000001
OPTION_REG 00000081
OSCF 00000003
PCL 00000002
PCLATH 0000000A
PCON 0000008E
PEIE 00000006
PIE1 0000008C
PIR1 0000000C
PORTA 00000005
PORTB 00000006
PR2 00000092
PS0 00000000
PS1 00000001
PS2 00000002
PSA 00000003
PutChar 000001A3
R1 00000031
R2 00000032
R3 00000033
RBIE 00000003
RBIF 00000000
RCIE 00000005
RCIF 00000005
RCREG 0000001A
RCSTA 00000018
RD 00000000
RP0 00000005
RP1 00000006
RX9 00000006
RX9D 00000000
SPBRG 00000099
SPEN 00000007
SREN 00000005
STATUS 00000003
SYNC 00000004
ShowHello 000001CA
ShowLoad 00000187
ShowName 000001AD
Start 00000091
Step1 0000003B
Step2 00000048
SubEnd 00000052
Subc24 00000028
T0CS 00000005
T0IE 00000005
T0IF 00000002
T0SE 00000004
T1 000000FC
T1CKPS0 00000004
T1CKPS1 00000005
T1CON 00000010
T1OSCEN 00000003
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 19
SYMBOL TABLE
LABEL VALUE
T2 0000000B
T2CKPS0 00000000
T2CKPS1 00000001
T2CON 00000012
T3 00000004
T4 00000002
TEMP 0000002E
TMR0 00000001
TMR1CS 00000001
TMR1H 0000000F
TMR1IE 00000000
TMR1IF 00000000
TMR1L 0000000E
TMR1ON 00000000
TMR2 00000011
TMR2IE 00000001
TMR2IF 00000001
TMR2ON 00000002
TOUTPS0 00000003
TOUTPS1 00000004
TOUTPS2 00000005
TOUTPS3 00000006
TRISA 00000085
TRISB 00000086
TRMT 00000001
TX9 00000006
TX9D 00000000
TXEN 00000005
TXIE 00000004
TXIF 00000004
TXREG 00000019
TXSTA 00000098
TimerH 0000002A
VR0 00000000
VR1 00000001
VR2 00000002
VR3 00000003
VRCON 0000009F
VREN 00000007
VROE 00000006
VRR 00000005
W 00000000
WR 00000001
WREN 00000002
WRERR 00000003
Z 00000002
_BODEN_OFF 00003FBF
_BODEN_ON 00003FFF
_BOREN_OFF 00003FBF
_BOREN_ON 00003FFF
_CP_OFF 00003FFF
_CP_ON 00001FFF
_DATA_CP_OFF 00003FFF
MPASM 03.50 Released FREQ3.ASM 1-8-2005 11:46:37 PAGE 20
SYMBOL TABLE
LABEL VALUE
_DATA_CP_ON 00003EFF
_ER_OSC_CLKOUT 00003FFF
_ER_OSC_NOCLKOUT 00003FFE
_EXTCLK_OSC 00003FEF
_HS_OSC 00003FEE
_INTOSC_OSC_CLKOUT 00003FFD
_INTOSC_OSC_NOCLKOUT 00003FFC
_INTRC_OSC_CLKOUT 00003FFD
_INTRC_OSC_NOCLKOUT 00003FFC
_LP_OSC 00003FEC
_LVP_OFF 00003F7F
_LVP_ON 00003FFF
_MCLRE_OFF 00003FDF
_MCLRE_ON 00003FFF
_PWRTE_OFF 00003FFF
_PWRTE_ON 00003FF7
_RC_OSC_CLKOUT 00003FFF
_RC_OSC_NOCLKOUT 00003FFE
_WDT_OFF 00003FFB
_WDT_ON 00003FFF
_XT_OSC 00003FED
__16F628A 00000001
status_temp 00000036
temp 00000034
tmpLcdRegister 00000037
w_temp 00000035
MEMORY USAGE MAP ('X' = Used, '-' = Unused)
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX- ----------------
2000 : XXXX---X-------- ---------------- ---------------- ----------------
All other memory blocks unused.
Program Memory Words Used: 495
Program Memory Words Free: 1553
Errors : 0
Warnings : 0 reported, 0 suppressed
Messages : 0 reported, 8 suppressed
************************************************************************
Para PIC 16F628A
*******************************************************
Para PIC 16F628-04
ASM
;===============================================================================
; Filename: freq_628.asm
; Date: 23/03/2004
; File Version: 1.0
; Orig. Files: Peter Halicky OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
; Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
;================================================================================
; Files required: vdisplay.inc
;================================================================================
; Notes:
; Remoção das rotinas de Lcd, inclusão da vdisplay.inc
; Correção da diretiva Radix
; Inclusão de pag. de memória
; Relocação de variáveis
; Recálculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
; T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz
;================================================================================
;================================================================================
;DIRETIVAS DE COMPILAÇÃO
;================================================================================
LIST P=16F628 ;list directive to define processor
#INCLUDE <p16f628.inc> ;processor specific variable definitions
__IDLOCS 2003 ;dados a serem gravados na EEPROM
ERRORLEVEL -302 ;suppress bank selection messages
RADIX DEC ;set to decimal
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF
;=================================================================================
;VARIABLE DEFINITIONS
;=================================================================================
CBLOCK 0x20 ;endereço inicial p/ variáveis
Index ;dummy register
Count ;inkremental register
Help ;dummy register
LED0
LED1
LED2
LED3
LED4
LED5
LED6
TimerH ;the highest byte of SW counter
LowB ;low byte of resulted frequency
MidB ;middle byte of resulted frequency
HigB ;high byte of resulted frequency
TEMP ;temporary register
HIndex ;index register
LEDIndex ;LED pointer
R1 ;Timing counters
R2
R3
temp
w_temp ;variable used for context saving
status_temp ;variable used for context saving
tmpLcdRegister ;devem permanecer no final
LcdDelayCounter ;pois ocupam 4 bytes
ENDC
;=================================================================================
;PAGINAÇÃO DE MEMÓRIA
;=================================================================================
#DEFINE BANK0 BCF STATUS,RP0 ;seta bank0 de memória
#DEFINE BANK1 BSF STATUS,RP0 ;seta bank1 de memória
;=================================================================================
;Timing Loop values ; QRP BR - AQUI SÃO OS AJUSTES
;=================================================================================
T1 equ 252 ;first timing loop
T2 equ 11 ;second timing loop
T3 equ 4 ;third timing loop
T4 equ 2 ;last timing loop
;=================================================================================
;Vetor de Reset
;=================================================================================
org 0x00
goto Init
;=================================================================================
;Inicialização
;=================================================================================
Init clrf STATUS ; Do initialization, Select bank 0
clrf INTCON ; Clear int-flags, Disable interrupts
clrf PCLATH ; Keep in lower 2KByte
clrf PORTA ; ALL PORT output should output Low.
clrf PORTB
clrf Index
clrf LEDIndex
clrf LED0
clrf LED1
clrf LED2
clrf LED3
clrf LED4
clrf LED5
clrf LED6
clrf LowB
clrf MidB
clrf HigB
bsf STATUS,RP0
movlw b'00010000' ; RA0..RA3 outputs
movwf TRISA ; RA4 input
movlw 0xF0 ; RB0..RB3 outputs, rest inputs
movwf TRISB
bsf OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups
clrwdt
movlw b'10100111' ; Prescaler -> TMR0,
movwf OPTION_REG ; 1:256, rising edge
bcf STATUS,RP0 ;
BANK1
movlw 0x0F
andwf TRISB,W
movwf TRISB ; Set Port for output
BANK0
;=================================================================================
;Initialization of LCD display
call LcdInit
call ShowLoad
call ShowName
call ShowHello
call LcdClear
call ShowName
;=================================================================================
goto Start
;=================================================================================
; Numeric routines
;=================================================================================
; 3 byte substraction of the constant from the table which sets carry if
; result is negative
;=================================================================================
Subc24 clrf TEMP ; it will TEMPorary save C
movf Index,W ; pointer to low byte of constant
movwf HIndex ; W -> HIndex
call DecTable ; W returned with low byte of constant
bsf STATUS,C ; set C
subwf LowB,F ; LowB - W -> LowB
; if underflow -> C=0
btfsc STATUS,C
goto Step1
bsf STATUS,C
movlw 1
subwf MidB,F ; decrement MidB
; if underflow -> C=0
btfsc STATUS,C
goto Step1
bsf STATUS,C
movlw 1
subwf HigB,F ; decrement HigB
btfsc STATUS,C ; if underflow -> C=0
goto Step1
bsf TEMP,C ; set C
Step1 decf HIndex,F
movf HIndex,W ; pointer to middle byte of const
call DecTable
bsf STATUS,C
subwf MidB,F ; MidB - W -> MidB
btfsc STATUS,C ; if underflow -> C=0
goto Step2
bsf STATUS,C
movlw 1
subwf HigB,1 ; decrement HigB
btfsc STATUS,C ; if underflow -> C=0
goto Step2
bsf TEMP,C ; set C
Step2 decf HIndex,F
movf HIndex,W ; pointer to middle byte of constatnt
call DecTable
bsf STATUS,C
subwf HigB,F ; HigB - W -> HigB
btfsc STATUS,C ; if underflow -> C=0
goto ClearCF
bsf STATUS,C
goto SubEnd
ClearCF rrf TEMP,C ; C -> STATUS
SubEnd retlw 0
;=================================================================================
; 3 byte addition of the constant from the table which sets carry if
; result overflows
;=================================================================================
Addc24 clrf TEMP ; register for TEMPorary storage of C
movf Index,W ; pointer to lower byte of const into W
movwf HIndex ; save it into HIndex
call DecTable ; W contains low byte of const
bcf STATUS,C ; clear C
addwf LowB,1 ; W + LowB -> LowB
btfss STATUS,C ; test overflow
goto Add2
bcf STATUS,C ; clear C
movlw 1
addwf MidB,F ; increment MidB
btfss STATUS,C
goto Add2
bcf STATUS,C
movlw 1
addwf HigB,F ; increment HigB
btfss STATUS,C ; test overflow
goto Add2
bsf TEMP,C ; store C
Add2 decf HIndex,F ; pointer to middle byte into W
movf HIndex,W
call DecTable
bcf STATUS,C
addwf MidB,1 ; W + MidB -> MidB
btfss STATUS,C
goto Add3
bcf STATUS,C ; clear C
movlw 1
addwf HigB,1 ; increment HigB
btfss STATUS,C
goto Add3
bsf TEMP,C
Add3 decf HIndex,F ; pointer to higher byte into W
movf HIndex,W
call DecTable
bsf STATUS,C
addwf HigB,F ; W + HigB -> HigB,
btfss STATUS,C
goto ClarCF
bsf STATUS,C
goto AddEnd
ClarCF rrf TEMP,C ; C -> STATUS
AddEnd retlw 0
;=================================================================================
;Tables for 3 byte constants
;Table of decades
;=================================================================================
DecTable addwf PCL,F ; W + PCL -> PCL
retlw 0 ; 10
retlw 0 ;
retlw 0Ah ;
retlw 0 ; 100
retlw 0 ;
retlw 064h ;
retlw 0 ; 1 000
retlw 03h ;
retlw 0E8h ;
retlw 0 ; 10 000
retlw 027h ;
retlw 010h ;
retlw 01h ; 100 000
retlw 086h ;
retlw 0A0h ;
retlw 0Fh ; 1 000 000
retlw 042h ;
retlw 040h ;
;=================================================================================
;Entry point for main cycle
;=================================================================================
;Routine for the conversion of 3 byte number into 7 decimal numbers
;=================================================================================
Start movlw 6*3-1 ; pointer to dec. table
movwf Index ; 6*3-1 -> Index
movlw 9 ; maximum of substractions
movwf Count ; 9 -> Count
clrf Help
movlw 6
movwf LEDIndex
Divide call Subc24 ; substract untill result is negative,
btfsc STATUS,C ; add last substracted number
goto Add24 ; next digit
incf Help,F
decf Count,F
btfss STATUS,Z
goto Divide
movlw 3
subwf Index,F
goto Next
Add24 call Addc24
movlw 03h
subwf Index,F
Next movlw 9
movwf Count
movlw LED1 ; LED1 -> W
addwf LEDIndex,W ; LED1 + LEDIndex -> W
movwf TEMP
decf TEMP,F ; LEDIndex+LED1-1 -> TEMP
movf TEMP,W
movwf FSR ; W -> FSR
movf Help,W ; Help -> W
clrf Help ; save result at LEDx
movwf INDF ; W -> LED(6..1)
decf LEDIndex,F
movlw 1
addwf Index,W
btfss STATUS,Z
goto Divide
movf LowB,W
movwf LED0 ; the rest -> LED0
;=================================================================================
;registers LED0..LED6 are filled with values - ready to be displayed
;=================================================================================
movlw 6
movwf LEDIndex
movlw 10H ;Locate LCD cursor on row 1, col 0
call LcdLocate
LEDCycle movlw LED0 ;LED0 -> W
addwf LEDIndex,W ;LED1 + LEDIndex -> W
movwf FSR ;W -> FSR
movf INDF,W ;LED(0..6) -> W
iorlw 030h
call LcdSendData ;Display character
;movlw 5 ;test for decimal point
movlw 5 ;test for decimal point
bsf STATUS,Z
subwf LEDIndex,W
btfss STATUS,Z
goto NoDot
movlw '.' ;this can be ' ' or ',' ......
call LcdSendData ;Display character
NoDot decfsz LEDIndex,F
goto LEDCycle ;continue with next number
movlw LED0 ;LED0 -> W
addwf LEDIndex,W ;LED0 + LEDIndex -> W
movwf FSR ;W -> FSR
movf INDF,W ;[FSR] -> W
iorlw 030h
call LcdSendData ;Display character
movlw ' '
call LcdSendData ;Display character
movlw 'M'
call LcdSendData ;Display character
movlw 'H'
call LcdSendData ;Display character
movlw 'z'
call LcdSendData ;Display character
movlw 10H ;Locate LCD cursor on row 1, col 0
call LcdLocate
;=================================================================================
;It is time to prepare new measuring cycle
;=================================================================================
clrf TimerH
clrf TMR0
nop ;it is SUGGESTED...
nop
clrf LEDIndex
movlw T1 ;set initial counter values
movwf R1
movlw T2
movwf R2
movlw T3
movwf R3
clrf INTCON ;global INT disable, TMR0 INT disable
;clear TMR0 overflow bite
;=================================================================================
;Start measurement: RA3 + RA4 set input
;=================================================================================
movlw b'00010000' ;all ports set L, RA4 set H
movwf PORTA
bsf STATUS,RP0
movlw b'00011111' ;RA0..RA4 input
movwf TRISA
bcf STATUS,RP0
;=================================================================================
;It is opened now...
;=================================================================================
Cycle btfss INTCON,2 ;1 Test for TMR0 overflow
goto Nothing ;3
incf TimerH,F ;3
bcf INTCON,2 ;4
goto Nxt ;6
Nothing nop ;4
nop ;5
nop ;6
Nxt decfsz R1,F ;7
goto Cycle ;9
movlw T1 ;9*T1
movwf R1 ;9*T1+1
decfsz R2,F ;9*T1+2
goto Cycle ;9*T1+4
movlw T2 ;9*T1+4)*T2
movwf R2 ;(9*T1+4)*T2+1
decfsz R3,F ;(9*T1+4)*T2+2
goto Cycle ;(9*T1+4)*T2+4
;=================================================================================
;Final test for TMR0 overflow
;=================================================================================
movlw T4 ;((9*T1+4)*T2+4)*T3
movwf Help ;((9*T1+4)*T2+4)*T3+1
Cycle2 btfss INTCON,2 ;1
goto Not2Do ;3
incf TimerH,F ;3
bcf INTCON,2 ;4
goto Nx ;6
Not2Do nop ;4
nop ;5
nop ;6
Nx decfsz Help,F ;7
goto Cycle2 ;9
nop ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
;=================================================================================
; Z times fine tuning nops ; altere aqui os nop para calibrar, aumentando
nop ; ou diminuindo.
nop
nop
;=================================================================================
; Stop the measurement
;=================================================================================
clrw ;1
movwf PORTB ;2
movlw b'00010000' ;3 RA0..RA3 = 0
movwf PORTA ;4 W -> PORTA
;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
bsf STATUS,RP0 ;
movlw b'00010111' ;RA3 output
movwf TRISA ;RA0..RA2,RA4 input
bcf STATUS,RP0 ;
;=================================================================================
; Analyse precounter and store counted value in registers
;=================================================================================
movf TMR0,W
movwf MidB ;TMR0 -> MidB
movf TimerH,W
movwf HigB ;TimerH -> HigB
clrf TEMP
CountIt incf TEMP,F
bsf PORTA,3 ;_| false impulz
bcf PORTA,3 ;|_
bcf INTCON,2
movf TMR0,W ;actual TMR0 -> W
bcf STATUS,Z
subwf MidB,W
btfsc STATUS,Z
goto CountIt
incf TEMP,F
comf TEMP,F
incf TEMP,F
incf TEMP,W
movwf LowB
goto Start ;start new cycle
;================================================================================
;Include Files
;================================================================================
#INCLUDE <vdisplay.inc>
END
Start ;start new cycle
;================================================================================
;Include Files
;=================================================================
************************************************************************
Para PIC 16F628-04
HEX
:020000040000FA
:10000000012883018B018A0185018601A001B001CD
:10001000A301A401A501A601A701A801A901AB01A3
:10002000AC01AD01831610308500F03086008117D9
:100030006400A7308100831283160F300605860006
:10004000831232218721B921DA214921B92191284E
:10005000AE012008AF007E200314AB0203183B283A
:1000600003140130AC0203183B2803140130AD0225
:1000700003183B282E14AF032F087E200314AC0274
:100080000318482803140130AD02031848282E1421
:10009000AF032F087E200314AD0203185128031468
:1000A00052282E0C0034AE012008AF007E20031031
:1000B000AB07031C662803100130AC07031C66283D
:1000C00003100130AD07031C66282E14AF032F0860
:1000D0007E200310AC07031C732803100130AD070A
:1000E000031C73282E14AF032F087E200314AD07C2
:1000F000031C7C2803147D282E0C00348207003456
:1001000000340A3400340034643400340334E834F6
:1001100000342734103401348634A0340F34423490
:1001200040341130A0000930A100A2010630B00017
:1001300028200318A228A20AA103031D982803302F
:10014000A002A52853200330A0020930A1002430CA
:100150003007AE00AE032E0884002208A201800002
:10016000B00301302007031D98282B08A300063098
:10017000B00010304E2123303007840000083038A2
:100180005921053003153002031DC8282E3059218E
:10019000B00BBB28233030078400000830385921C9
:1001A000203059214D305921483059217A30592178
:1001B00010304E21AA01810100000000B001FC3086
:1001C000B1000B30B2000430B3008B011030850059
:1001D00083161F30850083120B1DF128AA0A0B110C
:1001E000F428000000000000B10BEC28FC30B10046
:1001F000B20BEC280B30B200B30BEC280230A2009B
:100200000B1D0529AA0A0B11082900000000000097
:10021000A20B00290000000000000000030186007E
:100220001030850083161730850083120108AC005A
:100230002A08AD00AE01AE0A851585110B11010823
:1002400003112C0203191B29AE0AAE09AE0A2E0AAD
:10025000AB009128B900B8010000B80B2C29B90BEC
:100260002C2908001E302A210611061686160613B0
:10027000861380218021802106128616061386139C
:10028000802128305C2106305C210C305C21492122
:10029000080001305C2102302A210800B7008030BC
:1002A000B80037080F39B804371A381738085C21F6
:1002B000080006155F21080006115F210800B7003D
:1002C0000612861206138613371A0616B71A8616F2
:1002D000371B0617B71B86178021061286120613D6
:1002E000861337180616B718861637190617B71962
:1002F00086178021080018305C2196302A210800DA
:10030000861501302A21861101302A21080000308B
:100310004E214330592161305921723059217230B8
:1003200059216530592167305921613059216E308A
:100330005921643059216F3059212E3059212E30E6
:1003400059212E3059212E3059212E3059212E304D
:100350005921FF302A2110304E210D30B4002330B6
:100360005921FF302A21B40BAF29FF302A2149211E
:10037000080000304E214630592152305921453075
:1003800059215130592155305921453059214E308C
:1003900059214330592149305921413059212030C8
:1003A00059212030592120305921FF302A21FF3096
:1003B0002A21080010304E21513059215230592144
:1003C000503059212D305921533059214530592170
:1003D0004D30592150305921523059214530592141
:1003E000213059212130592121305921FF302A2132
:0E03F000FF302A21FF302A21FF302A21080089
:084000000200000000000300B3
:02400E00213F50
:00000001FF
1513059215230592144
:1003C000503059212D305921533059214530592170
:1003D0004D30592150305921523059214530592141
:1003E000
************************************************************************
************************************************************************