PICBASIC - Poor Man's Scope
TESTED OK PROJECT
A project "Micro picscope" a simple visual signal monitor.
It shows a representation of the signal waveform using an alfanumeric 16*2 lcd display.
Here a PBP version with PIC16F690
Diagram is given below :
Obviously the performance are very limited; i consider this project a toy.
A graphic area of 8*40 pixels is inadequate to show anything with an acceptable accuracy.
The bandwidth is limited to 4-5KHz
The frequency counter is limited to 6 digit, the precision depends by the internal oscillator frequency.
Necessary files are given below : (assembly file and HEX code)
: : :file start: : :
'
'
'*********************************
'* Name : Pr_SCOPE.pbp *
'* Author : Pratik Gohel *
'* Date : 24/05/2012 *
'* Version : 2.0 *
'*********************************
'
'
@ DEVICE PIC16F690,INTOSCIO,WDT_OFF,PWRT_ON,MCLR_OFF,PROTECT_OFF
@ DEVICE PIC16F690,BOD_OFF,CPD_OFF,IESO_OFF,FCMEN_OFF
'
DEFINE OSC 8 'internal oscillator
'
' DEFINE INTHAND Myint 'define interrupt handler
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 ' linee display
'
DEFINE LCD_DREG PortC
DEFINE LCD_DBIT 0 ' bit 0-3 bus x display
DEFINE LCD_RSREG PortC '
DEFINE LCD_RSBIT 4 ' R/S PortC.4
DEFINE LCD_EREG PortC '
DEFINE LCD_EBIT 7 ' En PortC.7
'
' NON cambiare l'ordine obbligatorio per la conversione bin>BCD
reg0 var byte $74 'lsd del valore binario da convertire
reg1 var byte $75 'vengono tutti portati ad FF
reg2 var byte $76
reg3 var byte $77 'msd
' risultato conversione 32bit bcd
Dig0 var byte $78 'BCD lsd
Dig1 var byte $79 'rappresentazione in BCD del contatore 32 bit
Dig2 var byte $7a
Dig3 var byte $7b
Dig4 var byte $7c 'BCD msd
'
Wsave var byte $7D SYSTEM 'uso interrupt sono visibili sempre
Ssave var byte $7E SYSTEM 'nei 3 banchi
Psave var byte $7F SYSTEM 'fino a 7F
'
'
TmpW var word
TmpW2 var word
NumW var word
Dum1 var word
'
Hicntr var word '32bit frequency counter
Locntr var word
'
'
Timbase var byte 'copia sampling rate A/D
Rate var byte 'counter sampling rate
'
Index var byte
Vmin var byte
Vpp var byte
Voffset var byte
Previous var byte
Row var byte
IndxBT var byte 'pointer tabella base tempi
'
Tmp1 var byte 'temporanee
Tmp2 var byte
Sbr1 var byte 'uso in sub
Sbr2 var byte
Sbr3 var byte
'
'
Flag_V var byte 'flag vari
'
Fl_Tmp var Flag_V.0 '
'l_1 var Flag_V.1 '
'l_2 var Flag_V.2 '
'l_3 var Flag_V.3 '
'l_4 var Flag_V.4 '
' var Flag_V.5 '
' var Flag_V.6 '
' var Flag_V.7 '
'
BufABcd var byte[09] 'bank0 'buffer Ascii conversione 32bit
Adbuf var byte[63] bank1 'deposito acquisizioni A/D & lcd user char.
Pixi var byte[39] bank2 'buffer bit map
'
'
'Vcc pin 1
'Gnd pin 20
' PortA.7 'na
' PortA.6 'na
TrigIN var PortA.5 'pin 2 input Timer1 counter
' var PortA.4 'pin 3 output
Push_But var PortA.3 'pin 4 input Button
' var PortA.2 'pin 17 output
LedB var PortA.1 'pin 18 output Led
' var PortA.0 'pin 19 analog input A/D
'
'Tx var PortB.7 'pin 10 output
' var PortB.6 'pin 11 output
'Rx var PortB.5 'pin 12 input
' var PortB.4 'pin 13 output
' PortB.3 'na
' PortB.2 'na
' PortB.1 'na
' PortB.0 'na
'
' var PortC.7 'pin 9 output display En
' var PortC.6 'pin 8 output
' var PortC.5 'pin 5 output
' var PortC.4 'pin 6 output display R/S
' var PortC.3 'pin 7 output display D7
' var PortC.2 'pin 14 output " D6
' var PortC.1 'pin 15 output " D5
' var PortC.0 'pin 16 output " D4
'
'
'---------- COSTANTI
'
Cr con 13
Lf con 10
Negativo con 128
LedOn con 1
LedOFF con 0
'
'posizioni memoria valori in eeprom
VrefAD con 2 'posizione eeprom v.alimentazione
AdjFreq con 4 'adj frequency measure
Rates con 16 'start sample rate table
'--------------------------------
'
'
Goto inizio ' Skip around interrupt handler
'
asm
;
;valore da convertire in reg0-4 risultato in dig4-0
;conversione a 32bit da binario a bcd
_cv_bi2bcd
movlw 32
movwf r0 ;bit counter
clrf _dig0 ;lsd
clrf _dig1
clrf _dig2
clrf _dig3
clrf _dig4 ;msd
b2bcdl
movlw _dig0 ;point at first bcd
movwf FSR
b2bcdil
movlw 33h
addwf INDF,f ;add to low and high nybbles
btfsc INDF,3
andlw 0f0h ;low result >7 . OK (take the 3 out)
btfsc INDF,7
andlw 0fh ;hi > 7 OK.
subwf INDF,f ;any results <=7, subtract back.
incf FSR,f ;Inc. pointer for next time
movlw Wsave
subwf FSR,w
btfss STATUS,C
goto b2bcdil ;If not done, do the inner loop again.
;
rlf _reg0,f
rlf _reg1,f
rlf _reg2,f
rlf _reg3,f ;Get another bit out of bin.
rlf _dig0,f ;Put bit into bcd.
rlf _dig1,f
rlf _dig2,f
rlf _dig3,f
rlf _dig4,f
decfsz r0,f ;Do more?
goto b2bcdl ;Yes.
return
;
endasm
'
Pk_Pk:
Index = 0
Sbr1 = 255 'min --> max
Sbr2 = 0 'max --> min
repeat
Sbr3 = Adbuf[Index] 'ricerca max,min
if Sbr3 > Sbr2 then Sbr2 = Sbr3 'attuale > max
if Sbr3 < Sbr1 then Sbr1 = Sbr3 'attuale < min
Index = Index + 1
until Index > 39
Vpp = Sbr2 - Sbr1 'calcola delta
Voffset = Sbr1 'save offset
'toglie offset ai valori acquisiti
Index = 0
repeat
Sbr3 = Adbuf[Index] - Sbr1 'scala valori acquisiti
Adbuf[Index] = Sbr3 'save again
Index = Index + 1
until Index > 39
return
'
'crea una immagine bitmap trova il punto da mettere sul grafico
' punto = Ad*8/256 adatto per scala 0-255
'ritorna valori tra 0 e 7
'N.B. le letture sono scalate dell'offset per avere massima risoluzione
' TmpW = Adbuf[Index] * 8 'riporta lettura in range x pixel
' tmpW = tmpW >> 8 'scala 0 255
' Tmpw = TmpW /(Vpp+1) 'scala dinamica
Make_Bit_Map:
'ricerca fattore scala x adattare valori
if Vpp < 32 then
Dum1 = 32
else
Dum1 = Vpp + 1
endif
Index = 0
repeat
Sbr1 = (Adbuf[Index] * 8) / Dum1
'deve avere un valore da 0 a 7 che indica il pixel da accende
lookup Sbr1,[1,2,4,8,16,32,64,128],Sbr2
'sostituisce il pixel con il suo peso binario
Pixi[Index] = Sbr2
Index = Index + 1
until Index > 39
'join punti sul grafico
Previous = Pixi[0] 'primo punto
Index = 1
repeat
Sbr1 = Pixi[Index] 'punto attuale
if Sbr1 = Previous then Succ_t 'orrizzontale skip test
if Sbr1 > Previous then 'linea in salita
'line up
Sbr2 = Sbr1 'copia x fill bit risultato
Sbr3 = Previous << 1 'inizia da un punto sopra al precedente
while Sbr3 < Sbr1 'fino a raggiungere l'attuale
Sbr2 = Sbr2 | Sbr3 'aggiunge nuovo pixel
Sbr3 = Sbr3 << 1 'sale
wend
else 'linea in discesa
'line down
Sbr2 = Sbr1 'copia x fill bit risultato
Sbr3 = Previous >> 1 'inizia da un punto sotto al preced.
while Sbr3 > Sbr1 'fino a raggiungere l'attuale
Sbr2 = Sbr2 | Sbr3 'aggiunge nuovo pixel
Sbr3 = Sbr3 >> 1 'scende
wend
endif
Pixi[Index] = Sbr2 'aggiorna immagine
Succ_t:
Previous = Sbr1 'punto attuale diventa precedente
Index = Index + 1
until Index > 39 'scan tutte locazioni
'
'converte rappresentazione grafica della forma d'onda
'in formato compatibile per display. scandisce in orrizzontale la bitmap
'a gruppi di 5 colonne e costruisce il pattern per custom user characters
'produce 64 bytes per gli 8 caratteri definibili dall'utente
Make_user_char:
Row = 0 ' pointer char da inviare a display
Index = 0 'pointer lettura
repeat
Sbr1 = 128 'inizia da pixel in alto
repeat
Tmp2 = 0 'dato da inviare
Sbr3 = Index 'usa una copia
Sbr2 = 16 'scansione orriz. dei bit
repeat
Tmp1 = Pixi[Sbr3]
Tmp1 = Tmp1 & Sbr1 'isola bit da d7 a d0
if Tmp1 > 0 then
Tmp2 = Tmp2 | Sbr2 'produce dato uscita
endif
Sbr2 = Sbr2 >> 1 '16,8,4,2,1
Sbr3 = Sbr3 + 1 'x 5 colonne
until Sbr2 = 0
'in Tmp2 pronto dato del primo carattere
AdBuf(row) = Tmp2
row = row + 1 'scende di una riga
Sbr1 = Sbr1 >> 1 '128,64,32,16,8,4,2,1
until Sbr1 = 0
Index = Index + 5 'al gruppo seguente
until Index > 39
return
'
'Quick explanation on how to implement user-defined characters:
'First you will need to make a pixel definition for the characters
'you want to use. Below is the pixel definition for an underlined
'0' (char code 0x30) based on a 5x7 dots character definition:
' | bits | byte
' row | 76543210 | value
' ------------------------
' 000 | xxx | 0x0E
' 001 | x x | 0x11
' 010 | x xx | 0x13
' 011 | x x x | 0x15
' 100 | xx x | 0x19
' 101 | x x | 0x11
' 110 | xxx | 0x0E
' 111 | xxxxx | 0x1F
'The byte values need to be loaded into CGRAM address 00cccrrr
'- ccc = user-defined character number (0..7)
'- rrr = row number of the user-defined character (0..7)
'
Update_CGRAM:
Row = 0 'buffer pointer
Sbr3 = 0 'user definable counter
repeat
Sbr2 = Sbr3 + 64 'comando scrittura cgram
lcdout $FE,Sbr2 'N^ user defined to command register
Sbr2 = 0
repeat
Sbr1 = AdBuf(Row)
lcdout Sbr1 'user defined
Row = Row + 1
Sbr2 = Sbr2 + 1
until Sbr2 > 7 'x 8 row
Sbr3 = Sbr3 + 8 'next character
until Sbr3 > 56
' lcdout 0,1,2,3,4,5,6,7
return
'
'
Cls:
lcdout $FE,1
return
'
'==========================================
' misura frequenza usando tmr1 come contatore e tmr0 come gate di misura
Freqy:
LedB = LedON
Hicntr = 0
' option_reg = %11000111 'prescaler 256
read AdjFreq,TmpW2.byte1 'recupera aggiustamento gate time
read (AdjFreq+1),TmpW2.byte0
'adjust for precise 1sec. gate time
'tmr0 tic = 2e6 / 32768 = 16,384mS 0,999424S + 576uS = 1S 61tic
' 2e6 / 65536 = 32,768mS 0,98304S + 16,96mS = 1S 30tic
'
'no gate control no prescale no sync external clock source
t1con = 000010 'stop tmr1
Sbr1 = 0 'gate counter
tmr0 = 0
tmr1l = 0
tmr1h = 0 'clr counter
intcon.2 = 0 'clr tmr0if
pir1.0 = 0 'clr tmr1if
tmr0 = 0 'start gate misura
t1con.0 = 1 'start tmr1
repeat
if pir1.0 = 1 then 'tmr1 overflow ?
pir1.0 = 0 'clr overflow
Hicntr = Hicntr + 1
endif
if intcon.2 = 1 then 'Tmr0 overflow ?
intcon.2 = 0 'clr overflow
Sbr1 = Sbr1 + 1 'gate counter
endif
until Sbr1 > 29 '32,768mS * 30 = 0,98304S.
pauseus TmpW2 '0,98304 + 16960uS = 1S
t1con.0 = 0 'stop tmr1
if pir1.0 = 1 then 'tmr1 overflow ?
Hicntr = Hicntr + 1
endif
Locntr.byte0 = tmr1l
Locntr.byte1 = tmr1h
LedB = LedOFF
return
'
'converte in mv la lettura dell' A/D
Make_volt:
read VrefAD,TmpW2.byte1 'recupera vref da eeprom
read (VrefAd+1),TmpW2.byte0
numW = TmpW * TmpW2 'tutto in mv.
TmpW2 = DIV32 256 '(A/D*5000)/256
Lcdout dec TmpW2 dig 3,".",dec TmpW2 dig 2
return
'
'
Zero_blank:
Index = 0
Sbr1 = dig0 'lsd
gosub Bcd_split
Sbr1 = Dig1
gosub Bcd_split
Sbr1 = dig2
gosub Bcd_split
Sbr1 = dig3
gosub Bcd_split
Sbr1 = dig4 'msd
gosub Bcd_split
Index = 9
Fl_Tmp = 0
while index > 0
if BufAbcd[Index] > 0 or Fl_Tmp = 1 then
BufAbcd[Index] = BufAbcd[Index] + "0" 'ascii 0
Fl_Tmp = 1
else
BufAbcd[Index] = " " 'space
endif
index = index - 1
wend
BufAbcd[Index] = BufAbcd[Index] + "0" 'lsd non blank
return
'
Bcd_split:
BufAbcd[Index] = Sbr1 & 001111
Index = Index + 1
Sbr1 = Sbr1 >> 4
BufAbcd[Index] = Sbr1
Index = Index + 1
return
'
'
'==========================================
Inizio:
'
TRISA = %11101001 'portA configura direzione
TRISB = 101111 'portB configura direzione 0=out 1=in
TRISC = 000000 'portC configura direzione
PortA = %11111111 '
PortB = %10111111 'preset uscite
PortC = 000000
Osccon = %01110001 'select 8MHz internal clock source
'disable pullup
WpuA = 000000
WpuB = 000000
'disable comparators
CM1CON0 = 0
CM2CON0 = 0
CM2CON1 = 0
'Init timer1
T1CON = 000000 'prescale=1,Internal source,Tmr1 stop
'Init eusart
' RCSTA = %10010000 'Enable serial port and continuous receive
' TXSTA = 100000 'Enable transmit BRGH = 0
' SPBRGH = 00 '
' SPBRG = 12 '38400 @8MHz
' BAUDCTL.3 = 1 ' Enable 16 bit baudrate generator
'Init A/D
Ansel = 000001 'portA digital An0
AnselH = 000000 'portC digital
' Adcon1 = %01010000 'clock conversione Fosc/16 = 2uS
Adcon0 = 000000 'left justified,Vref = Vdd,An0,ADC stop
'no pullup,rising edge, fosc/4, prescaler=1:256
option_reg = %11000111
intcon = 0 'no interrupt
' Tmp1 = RCREG 'scarica uart receiver
' Tmp1 = RCREG 'scarica uart receiver
pause 200 'wait for display
gosub cls
lcdout " Poor SCOPE v.2"
pause 1000
lcdout $FE,12 'cursor off
Adcon0 = 000001 'adc on
' Adcon1 = 010000 'clock conversione Fosc/8 = 1uS
Adcon1 = %01010000 'clock conversione Fosc/16 = 2uS
IndxBT = 0 'pointer Time Base divider Max speed
Timbase = 0 'Max speed
'--------------
P_scope:
pause 20
if Push_But = 0 then 'Button On
IndxBT = IndxBT + 1
if IndxBT > 09 then IndxBT = 0
Sbr1 = IndxBT + Rates 'add offset
read Sbr1,Timbase 'get sampling rate divider
gosub cls
lcdout " S. Rate = ",dec Timbase
pause 400 'display
while Push_But = 0 'rilascia tasto
pause 10
wend
endif
Index = 0 'A/D buffer pointer
Dum1 = 0 'timeout
'wait for level 0 or timeout
repeat
if Push_But = 0 then P_scope 'user quit
Dum1 = Dum1 + 1 'timeout counter
LedB = Tmr0.7 'flash led
until Trigin = 0 or Dum1 = 0 'attende livello 0 o timeout
Dum1 = 0 'timeout
'wait for rising edge trigger or timeout
repeat 'loop su livello 0
if Push_But = 0 then P_scope 'user quit
LedB = Tmr0.7 'flash led
Dum1 = Dum1 + 1 'timeout counter
until Trigin = 1 or Dum1 = 0 'triggered or timeout
'start acquisizione
ADCON0.1 = 1
repeat
Rate = 0 'sample rate divider
repeat
while ADCON0.1 = 1 'A/D ready ?
wend 'wait eoc
Rate = Rate + 1
ADCON0.1 = 1 'start new conversion
until Rate > Timbase
Adbuf[Index] = ADRESH 'get & save 8 bit
Index = Index + 1
until Index > 39 'fill buffer 40 samples
'acquisizione completata
gosub Pk_Pk 'rileva Vpp
gosub Make_Bit_Map 'crea immagine
gosub Make_user_char 'converte per display
gosub Update_CGRAM 'invia bitmap al display
gosub Freqy 'misura frequenza
'---
gosub Cls
lcdout "Vpp Vof"
lcdout $FE,132 'locate cursor
lcdout 0,1,2,3,4,5,6,7 'display bitmap
lcdout $FE,$C0 'locate cursor
TmpW = Vpp
gosub Make_volt 'convert to mV & display Vpp
lcdout $FE,$CD 'locate cursor
TmpW = Voffset
gosub Make_volt 'convert to mV & display Voffset
reg3=hicntr.byte1 'binary to string conversion
reg2=hicntr.byte0
reg1=locntr.byte1
reg0=locntr.byte0
call cv_bi2bcd 'binary 2 bcd
gosub Zero_Blank
lcdout $FE,$C4 'locate cursor
Index = 5 'display 6 digit
repeat
lcdout BufAbcd[Index] 'display frequency
index = Index - 1
until Index > negativo '5-4-3-2-1-0
' lcdout hex2 dig2,hex2 dig1,hex2 dig0
' lcdout hex4 hicntr,hex4 locntr
lcdout "Hz"
pause 100
goto P_scope
'
'
data @00 ,$FF 'non usato
data @01 ,$FF 'non usato
' Vref conv. A/D nominale 5000mV V. alimentazione
eeprom VrefAD,[$13,$88] ' hi,lo 5000
'Frequency counter gate time adj
eeprom AdjFreq,[$42,$40] 'hi,lo 16960
'A/D Sample rate divider
eeprom Rates,[0,1,2,4,8,16,32,64,128,192]
'
eeprom [255,255,255] 'non usato
'
'
'*********************************
'* Name : Pr_SCOPE.pbp *
'* Author : Pratik Gohel *
'* Date : 24/05/2012 *
'* Version : 2.0 *
'*********************************
'
'
@ DEVICE PIC16F690,INTOSCIO,WDT_OFF,PWRT_ON,MCLR_OFF,PROTECT_OFF
@ DEVICE PIC16F690,BOD_OFF,CPD_OFF,IESO_OFF,FCMEN_OFF
'
DEFINE OSC 8 'internal oscillator
'
' DEFINE INTHAND Myint 'define interrupt handler
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 ' linee display
'
DEFINE LCD_DREG PortC
DEFINE LCD_DBIT 0 ' bit 0-3 bus x display
DEFINE LCD_RSREG PortC '
DEFINE LCD_RSBIT 4 ' R/S PortC.4
DEFINE LCD_EREG PortC '
DEFINE LCD_EBIT 7 ' En PortC.7
'
' NON cambiare l'ordine obbligatorio per la conversione bin>BCD
reg0 var byte $74 'lsd del valore binario da convertire
reg1 var byte $75 'vengono tutti portati ad FF
reg2 var byte $76
reg3 var byte $77 'msd
' risultato conversione 32bit bcd
Dig0 var byte $78 'BCD lsd
Dig1 var byte $79 'rappresentazione in BCD del contatore 32 bit
Dig2 var byte $7a
Dig3 var byte $7b
Dig4 var byte $7c 'BCD msd
'
Wsave var byte $7D SYSTEM 'uso interrupt sono visibili sempre
Ssave var byte $7E SYSTEM 'nei 3 banchi
Psave var byte $7F SYSTEM 'fino a 7F
'
'
TmpW var word
TmpW2 var word
NumW var word
Dum1 var word
'
Hicntr var word '32bit frequency counter
Locntr var word
'
'
Timbase var byte 'copia sampling rate A/D
Rate var byte 'counter sampling rate
'
Index var byte
Vmin var byte
Vpp var byte
Voffset var byte
Previous var byte
Row var byte
IndxBT var byte 'pointer tabella base tempi
'
Tmp1 var byte 'temporanee
Tmp2 var byte
Sbr1 var byte 'uso in sub
Sbr2 var byte
Sbr3 var byte
'
'
Flag_V var byte 'flag vari
'
Fl_Tmp var Flag_V.0 '
'l_1 var Flag_V.1 '
'l_2 var Flag_V.2 '
'l_3 var Flag_V.3 '
'l_4 var Flag_V.4 '
' var Flag_V.5 '
' var Flag_V.6 '
' var Flag_V.7 '
'
BufABcd var byte[09] 'bank0 'buffer Ascii conversione 32bit
Adbuf var byte[63] bank1 'deposito acquisizioni A/D & lcd user char.
Pixi var byte[39] bank2 'buffer bit map
'
'
'Vcc pin 1
'Gnd pin 20
' PortA.7 'na
' PortA.6 'na
TrigIN var PortA.5 'pin 2 input Timer1 counter
' var PortA.4 'pin 3 output
Push_But var PortA.3 'pin 4 input Button
' var PortA.2 'pin 17 output
LedB var PortA.1 'pin 18 output Led
' var PortA.0 'pin 19 analog input A/D
'
'Tx var PortB.7 'pin 10 output
' var PortB.6 'pin 11 output
'Rx var PortB.5 'pin 12 input
' var PortB.4 'pin 13 output
' PortB.3 'na
' PortB.2 'na
' PortB.1 'na
' PortB.0 'na
'
' var PortC.7 'pin 9 output display En
' var PortC.6 'pin 8 output
' var PortC.5 'pin 5 output
' var PortC.4 'pin 6 output display R/S
' var PortC.3 'pin 7 output display D7
' var PortC.2 'pin 14 output " D6
' var PortC.1 'pin 15 output " D5
' var PortC.0 'pin 16 output " D4
'
'
'---------- COSTANTI
'
Cr con 13
Lf con 10
Negativo con 128
LedOn con 1
LedOFF con 0
'
'posizioni memoria valori in eeprom
VrefAD con 2 'posizione eeprom v.alimentazione
AdjFreq con 4 'adj frequency measure
Rates con 16 'start sample rate table
'--------------------------------
'
'
Goto inizio ' Skip around interrupt handler
'
asm
;
;valore da convertire in reg0-4 risultato in dig4-0
;conversione a 32bit da binario a bcd
_cv_bi2bcd
movlw 32
movwf r0 ;bit counter
clrf _dig0 ;lsd
clrf _dig1
clrf _dig2
clrf _dig3
clrf _dig4 ;msd
b2bcdl
movlw _dig0 ;point at first bcd
movwf FSR
b2bcdil
movlw 33h
addwf INDF,f ;add to low and high nybbles
btfsc INDF,3
andlw 0f0h ;low result >7 . OK (take the 3 out)
btfsc INDF,7
andlw 0fh ;hi > 7 OK.
subwf INDF,f ;any results <=7, subtract back.
incf FSR,f ;Inc. pointer for next time
movlw Wsave
subwf FSR,w
btfss STATUS,C
goto b2bcdil ;If not done, do the inner loop again.
;
rlf _reg0,f
rlf _reg1,f
rlf _reg2,f
rlf _reg3,f ;Get another bit out of bin.
rlf _dig0,f ;Put bit into bcd.
rlf _dig1,f
rlf _dig2,f
rlf _dig3,f
rlf _dig4,f
decfsz r0,f ;Do more?
goto b2bcdl ;Yes.
return
;
endasm
'
Pk_Pk:
Index = 0
Sbr1 = 255 'min --> max
Sbr2 = 0 'max --> min
repeat
Sbr3 = Adbuf[Index] 'ricerca max,min
if Sbr3 > Sbr2 then Sbr2 = Sbr3 'attuale > max
if Sbr3 < Sbr1 then Sbr1 = Sbr3 'attuale < min
Index = Index + 1
until Index > 39
Vpp = Sbr2 - Sbr1 'calcola delta
Voffset = Sbr1 'save offset
'toglie offset ai valori acquisiti
Index = 0
repeat
Sbr3 = Adbuf[Index] - Sbr1 'scala valori acquisiti
Adbuf[Index] = Sbr3 'save again
Index = Index + 1
until Index > 39
return
'
'crea una immagine bitmap trova il punto da mettere sul grafico
' punto = Ad*8/256 adatto per scala 0-255
'ritorna valori tra 0 e 7
'N.B. le letture sono scalate dell'offset per avere massima risoluzione
' TmpW = Adbuf[Index] * 8 'riporta lettura in range x pixel
' tmpW = tmpW >> 8 'scala 0 255
' Tmpw = TmpW /(Vpp+1) 'scala dinamica
Make_Bit_Map:
'ricerca fattore scala x adattare valori
if Vpp < 32 then
Dum1 = 32
else
Dum1 = Vpp + 1
endif
Index = 0
repeat
Sbr1 = (Adbuf[Index] * 8) / Dum1
'deve avere un valore da 0 a 7 che indica il pixel da accende
lookup Sbr1,[1,2,4,8,16,32,64,128],Sbr2
'sostituisce il pixel con il suo peso binario
Pixi[Index] = Sbr2
Index = Index + 1
until Index > 39
'join punti sul grafico
Previous = Pixi[0] 'primo punto
Index = 1
repeat
Sbr1 = Pixi[Index] 'punto attuale
if Sbr1 = Previous then Succ_t 'orrizzontale skip test
if Sbr1 > Previous then 'linea in salita
'line up
Sbr2 = Sbr1 'copia x fill bit risultato
Sbr3 = Previous << 1 'inizia da un punto sopra al precedente
while Sbr3 < Sbr1 'fino a raggiungere l'attuale
Sbr2 = Sbr2 | Sbr3 'aggiunge nuovo pixel
Sbr3 = Sbr3 << 1 'sale
wend
else 'linea in discesa
'line down
Sbr2 = Sbr1 'copia x fill bit risultato
Sbr3 = Previous >> 1 'inizia da un punto sotto al preced.
while Sbr3 > Sbr1 'fino a raggiungere l'attuale
Sbr2 = Sbr2 | Sbr3 'aggiunge nuovo pixel
Sbr3 = Sbr3 >> 1 'scende
wend
endif
Pixi[Index] = Sbr2 'aggiorna immagine
Succ_t:
Previous = Sbr1 'punto attuale diventa precedente
Index = Index + 1
until Index > 39 'scan tutte locazioni
'
'converte rappresentazione grafica della forma d'onda
'in formato compatibile per display. scandisce in orrizzontale la bitmap
'a gruppi di 5 colonne e costruisce il pattern per custom user characters
'produce 64 bytes per gli 8 caratteri definibili dall'utente
Make_user_char:
Row = 0 ' pointer char da inviare a display
Index = 0 'pointer lettura
repeat
Sbr1 = 128 'inizia da pixel in alto
repeat
Tmp2 = 0 'dato da inviare
Sbr3 = Index 'usa una copia
Sbr2 = 16 'scansione orriz. dei bit
repeat
Tmp1 = Pixi[Sbr3]
Tmp1 = Tmp1 & Sbr1 'isola bit da d7 a d0
if Tmp1 > 0 then
Tmp2 = Tmp2 | Sbr2 'produce dato uscita
endif
Sbr2 = Sbr2 >> 1 '16,8,4,2,1
Sbr3 = Sbr3 + 1 'x 5 colonne
until Sbr2 = 0
'in Tmp2 pronto dato del primo carattere
AdBuf(row) = Tmp2
row = row + 1 'scende di una riga
Sbr1 = Sbr1 >> 1 '128,64,32,16,8,4,2,1
until Sbr1 = 0
Index = Index + 5 'al gruppo seguente
until Index > 39
return
'
'Quick explanation on how to implement user-defined characters:
'First you will need to make a pixel definition for the characters
'you want to use. Below is the pixel definition for an underlined
'0' (char code 0x30) based on a 5x7 dots character definition:
' | bits | byte
' row | 76543210 | value
' ------------------------
' 000 | xxx | 0x0E
' 001 | x x | 0x11
' 010 | x xx | 0x13
' 011 | x x x | 0x15
' 100 | xx x | 0x19
' 101 | x x | 0x11
' 110 | xxx | 0x0E
' 111 | xxxxx | 0x1F
'The byte values need to be loaded into CGRAM address 00cccrrr
'- ccc = user-defined character number (0..7)
'- rrr = row number of the user-defined character (0..7)
'
Update_CGRAM:
Row = 0 'buffer pointer
Sbr3 = 0 'user definable counter
repeat
Sbr2 = Sbr3 + 64 'comando scrittura cgram
lcdout $FE,Sbr2 'N^ user defined to command register
Sbr2 = 0
repeat
Sbr1 = AdBuf(Row)
lcdout Sbr1 'user defined
Row = Row + 1
Sbr2 = Sbr2 + 1
until Sbr2 > 7 'x 8 row
Sbr3 = Sbr3 + 8 'next character
until Sbr3 > 56
' lcdout 0,1,2,3,4,5,6,7
return
'
'
Cls:
lcdout $FE,1
return
'
'==========================================
' misura frequenza usando tmr1 come contatore e tmr0 come gate di misura
Freqy:
LedB = LedON
Hicntr = 0
' option_reg = %11000111 'prescaler 256
read AdjFreq,TmpW2.byte1 'recupera aggiustamento gate time
read (AdjFreq+1),TmpW2.byte0
'adjust for precise 1sec. gate time
'tmr0 tic = 2e6 / 32768 = 16,384mS 0,999424S + 576uS = 1S 61tic
' 2e6 / 65536 = 32,768mS 0,98304S + 16,96mS = 1S 30tic
'
'no gate control no prescale no sync external clock source
t1con = 000010 'stop tmr1
Sbr1 = 0 'gate counter
tmr0 = 0
tmr1l = 0
tmr1h = 0 'clr counter
intcon.2 = 0 'clr tmr0if
pir1.0 = 0 'clr tmr1if
tmr0 = 0 'start gate misura
t1con.0 = 1 'start tmr1
repeat
if pir1.0 = 1 then 'tmr1 overflow ?
pir1.0 = 0 'clr overflow
Hicntr = Hicntr + 1
endif
if intcon.2 = 1 then 'Tmr0 overflow ?
intcon.2 = 0 'clr overflow
Sbr1 = Sbr1 + 1 'gate counter
endif
until Sbr1 > 29 '32,768mS * 30 = 0,98304S.
pauseus TmpW2 '0,98304 + 16960uS = 1S
t1con.0 = 0 'stop tmr1
if pir1.0 = 1 then 'tmr1 overflow ?
Hicntr = Hicntr + 1
endif
Locntr.byte0 = tmr1l
Locntr.byte1 = tmr1h
LedB = LedOFF
return
'
'converte in mv la lettura dell' A/D
Make_volt:
read VrefAD,TmpW2.byte1 'recupera vref da eeprom
read (VrefAd+1),TmpW2.byte0
numW = TmpW * TmpW2 'tutto in mv.
TmpW2 = DIV32 256 '(A/D*5000)/256
Lcdout dec TmpW2 dig 3,".",dec TmpW2 dig 2
return
'
'
Zero_blank:
Index = 0
Sbr1 = dig0 'lsd
gosub Bcd_split
Sbr1 = Dig1
gosub Bcd_split
Sbr1 = dig2
gosub Bcd_split
Sbr1 = dig3
gosub Bcd_split
Sbr1 = dig4 'msd
gosub Bcd_split
Index = 9
Fl_Tmp = 0
while index > 0
if BufAbcd[Index] > 0 or Fl_Tmp = 1 then
BufAbcd[Index] = BufAbcd[Index] + "0" 'ascii 0
Fl_Tmp = 1
else
BufAbcd[Index] = " " 'space
endif
index = index - 1
wend
BufAbcd[Index] = BufAbcd[Index] + "0" 'lsd non blank
return
'
Bcd_split:
BufAbcd[Index] = Sbr1 & 001111
Index = Index + 1
Sbr1 = Sbr1 >> 4
BufAbcd[Index] = Sbr1
Index = Index + 1
return
'
'
'==========================================
Inizio:
'
TRISA = %11101001 'portA configura direzione
TRISB = 101111 'portB configura direzione 0=out 1=in
TRISC = 000000 'portC configura direzione
PortA = %11111111 '
PortB = %10111111 'preset uscite
PortC = 000000
Osccon = %01110001 'select 8MHz internal clock source
'disable pullup
WpuA = 000000
WpuB = 000000
'disable comparators
CM1CON0 = 0
CM2CON0 = 0
CM2CON1 = 0
'Init timer1
T1CON = 000000 'prescale=1,Internal source,Tmr1 stop
'Init eusart
' RCSTA = %10010000 'Enable serial port and continuous receive
' TXSTA = 100000 'Enable transmit BRGH = 0
' SPBRGH = 00 '
' SPBRG = 12 '38400 @8MHz
' BAUDCTL.3 = 1 ' Enable 16 bit baudrate generator
'Init A/D
Ansel = 000001 'portA digital An0
AnselH = 000000 'portC digital
' Adcon1 = %01010000 'clock conversione Fosc/16 = 2uS
Adcon0 = 000000 'left justified,Vref = Vdd,An0,ADC stop
'no pullup,rising edge, fosc/4, prescaler=1:256
option_reg = %11000111
intcon = 0 'no interrupt
' Tmp1 = RCREG 'scarica uart receiver
' Tmp1 = RCREG 'scarica uart receiver
pause 200 'wait for display
gosub cls
lcdout " Poor SCOPE v.2"
pause 1000
lcdout $FE,12 'cursor off
Adcon0 = 000001 'adc on
' Adcon1 = 010000 'clock conversione Fosc/8 = 1uS
Adcon1 = %01010000 'clock conversione Fosc/16 = 2uS
IndxBT = 0 'pointer Time Base divider Max speed
Timbase = 0 'Max speed
'--------------
P_scope:
pause 20
if Push_But = 0 then 'Button On
IndxBT = IndxBT + 1
if IndxBT > 09 then IndxBT = 0
Sbr1 = IndxBT + Rates 'add offset
read Sbr1,Timbase 'get sampling rate divider
gosub cls
lcdout " S. Rate = ",dec Timbase
pause 400 'display
while Push_But = 0 'rilascia tasto
pause 10
wend
endif
Index = 0 'A/D buffer pointer
Dum1 = 0 'timeout
'wait for level 0 or timeout
repeat
if Push_But = 0 then P_scope 'user quit
Dum1 = Dum1 + 1 'timeout counter
LedB = Tmr0.7 'flash led
until Trigin = 0 or Dum1 = 0 'attende livello 0 o timeout
Dum1 = 0 'timeout
'wait for rising edge trigger or timeout
repeat 'loop su livello 0
if Push_But = 0 then P_scope 'user quit
LedB = Tmr0.7 'flash led
Dum1 = Dum1 + 1 'timeout counter
until Trigin = 1 or Dum1 = 0 'triggered or timeout
'start acquisizione
ADCON0.1 = 1
repeat
Rate = 0 'sample rate divider
repeat
while ADCON0.1 = 1 'A/D ready ?
wend 'wait eoc
Rate = Rate + 1
ADCON0.1 = 1 'start new conversion
until Rate > Timbase
Adbuf[Index] = ADRESH 'get & save 8 bit
Index = Index + 1
until Index > 39 'fill buffer 40 samples
'acquisizione completata
gosub Pk_Pk 'rileva Vpp
gosub Make_Bit_Map 'crea immagine
gosub Make_user_char 'converte per display
gosub Update_CGRAM 'invia bitmap al display
gosub Freqy 'misura frequenza
'---
gosub Cls
lcdout "Vpp Vof"
lcdout $FE,132 'locate cursor
lcdout 0,1,2,3,4,5,6,7 'display bitmap
lcdout $FE,$C0 'locate cursor
TmpW = Vpp
gosub Make_volt 'convert to mV & display Vpp
lcdout $FE,$CD 'locate cursor
TmpW = Voffset
gosub Make_volt 'convert to mV & display Voffset
reg3=hicntr.byte1 'binary to string conversion
reg2=hicntr.byte0
reg1=locntr.byte1
reg0=locntr.byte0
call cv_bi2bcd 'binary 2 bcd
gosub Zero_Blank
lcdout $FE,$C4 'locate cursor
Index = 5 'display 6 digit
repeat
lcdout BufAbcd[Index] 'display frequency
index = Index - 1
until Index > negativo '5-4-3-2-1-0
' lcdout hex2 dig2,hex2 dig1,hex2 dig0
' lcdout hex4 hicntr,hex4 locntr
lcdout "Hz"
pause 100
goto P_scope
'
'
data @00 ,$FF 'non usato
data @01 ,$FF 'non usato
' Vref conv. A/D nominale 5000mV V. alimentazione
eeprom VrefAD,[$13,$88] ' hi,lo 5000
'Frequency counter gate time adj
eeprom AdjFreq,[$42,$40] 'hi,lo 16960
'A/D Sample rate divider
eeprom Rates,[0,1,2,4,8,16,32,64,128,192]
'
eeprom [255,255,255] 'non usato
'
: : :END: : :
HEX code :
: : :start: : :
:10000000B2012C290408A7008713071207128316D0
:10001000871307120712F030870583122708B218DA
:100020002F283A30A100983097203330A600442082
:100030001330A1008830972044206430962044205B
:10004000643096202230A600442028302E200C3028
:100050002E2006302E20B21427082F283214A60096
:10006000321C3D280712033C031C42284220073063
:10007000A100D0309720031408003214FE3C03196D
:1000800027290716A60E321C32108717F030870575
:1000900026080F3987048713A60E321844283230F9
:1000A000962003140800B31329080319B317053069
:1000B000A8002730A300103069200330A300E830E7
:1000C0006920A30164306920A3010A306920240853
:1000D0007028A2002508A1002408A000F020200814
:1000E000A000A8030319B313290803197A282802CA
:1000F000031808002008031DB313B31B0800303E8B
:10010000222903178D0083168C130C1483120C08FC
:100110002729A301A200FF30A207031CA307031C89
:1001200027290330A100E33097208B28A101F43E5A
:10013000A000A109FE30031CA028A00703189D28D9
:10014000A0076400A10F9D2800002018A7282018F0
:10015000A9280800013EA7000A30A200A301F02050
:10016000A70BAF28240808000310A00DA10DFF3E27
:100170000318B428200827290310A10CA00CFF3E67
:100180000318BC2820082729A101A301A2000230DE
:10019000CE28A101A301A2000130CE28A800230887
:1001A0002102031DD5282208200204300318013043
:1001B000031902302805031DFF3027290404031DFD
:1001C000FF302729A2002008A6002408A000260846
:1001D000A4002108A6002508A1002608A500F228F1
:1001E000A501A4011030A600210DA40DA50D220823
:1001F000A4022308031C230FA502031806292208C2
:10020000A40723080318230FA5070310A00DA10DB1
:10021000A60BF428200827291030A800A101A0016E
:10022000A70CA60C031C1A292208A00723080318F0
:10023000230FA107A10CA00CA50CA40CA80B10293E
:1002400024082729840031088A003008820083139B
:1002500003138312640008008A11902B2030A00041
:10026000F801F901FA01FB01FC0178308400333018
:1002700080078019F039801B0F398002840A7D3095
:100280000402031C3729F40DF50DF60DF70DF80DDA
:10029000F90DFA0DFB0DFC0DA00B35290800D2015C
:1002A000FF30D700D8015208A03E84000008D900D2
:1002B0006400590858028A11031860295908D800A7
:1002C0006400570859028A11031868295908D70091
:1002D000D20A6400283052028A11031C532957089D
:1002E0005802DF005708DE00D2015208A03E840009
:1002F0000008C90057084902D9005208A03E8400EE
:1003000059088000D20A6400283052028A11031C66
:1003100075290800640020305F028A1103189529AE
:100320002030C100C2018A119A2901305F07C10043
:10033000C201C20DD2015208A03E84000008C900CB
:100340004908A600A7010830A200A3018A010C21D8
:10035000C9002508CA004908A0004A08A1004108B0
:10036000A2004208A3008A01F020D7005708073CEA
:100370008A11031CCC298A11C021D8008A11CC29EA
:1003800001308A00570882070134023404340834EB
:1003900010342034403480345208203E84008317C7
:1003A000580880008313D20A6400283052028A1150
:1003B000031C9B29031720080313D4000130D2002B
:1003C0005208203E840083170008D700831364007E
:1003D000570854028A1103191E2A64005708540250
:1003E0008A110318062A5708D8000310540DD900A3
:1003F0006400570859028A110318042A5908D804BE
:100400000310D90D8A01F8298A11172A5708D80034
:100410000310540CD9006400590857028A110318BC
:10042000172A5908D8040310D90C8A010B2A52083C
:10043000203E840083175808800083135708D40097
:10044000D20A6400283052028A11031CE029D60126
:10045000D2018030D700DC015208D9001030D8001A
:100460005908203E840083170008DB0083135708D7
:10047000DB05640001305B028A11031C412A580825
:10048000DC040310D80CD90A64005808003C8A1117
:10049000031D302A5608A03E84005C088000D60A5E
:1004A0000310D70C64005708003C8A11031D2B2A47
:1004B0000530D2076400283052028A11031C292A11
:1004C0000800D601D90140305907D800FE308A0112
:1004D000032058088A010320D8015608A03E840052
:1004E0000008D70057088A010320D60AD80A6400FA
:1004F000083058028A11031C6D2A0830D90764009D
:10050000393059028A11031C632A0800FE308A011F
:10051000032001308A01032008008514C301C401AF
:1005200004308A018120D00005308A018120CF006B
:1005300002309000D70181018E018F010B110C1048
:100540008101101464008A110C1CAA2A0C10C30A21
:100550000319C40A64008A110B1DB02A0B11D70AB3
:1005600064001E3057028A11031CA22A5008A10001
:100570004F088A019720101064008A110C1CC32AAE
:10058000C30A0319C40A0E08C5000F08C600851067
:10059000080002308A018120D00003308A018120C6
:1005A000CF004D08A6004E08A7004F08A200500833
:1005B000A3008A010C21C7002508C8000130A30050
:1005C00000308A01E220CF002108D000A9014F08A5
:1005D000A0005008A10003308A01AA20C900CA0166
:1005E0004908A4004A08A5000230B000B1018A0100
:1005F00053202E308A010320A9014F08A000500883
:10060000A10002308A01AA20C900CA014908A40039
:100610004A08A5000230B000B1018A015320080049
:10062000D2017808D7008A1178237908D7008A1177
:1006300078237A08D7008A1178237B08D7008A119B
:1006400078237C08D7008A1178230930D200511012
:100650006400013052028A11031C682B5208383E94
:1006600084000008C9004908A00000308A01C920A0
:10067000C900003051180130A00001308A01C420A7
:10068000CB00490884004B088A01DE20CB00CC0057
:1006900064004B084C048A110319602B5208383E41
:1006A00084000008C90030304907C900CA01CA0DDA
:1006B0005208383E84004908800051148A11652B85
:1006C0005208383E840020308000D2038A01282B53
:1006D0005208383E84000008C90030304907C9007C
:1006E000CA01CA0D5208383E84004908800008003B
:1006F0000F305705C900CA015208383E8400490826
:100700008000D20A5708A000A10104308A01BF204E
:10071000D7005208383E840057088000D20A0800EB
:100720008316E93085002F30860087018312FF3061
:100730008500BF3086008701831671308F009501D8
:1007400083120317950199019A019B0103139001EC
:10075000031701309E009F0103139F018316C730CA
:10076000810083128B01C8308A0189208A01862288
:1007700020308A01032050308A0103206F308A0123
:1007800003206F308A01032072308A010320203059
:100790008A01032053308A01032043308A01032059
:1007A0004F308A01032050308A01032045308A01EE
:1007B000032020308A01032076308A0103202E3066
:1007C0008A01032032308A0103200330A300E8307D
:1007D0008A018A20FE308A0103200C308A0103201E
:1007E00001309F00831650309F008312D301DA013D
:1007F00014308A01892064008A118519482CD30A93
:1008000064000A3053028A11031C072CD3011030F4
:100810005307D70057088A018120DA008A0186220F
:1008200020308A01032053308A0103202E308A01B0
:10083000032020308A01032052308A0103206130D6
:100840008A01032074308A01032065308A01032065
:1008500020308A0103203D308A01032020308A01A4
:100860000320A9015A08A400A5010230B000B1017B
:100870008A0153200130A30090308A018A2064004D
:100880008A118519482C0A308A0189208A013F2C57
:10089000D201C101C20164008A11851DF82BC10A71
:1008A0000319C20A811B8514811F85100030851A27
:1008B0000130A00000308A01C420C9004108A00016
:1008C0004208A100A30100308A01C620CB004908DC
:1008D00084004B088A01DE20CB00CC0064004B086A
:1008E0004C048A1103194B2CC101C20164008A1106
:1008F000851DF82B811B8514811F8510C10A0319E2
:10090000C20A0030851A0130A00001308A01C420DB
:10091000C9004108A0004208A100A30100308A01DB
:10092000C620CB00490884004B088A01DE20CB009A
:10093000CC0064004B084C048A110319762C9F14D8
:10094000D50164008A119F1CA72C8A01A12CD50A0D
:100950009F14640055085A028A110318A12C5208EA
:10096000A03E84001E088000D20A64002830520293
:100970008A11031CA02C8A014F218A018A218A0135
:1009800027228A0161228A018D228A01862256301D
:100990008A01032070308A01032070308A0103200D
:1009A00020308A01032020308A01032020308A0170
:1009B000032020308A01032020308A0103202030C8
:1009C0008A01032020308A01032020308A0103207D
:1009D00020308A01032020308A01032056308A010A
:1009E00003206F308A01032066308A010320FE3025
:1009F0008A01032084308A01032000308A01032009
:100A000001308A01032002308A01032003308A0169
:100A1000032004308A01032005308A0103200630B8
:100A20008A01032007308A010320FE308A01032057
:100A3000C0308A0103205F08CD00CE018A01C9229F
:100A4000FE308A010320CD308A0103205E08CD00EC
:100A5000CE018A01C9224408F7004308F60046087F
:100A6000F5004508F4008A012E218A011023FE308A
:100A70008A010320C4308A0103200530D2005208C5
:100A8000383E84000008C90049088A010320D203C7
:100A90006400813052028A11031C3F2D48308A01C4
:100AA00003207A308A01032064308A0189208A0178
:020AB000F82B21
:02400E00C430BC
:0C420000FF00FF00130088004200400097
:10422000000001000200040008001000200040000F
:0A4230008000C000FF00FF00FF0047
:00000001FF
:10001000871307120712F030870583122708B218DA
:100020002F283A30A100983097203330A600442082
:100030001330A1008830972044206430962044205B
:10004000643096202230A600442028302E200C3028
:100050002E2006302E20B21427082F283214A60096
:10006000321C3D280712033C031C42284220073063
:10007000A100D0309720031408003214FE3C03196D
:1000800027290716A60E321C32108717F030870575
:1000900026080F3987048713A60E321844283230F9
:1000A000962003140800B31329080319B317053069
:1000B000A8002730A300103069200330A300E830E7
:1000C0006920A30164306920A3010A306920240853
:1000D0007028A2002508A1002408A000F020200814
:1000E000A000A8030319B313290803197A282802CA
:1000F000031808002008031DB313B31B0800303E8B
:10010000222903178D0083168C130C1483120C08FC
:100110002729A301A200FF30A207031CA307031C89
:1001200027290330A100E33097208B28A101F43E5A
:10013000A000A109FE30031CA028A00703189D28D9
:10014000A0076400A10F9D2800002018A7282018F0
:10015000A9280800013EA7000A30A200A301F02050
:10016000A70BAF28240808000310A00DA10DFF3E27
:100170000318B428200827290310A10CA00CFF3E67
:100180000318BC2820082729A101A301A2000230DE
:10019000CE28A101A301A2000130CE28A800230887
:1001A0002102031DD5282208200204300318013043
:1001B000031902302805031DFF3027290404031DFD
:1001C000FF302729A2002008A6002408A000260846
:1001D000A4002108A6002508A1002608A500F228F1
:1001E000A501A4011030A600210DA40DA50D220823
:1001F000A4022308031C230FA502031806292208C2
:10020000A40723080318230FA5070310A00DA10DB1
:10021000A60BF428200827291030A800A101A0016E
:10022000A70CA60C031C1A292208A00723080318F0
:10023000230FA107A10CA00CA50CA40CA80B10293E
:1002400024082729840031088A003008820083139B
:1002500003138312640008008A11902B2030A00041
:10026000F801F901FA01FB01FC0178308400333018
:1002700080078019F039801B0F398002840A7D3095
:100280000402031C3729F40DF50DF60DF70DF80DDA
:10029000F90DFA0DFB0DFC0DA00B35290800D2015C
:1002A000FF30D700D8015208A03E84000008D900D2
:1002B0006400590858028A11031860295908D800A7
:1002C0006400570859028A11031868295908D70091
:1002D000D20A6400283052028A11031C532957089D
:1002E0005802DF005708DE00D2015208A03E840009
:1002F0000008C90057084902D9005208A03E8400EE
:1003000059088000D20A6400283052028A11031C66
:1003100075290800640020305F028A1103189529AE
:100320002030C100C2018A119A2901305F07C10043
:10033000C201C20DD2015208A03E84000008C900CB
:100340004908A600A7010830A200A3018A010C21D8
:10035000C9002508CA004908A0004A08A1004108B0
:10036000A2004208A3008A01F020D7005708073CEA
:100370008A11031CCC298A11C021D8008A11CC29EA
:1003800001308A00570882070134023404340834EB
:1003900010342034403480345208203E84008317C7
:1003A000580880008313D20A6400283052028A1150
:1003B000031C9B29031720080313D4000130D2002B
:1003C0005208203E840083170008D700831364007E
:1003D000570854028A1103191E2A64005708540250
:1003E0008A110318062A5708D8000310540DD900A3
:1003F0006400570859028A110318042A5908D804BE
:100400000310D90D8A01F8298A11172A5708D80034
:100410000310540CD9006400590857028A110318BC
:10042000172A5908D8040310D90C8A010B2A52083C
:10043000203E840083175808800083135708D40097
:10044000D20A6400283052028A11031CE029D60126
:10045000D2018030D700DC015208D9001030D8001A
:100460005908203E840083170008DB0083135708D7
:10047000DB05640001305B028A11031C412A580825
:10048000DC040310D80CD90A64005808003C8A1117
:10049000031D302A5608A03E84005C088000D60A5E
:1004A0000310D70C64005708003C8A11031D2B2A47
:1004B0000530D2076400283052028A11031C292A11
:1004C0000800D601D90140305907D800FE308A0112
:1004D000032058088A010320D8015608A03E840052
:1004E0000008D70057088A010320D60AD80A6400FA
:1004F000083058028A11031C6D2A0830D90764009D
:10050000393059028A11031C632A0800FE308A011F
:10051000032001308A01032008008514C301C401AF
:1005200004308A018120D00005308A018120CF006B
:1005300002309000D70181018E018F010B110C1048
:100540008101101464008A110C1CAA2A0C10C30A21
:100550000319C40A64008A110B1DB02A0B11D70AB3
:1005600064001E3057028A11031CA22A5008A10001
:100570004F088A019720101064008A110C1CC32AAE
:10058000C30A0319C40A0E08C5000F08C600851067
:10059000080002308A018120D00003308A018120C6
:1005A000CF004D08A6004E08A7004F08A200500833
:1005B000A3008A010C21C7002508C8000130A30050
:1005C00000308A01E220CF002108D000A9014F08A5
:1005D000A0005008A10003308A01AA20C900CA0166
:1005E0004908A4004A08A5000230B000B1018A0100
:1005F00053202E308A010320A9014F08A000500883
:10060000A10002308A01AA20C900CA014908A40039
:100610004A08A5000230B000B1018A015320080049
:10062000D2017808D7008A1178237908D7008A1177
:1006300078237A08D7008A1178237B08D7008A119B
:1006400078237C08D7008A1178230930D200511012
:100650006400013052028A11031C682B5208383E94
:1006600084000008C9004908A00000308A01C920A0
:10067000C900003051180130A00001308A01C420A7
:10068000CB00490884004B088A01DE20CB00CC0057
:1006900064004B084C048A110319602B5208383E41
:1006A00084000008C90030304907C900CA01CA0DDA
:1006B0005208383E84004908800051148A11652B85
:1006C0005208383E840020308000D2038A01282B53
:1006D0005208383E84000008C90030304907C9007C
:1006E000CA01CA0D5208383E84004908800008003B
:1006F0000F305705C900CA015208383E8400490826
:100700008000D20A5708A000A10104308A01BF204E
:10071000D7005208383E840057088000D20A0800EB
:100720008316E93085002F30860087018312FF3061
:100730008500BF3086008701831671308F009501D8
:1007400083120317950199019A019B0103139001EC
:10075000031701309E009F0103139F018316C730CA
:10076000810083128B01C8308A0189208A01862288
:1007700020308A01032050308A0103206F308A0123
:1007800003206F308A01032072308A010320203059
:100790008A01032053308A01032043308A01032059
:1007A0004F308A01032050308A01032045308A01EE
:1007B000032020308A01032076308A0103202E3066
:1007C0008A01032032308A0103200330A300E8307D
:1007D0008A018A20FE308A0103200C308A0103201E
:1007E00001309F00831650309F008312D301DA013D
:1007F00014308A01892064008A118519482CD30A93
:1008000064000A3053028A11031C072CD3011030F4
:100810005307D70057088A018120DA008A0186220F
:1008200020308A01032053308A0103202E308A01B0
:10083000032020308A01032052308A0103206130D6
:100840008A01032074308A01032065308A01032065
:1008500020308A0103203D308A01032020308A01A4
:100860000320A9015A08A400A5010230B000B1017B
:100870008A0153200130A30090308A018A2064004D
:100880008A118519482C0A308A0189208A013F2C57
:10089000D201C101C20164008A11851DF82BC10A71
:1008A0000319C20A811B8514811F85100030851A27
:1008B0000130A00000308A01C420C9004108A00016
:1008C0004208A100A30100308A01C620CB004908DC
:1008D00084004B088A01DE20CB00CC0064004B086A
:1008E0004C048A1103194B2CC101C20164008A1106
:1008F000851DF82B811B8514811F8510C10A0319E2
:10090000C20A0030851A0130A00001308A01C420DB
:10091000C9004108A0004208A100A30100308A01DB
:10092000C620CB00490884004B088A01DE20CB009A
:10093000CC0064004B084C048A110319762C9F14D8
:10094000D50164008A119F1CA72C8A01A12CD50A0D
:100950009F14640055085A028A110318A12C5208EA
:10096000A03E84001E088000D20A64002830520293
:100970008A11031CA02C8A014F218A018A218A0135
:1009800027228A0161228A018D228A01862256301D
:100990008A01032070308A01032070308A0103200D
:1009A00020308A01032020308A01032020308A0170
:1009B000032020308A01032020308A0103202030C8
:1009C0008A01032020308A01032020308A0103207D
:1009D00020308A01032020308A01032056308A010A
:1009E00003206F308A01032066308A010320FE3025
:1009F0008A01032084308A01032000308A01032009
:100A000001308A01032002308A01032003308A0169
:100A1000032004308A01032005308A0103200630B8
:100A20008A01032007308A010320FE308A01032057
:100A3000C0308A0103205F08CD00CE018A01C9229F
:100A4000FE308A010320CD308A0103205E08CD00EC
:100A5000CE018A01C9224408F7004308F60046087F
:100A6000F5004508F4008A012E218A011023FE308A
:100A70008A010320C4308A0103200530D2005208C5
:100A8000383E84000008C90049088A010320D203C7
:100A90006400813052028A11031C3F2D48308A01C4
:100AA00003207A308A01032064308A0189208A0178
:020AB000F82B21
:02400E00C430BC
:0C420000FF00FF00130088004200400097
:10422000000001000200040008001000200040000F
:0A4230008000C000FF00FF00FF0047
:00000001FF
No comments:
Post a Comment