⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 A very good POCSAG Paging Protocol Decoder.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -