📄 main.lis
字号:
00B8 PGA_1_G1_33: equ B8h
00C8 PGA_1_G1_23: equ C8h
00D8 PGA_1_G1_14: equ D8h
00E8 PGA_1_G1_06: equ E8h
00F8 PGA_1_G1_00: equ F8h
00E0 PGA_1_G0_93: equ E0h
00D0 PGA_1_G0_87: equ D0h
00C0 PGA_1_G0_81: equ C0h
00B0 PGA_1_G0_75: equ B0h
00A0 PGA_1_G0_68: equ A0h
0090 PGA_1_G0_62: equ 90h
0080 PGA_1_G0_56: equ 80h
0070 PGA_1_G0_50: equ 70h
0060 PGA_1_G0_43: equ 60h
0050 PGA_1_G0_37: equ 50h
0040 PGA_1_G0_31: equ 40h
0030 PGA_1_G0_25: equ 30h
0020 PGA_1_G0_18: equ 20h
0010 PGA_1_G0_12: equ 10h
0000 PGA_1_G0_06: equ 00h
0000
0075 PGA_1_GAIN_CR0: equ 75h
0076 PGA_1_GAIN_CR1: equ 76h
0077 PGA_1_GAIN_CR2: equ 77h
0000
0000
export _main
export GPIO_ISR
export TIMER8_1_ISR
export COMP_ISR
00DA RATE_2400_HI: EQU 218 ;Upper margin for 2400 bps data rate
00BC RATE_2400_LO: EQU 188 ;Lower margin for 2400 bps data rate
00B5 RATE_1200_HI: EQU 181 ;Upper margin for 1200 bps data rate
0079 RATE_1200_LO: EQU 121 ;Lower margin for 1200 bps data rate
0047 RATE_512_HI: EQU 71 ;Upper margin for 512 bps data rate
0001 RATE_512_LO: EQU 1 ;Lower margin for 512 bps data rate
00FF RATE_CHECK: EQU 255 ;Number of time to check data rate
0005 SAMPLING_RATE_2400: EQU 5 ;6-1, Timer period for 2400 bps sampling
000B SAMPLING_RATE_1200: EQU 11 ;12-1, Timer period for 1200 bps sampling
001A SAMPLING_RATE_512: EQU 26 ;27-1, Timer period for 512 bps sampling
0009 SAMPLE_NUM: EQU 9 ;Number of time to sample comparator output in one period
0007 MSB_NUM: EQU 7 ;Number of bit shifts in one byte
0044 BYTE_NUM: EQU 68 ;Number of bytes in one batch
0000
area bss(RAM) ;inform assembler that variables follow
0000 ready: blk 1 ;flag that GPIO interrupt is occured
0001 start: blk 1 ;flag to disable GPIO and enable COMP interrupts
0002 rate: blk 1 ;period of received data
0003 bit_ptr: blk 1 ;pointer to bit position in the byte
0004 hi_cnt: blk 1 ;counter of positive values
0005 lo_cnt: blk 1 ;counter of negative values
0006 data: blk 1 ;byte of combined received bits
0007 byte_cnt: blk 1 ;counter of received bytes
0008 sample_cnt: blk 1 ;counter of comparator sampling times
0009 sampling_rate: blk 1 ;timer period for comparator sampling
000A saved_bit: blk 1 ;previos result of rate search
000B inverse: blk 1 ;flag that received data is inverted
000C batch_cnt: blk 1 ;counter of batches have been received
000D
area text(ROM,REL) ;inform assembler that program code follws
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Name : _main
; Desc. : Main function for POCSAG Decoder
; Input : None
; Output : None
; Operation : Called from boot.asm after initialization. It will find POCSAG data
; packet, synchronize to it, and copy into UART
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
0000 _main:
0000 ;UART Init: 9600, 8-N-1
0000 5000 mov A,0
0002 9000 call TX8_1_Start
0004 9000 call Counter8_2_Start
0006
0006 ;Comparator Init:
0006 5003 mov A, CMPPRG_1_HIGHPOWER
0008 9000 call CMPPRG_1_SetPower
000A 5040 mov A, CMPPRG_1_REF0_312
000C 9000 call CMPPRG_1_SetRef
000E
000E ;PGA Init
000E 5003 mov A, PGA_1_HIGHPOWER
0010 9000 call PGA_1_Start
0012 5078 mov A, PGA_1_G2_00
0014 9000 call PGA_1_SetGain
0016
0016
0016 620080 mov reg[PRT0DR], 80h ;POWER LED ON
0019
0019 ;Power-ON LEDs test
0019 620807 mov reg[PRT2DR], 07h ;rate LEDs ON
001C 62E338 mov reg[RES_WDT], 38h ; reset the sleep timer
001F 43E040 or reg[INT_MSK0],40h ;enable sleep interrupt
0022 7101 or F, FlagGlobalIE
0024
0024 lp_sleep: ;Sleep timer period is 1 sec.,
0024 5DE0 mov A, reg[INT_MSK0] ;ones interrupt is ocurred, it will be disabled
0026 BFFD jnz lp_sleep ;so wait untill INT_MSK0 is zero!
0028 70FE and F, ~FlagGlobalIE
002A 620800 mov REG[PRT2DR], 00h ;rate LEDs OFF
002D
002D ;Varibles Init
002D 550B00 mov [inverse], 0 ;reset inverse flag
0030 550C00 mov [batch_cnt], 0 ;reset batch counter
0033 550800 mov [sample_cnt], 0 ;reset sampling counter
0036 550300 mov [bit_ptr], 0 ;reset bit pointer
0039 550000 mov [ready], 0 ;reset ready flag
003C 550100 mov [start], 0 ;reset start flag
003F
003F ;Timer Init
003F 50FF mov A, FFh ;timer period 2ms
0041 9000 call Timer8_1_WritePeriod ;write timer period
0043 40 nop
0044 9000 call Timer8_1_Start ;start timer
0046 9000 call Timer8_1_EnableInt ;enable timer INT
0048 43E020 or reg[INT_MSK0], INT_MSK0_GPIO
004B
004B l_start:
004B
004B 7101 or F, FlagGlobalIE
004D
004D 40 l_wait: nop ;wait untill ready flag is set
004E 5100 mov A, [ready]
0050 AFFC jz l_wait
0052
0052 70FE and F, ~FlagGlobalIE
0054 550000 mov [ready], 0 ;reset ready flag
0057 5108 mov A, [sample_cnt] ;check for timer overflow
0059 A009 jz l_search ;
005B 550800 mov [sample_cnt], 0 ;reset sample_cnt
005E 550300 mov [bit_ptr], 0 ;reset bit_ptr
0061 8FE9 jmp l_start ;start over
0063
0063 l_search:
0063 ;if timer is not overflows, check data rate
0063 5700 mov X, 0
0065 5102 mov A, [rate] ;load rate into Acc.
0067 39DA cmp A, RATE_2400_HI
0069 D028 jnc brn_search_end ;finish search if rate > 2400 hi margin
006B 39BC cmp A, RATE_2400_LO
006D C008 jc brn_search_1200 ;continue if rate < 2400 lo margin
006F 5701 mov X, 01h ;it is in 2400 range, set bit 0
0071 550905 mov [sampling_rate], SAMPLING_RATE_2400 ;set sampling rate
0074 801D jmp brn_search_end ;finish search
0076
0076 brn_search_1200:
0076 39B5 cmp A, RATE_1200_HI
0078 D019 jnc brn_search_end ;finish search if rate > 1200 hi margin
007A 3979 cmp A, RATE_1200_LO
007C C008 jc brn_search_512 ;;continue if rate < 1200 lo margin
007E 5702 mov X, 02h ;it is in 1200 range, set bit 1
0080 55090B mov [sampling_rate], SAMPLING_RATE_1200 ;set sampling rate
0083 800E jmp brn_search_end ;finish search
0085
0085 brn_search_512:
0085 3947 cmp A, RATE_512_HI
0087 D00A jnc brn_search_end ;finish search if rate > 512 hi margin
0089 3901 cmp A, RATE_512_LO
008B C006 jc brn_search_end ;finish search if rate < 512 lo margin
008D 5704 mov X, 04h ;it is in 512 range, set bit 3
008F 55091A mov [sampling_rate], SAMPLING_RATE_512 ;set sampling rate
0092
0092 brn_search_end:
0092 5B mov A, X
0093 B006 jnz l_preamb ;if rate does not match
0095 550300 mov [bit_ptr], 0 ;reset bit_ptr
0098 8FB2 jmp l_start ;start over
009A
009A l_preamb:
009A ;if rate does match
009A 5103 mov A, [bit_ptr]
009C B007 jnz brn_ptr_1 ;if it is the first bit
009E 7603 inc [bit_ptr] ;increment bit_ptr
00A0 5A0A mov [saved_bit], X ;save search result as saved_bit
00A2 8FA8 jmp l_start ;start for the next bit
00A4
00A4 brn_ptr_1:
00A4 ;if it is not first bit
00A4 5B mov A, X
00A5 220A and A, [saved_bit] ;if search result does not
00A7 B006 jnz brn_ptr_2 ;match previos results
00A9 550300 mov [bit_ptr], 0 ;reset bit_ptr
00AC 8F9E jmp l_start ;start over
00AE
00AE brn_ptr_2:
00AE ;if search result matches previos one
00AE 7603 inc [bit_ptr] ;increment bit_ptr
00B0 3C03FF cmp [bit_ptr], RATE_CHECK ;if counter does not reach RATE_CHECK
00B3 CF97 jc l_start ;start for the next bit
00B5
00B5 ;if search result shows valid data rate and it consistent
00B5 ;for RATE_CHECK times, assume that receiving data is POCSAG preambule.
00B5 ;Init varibles, set start flag and set timer period to recived data rate
00B5 6008 mov REG[PRT2DR], A ;turn 512, 1200, or 2400 rate LED
00B7 5000 mov A, 0
00B9 5303 mov [bit_ptr], A
00BB 5304 mov [hi_cnt], A
00BD 5305 mov [lo_cnt], A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -