gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; This program uses the PIC16F84 to: 00002 ; - receive one specific infrared RC5 signal and store it 00003 ; - receive RC5 infrared signals and compare them to the stored one 00004 ; - output a signal to the computer's serial port's RING pin if they match 00005 ; - receive from the computer a time delay (expressed in time units of 2.097152 seconds) 00006 ; - count down from this delay to 0, and output a signal to the computer's serial port's 00007 ; RING pin 00008 ; 00009 ; Used pins on the PIC: 00010 ; RA0: "data ACK" signal (to computer) 00011 ; RA1: RING (to computer) 00012 ; RA2: Signal that RC5 message has been received (to a LED) 00013 ; RA3: Signal that delay countdown is in process (to a LED) 00014 ; RB1: "data ready" signal (from computer) 00015 ; RB2: "data" ligne (from computer) 00016 ; RB3: read/write flag (low: read, high: write) for RC5 00017 ; RB4: infrared signal 00018 ; 00019 ; Setting RB3 to high will store the received RC5 signal to EEPROM 00020 ; Setting RB3 to low will compare the received RC5 signal with the version in EEPROM 00021 ; and send a RING to the computer if they match 00022 ; 00023 ; Reading data from the computer (for setting the delay) is done as follow: 00024 ; - wait for interrupt (or poll in MainLoop?) (RB1) 00025 ; - read the data (RB2) 00026 ; - send ACK (RA0) 00027 ; - wait for data ready (RB1) to go down 00028 ; - set ACK down (RA0) 00029 00030 list p=pic16f84a 00031 00001 LIST 00002 ; P16F84A.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00134 LIST 00032 include "p16f84a.inc" 00033 002007 3FF1 00034 __FUSES _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF 00035 0000000C 00036 RAMbase equ d'12' 00037 00038 cblock RAMbase 00039 flags 00040 W_Temp 00041 S_Temp 00042 Prev_TMR0 00043 RC5_Timer_Ovfl 00044 Delay 00045 RC5_Bit_Count 00046 RTC_H 00047 RTC_L 00048 RTC_64 00049 RC5_3 00050 RC5_2 00051 RC5_1 gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00052 RC5_0 00053 Ring_Counter_H 00054 Ring_Counter_L 00055 RTC_Temp_H 00056 RTC_Temp_L 00057 RTC_Bit_Counter 00058 endc 00059 00060 00061 00062 ; ***** Definitions ***** 00063 #define TH1 d'10' ; threshold below which we count 1 bit in RC5 00064 ; TH1 = 10 * 128 us 00065 #define TH2 d'07' ; threshold below which we count 2 bits in RC5 00066 ; TH2 = 17 * 128 us 00067 ; TH1 is a value between the length of 1 bit (889 us) 00068 ; and the length of 2 bits (1778 us) in mancheser coding 00069 ; TH2 is well above the length of 2 bits. 00070 #define Long_Delay 0x02 ; value after which we consider the delay to be long 00071 #define Prev_RC5_Val flags,0 ; Last RC5 bit received 00072 #define Reading_RC5 flags,1 ; RC5 data reading in process 00073 #define RC5_Enable flags,2 ; unused 00074 #define RC5_Data_Ready flags,3 ; RC5 data ready (e.g. for signaling the computer) 00075 #define Reading_Data flags,4 ; In the process of reading RTC data 00076 #define RTC_Enable flags,5 ; Set when the RTC is running 00077 #define RTC_Ring_Time flags,6 ; If set, tells the Main_Loop to it's time to Ring 00078 #define SEL_BANK_0 bcf STATUS,RP0 ; Select Bank 0 00079 #define SEL_BANK_1 bsf STATUS,RP0 ; Select Bank 1 00080 #define Data_ACK PORTA,0 ; Data acknowledged 00081 #define Ring_Output PORTA,1 ; Ring signal output (to the computer's serial port RING pin) 00082 #define RC5_LED PORTA,2 ; LED flashing when RC5 operation is completed 00083 #define Timer_LED PORTA,3 ; LED blinking when timer goes 00084 #define Data_Ready PORTB,1 ; Data from computer is ready for reading 00085 #define Data PORTB,2 ; Data line (1 bit) 00086 #define RC5_RW_Input PORTB,3 ; RC5 signal: memorize (set) or compare (clear) to existing? 00087 #define IR_Input PORTB,4 ; Infrared module input 00088 #define CARRY STATUS,C 00089 #define ZERO STATUS,Z 00090 #define EEPROM_RC5_0 0x00 ; EEPROM registers for storing RC5 code 00091 #define EEPROM_RC5_1 0x01 00092 #define EEPROM_RC5_2 0x02 00093 #define EEPROM_RC5_3 0x03 00094 00095 00096 ; ***** RESET ***** 00097 0000 00098 org 0000h 0000 00099 Reset_Vector 0000 28A3 00100 goto Main_Start 0001 0000 00101 nop 0002 0000 00102 nop 0003 0000 00103 nop 00104 ; 00105 ; ***** Interrupt Vector ***** gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00106 ; 0004 00107 Interrupt_Vector 00108 if (Interrupt_Vector != 0x004 ) 00109 ERROR "Warning Interrupts must start at address 0x004" 00110 endif 00111 0004 008D 00112 Push movwf W_Temp ; Save W 0005 0E03 00113 swapf STATUS,W 0006 008E 00114 movwf S_Temp ; Save STATUS 0007 1283 00115 SEL_BANK_0 0008 00116 Disable_Int 0008 138B 00117 bcf INTCON,GIE ; Disable all Interrupts 0009 1B8B 00118 btfsc INTCON,GIE ; Are Interrupts disabled ? 000A 2808 00119 goto Disable_Int ; NO, try again 00120 000B 190B 00121 btfsc INTCON,T0IF ; Skip TMR0 overflow interrupt? 000C 2848 00122 goto TMR0_Int ; NO, goto TMR0 00123 000D 180B 00124 btfsc INTCON,RBIF ; Skip PORTB4's Interrupt? 000E 2814 00125 goto RB4_Int ; NO, goto RB0 00126 000F 0E0E 00127 Pop swapf S_Temp,W 0010 0083 00128 movwf STATUS ; Return STATUS 0011 0E8D 00129 swapf W_Temp,F 0012 0E0D 00130 swapf W_Temp,W ; Return W 0013 0009 00131 retfie ; Return setting GIE 00132 ; 00133 ;***** Manage RB4 Int ***** 00134 ; 0014 00135 RB4_Int 0014 128B 00136 bcf INTCON,T0IE ; Disable timer overflow when we handle this one 0015 100C 00137 bcf Prev_RC5_Val ; Set the previous RC5 value to 0 0016 1E06 00138 btfss IR_Input ; Current Input level is 1? 0017 140C 00139 bsf Prev_RC5_Val ; NO: Previous RC5 value was 1 0018 100B 00140 bcf INTCON,RBIF ; Clear interrupt flag 00141 ; Now we have the value. 00142 ; Let's see how many bits we got (1 or 2) 00143 0019 0801 00144 movf TMR0,W 001A 0091 00145 movwf Delay ; Delay <- TMR0 001B 080F 00146 movf Prev_TMR0,W 001C 0291 00147 subwf Delay,F ; Delay <- TMR0 - Prev_TMR0 00148 ; Delay = delay since last interruption 001D 1C03 00149 btfss CARRY ; Is the result >= 0? (CARRY == 1) 001E 2820 00150 goto RC5_Decrement_Timer_Ovfl ; NO: TMR0 overflew at least once, decrement RC5_Timer_Ovfl 001F 2823 00151 goto RC5_Is_Timer_Ovfl_Null ; YES: Check if RC5_Timer_Ovfl == 0 0020 00152 RC5_Decrement_Timer_Ovfl 0020 0890 00153 movf RC5_Timer_Ovfl,F 0021 1D03 00154 btfss ZERO ; Is it Null? (Z == 1) 0022 0390 00155 decf RC5_Timer_Ovfl,F ; NO: then we can decrement RC5_Timer_Ovfl safely 00156 ; YES: We probably missed a TMR0 overflow due to disabled 00157 ; timer interrupts while processing RC5 signals. 00158 ; As it doesn't make sense to decrement the overflow counter 00159 ; if it is null, we don't do it. gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0023 00160 RC5_Is_Timer_Ovfl_Null 0023 0890 00161 movf RC5_Timer_Ovfl,F ; Check if RC5_Timer_Ovfl == 0 after the adjustments 0024 1D03 00162 btfss ZERO ; Is it? (Z == 1) 0025 2833 00163 goto RC5_Long_Delay ; NO: there was a long delay, more than 1 overflow) 0026 300A 00164 movlw TH1 ; YES: let's check now how many bits we got 0027 0291 00165 subwf Delay,F ; Let's check if delay > TH1 (delay - TH1 > 0) 00166 ; Delay = delay - TH1 0028 1C03 00167 btfss CARRY ; Is it? (CARRY == 1) 0029 282F 00168 goto RC5_1_bit ; NO: We got 1 bit 002A 3007 00169 movlw TH2 ; YES: Let's then check if we got 2 bits 002B 0291 00170 subwf Delay,F ; Check if delay > TH2 (delay - TH2 > 0) 00171 ; Delay = delay - TH1 - TH2 002C 1C03 00172 btfss CARRY ; Is it? (CARRY == 1) 002D 2831 00173 goto RC5_2_bits ; NO: We got 2 bits 002E 2833 00174 goto RC5_Long_Delay ; YES: Long delay 00175 002F 00176 RC5_1_bit 002F 207C 00177 call Add_1_bit_to_RC5 0030 283A 00178 goto RC5_Check_Bit_Count 00179 0031 00180 RC5_2_bits 0031 2083 00181 call Add_2_bits_to_RC5 0032 283A 00182 goto RC5_Check_Bit_Count 00183 0033 00184 RC5_Long_Delay ; A long delay occured 0033 1C8C 00185 btfss Reading_RC5 ; RC5 data reading bit set ? 0034 2837 00186 goto RC5_First_bit ; NO: beginning of RC5 frame 00187 ; YES: end of RC5 frame 0035 207C 00188 call Add_1_bit_to_RC5 ; Add last bit 0036 2096 00189 call RC5_LED_Off 00190 ;call Do_Something_With_The_Data_Before_It_Gets_Erased ? 0037 00191 RC5_First_bit 0037 2069 00192 call Clear_RC5 ; Clear all RC5-related registers (incl. flags) 0038 148C 00193 bsf Reading_RC5 ; start reading now 0039 2094 00194 call RC5_LED_On 00195 003A 00196 RC5_Check_Bit_Count 003A 301C 00197 movlw d'28' 003B 0212 00198 subwf RC5_Bit_Count,W ; How many bits have we got? 28? 003C 1D03 00199 btfss ZERO ; 003D 2842 00200 goto End_RB4_Int ; NO: nothing to do 003E 108C 00201 bcf Reading_RC5 ; YES: stop reading now 003F 118B 00202 bcf INTCON,RBIE ; disable RB4 (RC5-related) interrupts 0040 2096 00203 call RC5_LED_Off 0041 158C 00204 bsf RC5_Data_Ready 00205 0042 00206 End_RB4_Int 0042 0190 00207 clrf RC5_Timer_Ovfl ; Reset TMR0 overflow counter for RC5 timing 0043 0801 00208 movf TMR0,W ; Save the current timer value 0044 008F 00209 movwf Prev_TMR0 0045 110B 00210 bcf INTCON,T0IF ; clear potential timer overflow interrupt occuring during this handler 0046 168B 00211 bsf INTCON,T0IE ; Re-enable timer overflow interrupt 0047 280F 00212 goto Pop 00213 gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00214 ; 00215 ;***** Manage TMR0 int ***** 00216 ; 0048 00217 TMR0_Int 0048 110B 00218 bcf INTCON,T0IF ; Clear TMR0 interrupt flag 00219 00220 ; Counting TMR0 overflows for RC5 timing 00221 ; not very accurate, since if we are in the RC5 interrupt handler, 00222 ; we ignore this interrupt :( 0049 1C8C 00223 btfss Reading_RC5 ; Are we reading an RC5 frame? 004A 2850 00224 goto TMR0_Inc_RC5_Timer_Ovfl ; NO: don't detect an "end of frame" 004B 0810 00225 movf RC5_Timer_Ovfl,W ; YES: detect an "end of frame" 004C 3C02 00226 sublw Long_Delay ; Check if RC5_TMR0_Ovfl > Long_Delay (Long_Delay - RC5_Timer_Ovfl < 0) 004D 1803 00227 btfsc CARRY ; Is the result < 0 (CARRY == 0)? 004E 2850 00228 goto TMR0_Inc_RC5_Timer_Ovfl ; NO: then increment 004F 2852 00229 goto TMR0_RC5_End_of_Frame ; YES: See if it is the end of an RC5 frame 0050 00230 TMR0_Inc_RC5_Timer_Ovfl 0050 0A90 00231 incf RC5_Timer_Ovfl,F ; Increment the TMR0 overflow counter 0051 2857 00232 goto TMR0_Next ; and continue 0052 00233 TMR0_RC5_End_of_Frame 0052 2079 00234 call Add_0_to_RC5 ; Add 0 as last bit (only possible choice) 0053 108C 00235 bcf Reading_RC5 ; stop reading now 0054 118B 00236 bcf INTCON,RBIE ; disable RB4 (RC5-related) interrupts 0055 2096 00237 call RC5_LED_Off ; Set the LED off 0056 158C 00238 bsf RC5_Data_Ready ; Signal the Main_Loop that the data is ready 00239 0057 00240 TMR0_Next 00241 ; Real Time Clock (64 TMR0 overflows = ~2 seconds) 0057 1E8C 00242 btfss RTC_Enable ; Is the RTC running? 0058 2868 00243 goto TMR0_Int_End ; NO: skip this part 0059 0B95 00244 decfsz RTC_64,F ; Count 1/64th of 2 seconds. 64th round? 005A 2868 00245 goto TMR0_Int_End ; NO: nothing happens 005B 3040 00246 movlw d'64' ; YES: Reinitialize counter to 64 005C 0095 00247 movwf RTC_64 005D 208D 00248 call Blink_Timer_LED ; Blink the timer's LED 005E 0B94 00249 decfsz RTC_L,F ; Count -1 second. Zero? 005F 2868 00250 goto TMR0_Int_End ; NO: nothing more happens 0060 0893 00251 movf RTC_H,F ; YES: 0061 1D03 00252 btfss ZERO ; Is RTC_H == 0? 0062 2864 00253 goto TMR0_Dec_RTC_H ; NO: Count -1 in RTC_H 0063 2866 00254 goto TMR0_Ring ; YES: Ring the computer 0064 00255 TMR0_Dec_RTC_H 0064 0393 00256 decf RTC_H,F ; 0065 2868 00257 goto TMR0_Int_End ; 0066 00258 TMR0_Ring 0066 128C 00259 bcf RTC_Enable ; 0067 170C 00260 bsf RTC_Ring_Time ; 00261 0068 00262 TMR0_Int_End 0068 280F 00263 goto Pop 00264 00265 ; End of Interrup Vector 00266 00267 ; gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00268 ;***** RC5 register routines ***** 00269 ; 00270 0069 00271 Clear_RC5 ; ** SUBROUTINE ** 0069 0199 00272 clrf RC5_0 ; clear RC5 registers (all 4) 006A 0198 00273 clrf RC5_1 006B 0197 00274 clrf RC5_2 006C 0196 00275 clrf RC5_3 006D 0192 00276 clrf RC5_Bit_Count 006E 3070 00277 movlw d'11110000' 006F 058C 00278 andwf flags,F ; Clear only the lower 4 bits of flags (RC5-related) 0070 0008 00279 return ; return from subroutine 00280 0071 00281 Shift_RC5 ; ** SUBROUTINE ** 0071 0D99 00282 rlf RC5_0,F ; left shift RC5_0. MSb in carry 0072 0D98 00283 rlf RC5_1,F ; left shift RC5_1. Carry to LSb, MSb in carry 0073 0D97 00284 rlf RC5_2,F ; left shift RC5_2. Carry to LSb, MSb in carry 0074 0D96 00285 rlf RC5_3,F ; left shift RC5_3. Carry to LSb, MSb in carry 0075 0008 00286 return ; return from subroutine 00287 0076 00288 Add_1_to_RC5 ; ** SUBROUTINE ** 0076 2071 00289 call Shift_RC5 ; Shift the RC5 registr by 1 bit 0077 1419 00290 bsf RC5_0,0 ; Set LSb to 1 0078 0008 00291 return ; return from subroutine 00292 0079 00293 Add_0_to_RC5 ; ** SUBROUTINE ** 0079 2071 00294 call Shift_RC5 ; Shift the RC5 registr by 1 bit 007A 1019 00295 bcf RC5_0,0 ; Set LSb to 1 007B 0008 00296 return ; return from subroutine 00297 007C 00298 Add_1_bit_to_RC5 007C 0A92 00299 incf RC5_Bit_Count,F 007D 1C0C 00300 btfss Prev_RC5_Val ; Previous RC5 value == 1? 007E 2881 00301 goto Add_one_0_bit_to_RC5 ; NO: Add one '0' bit 007F 00302 Add_one_1_bit_to_RC5 ; YES: Add one '1' bit 007F 2076 00303 call Add_1_to_RC5 0080 0008 00304 return 0081 00305 Add_one_0_bit_to_RC5 0081 2079 00306 call Add_0_to_RC5 0082 0008 00307 return 00308 0083 00309 Add_2_bits_to_RC5 0083 0A92 00310 incf RC5_Bit_Count,F 0084 0A92 00311 incf RC5_Bit_Count,F 0085 1C0C 00312 btfss Prev_RC5_Val ; Previous RC5 value == 1? 0086 288A 00313 goto Add_two_0_bit_to_RC5 ; NO: Add two '0' bits 0087 00314 Add_two_1_bit_to_RC5 ; YES: Add two '1' bits 0087 2076 00315 call Add_1_to_RC5 0088 2076 00316 call Add_1_to_RC5 0089 0008 00317 return 008A 00318 Add_two_0_bit_to_RC5 008A 2079 00319 call Add_0_to_RC5 008B 2079 00320 call Add_0_to_RC5 008C 0008 00321 return gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 7 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00322 00323 ; 00324 ;***** Blink Timer LED ***** 00325 ; 008D 00326 Blink_Timer_LED 008D 1814 00327 btfsc RTC_L,0 ; Is RTC seconds even? 008E 2890 00328 goto Timer_LED_On ; NO: LED on 008F 2892 00329 goto Timer_LED_Off ; YES: LED off 0090 00330 Timer_LED_On 0090 1585 00331 bsf Timer_LED 0091 0008 00332 return 0092 00333 Timer_LED_Off 0092 1185 00334 bcf Timer_LED 0093 0008 00335 return 00336 00337 ; 00338 ;***** RC5 LED ON/OFF routines *** 00339 ; 0094 00340 RC5_LED_On 0094 1505 00341 bsf RC5_LED 0095 0008 00342 return 00343 0096 00344 RC5_LED_Off 0096 1105 00345 bcf RC5_LED 0097 0008 00346 return 00347 00348 ; 00349 ;***** Ring ***** 00350 ; 0098 00351 Ring 0098 1485 00352 bsf Ring_Output ; Start Ring signal 0099 30FF 00353 movlw 0xFF ; Loop for ~50 ms (256 * 65 * 3 cycles @ 1 MHz) 009A 009B 00354 movwf Ring_Counter_L 009B 3041 00355 movlw 0x41 009C 009A 00356 movwf Ring_Counter_H 009D 00357 Ring_Loop 009D 0B9B 00358 decfsz Ring_Counter_L,F ; this inner waiting loop takes about 3 cycles 009E 289D 00359 goto Ring_Loop 009F 0B9A 00360 decfsz Ring_Counter_H,F 00A0 289D 00361 goto Ring_Loop 00A1 1085 00362 bcf Ring_Output ; Stop Ring signal 00A2 0008 00363 return 00364 00365 ; 00366 ;***** Main Program ***** 00367 ; 00A3 00368 Main_Start 00A3 1683 00369 SEL_BANK_1 00A4 3006 00370 movlw b'00000110' ; Select internal timer mode for TMR0 00371 ; Prescaler assigned to TMR0 00372 ; Set prescaler to 1:128 (b'110'). Then: 00373 ; TMR0 increment = 0.128 ms 00374 ; TMR0 overflow int = 32.768 ms 00A5 0081 00375 movwf OPTION_REG gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 8 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00A6 1283 00376 SEL_BANK_0 00377 00A7 3040 00378 movlw d'64' ; Initialize RTC_64 counter to 64. RTC_64 reaching 0 = 2.097152 s 00A8 0095 00379 movwf RTC_64 00A9 0194 00380 clrf RTC_L ; Clear RTC registers (Low and High) 00AA 0193 00381 clrf RTC_H 00AB 2069 00382 call Clear_RC5 ; Clear RC_5 registers 00AC 30FF 00383 movlw 0xFF 00AD 0090 00384 movwf RC5_Timer_Ovfl ; Initialize RC5_Timer_Ovfl to FF: first int is a long delay 00385 00AE 0186 00386 clrf PORTB ; Initialize port B 00AF 1683 00387 SEL_BANK_1 00B0 301E 00388 movlw 0x1E ; Set RB4,RB3,RB2,RB1 to input 00B1 0086 00389 movwf TRISB 00B2 3000 00390 movlw 0x00 ; Set PortA<4:0> to output 00B3 0085 00391 movwf TRISA 00B4 1283 00392 SEL_BANK_0 00B5 168B 00393 bsf INTCON,T0IE ; Enable TMR0 Interrupt 00B6 158B 00394 bsf INTCON,RBIE ; Enable RB4 Interrupt on change 00B7 178B 00395 bsf INTCON,GIE ; Enable all Interrupts 00396 00B8 00397 Main_Loop 00B8 198C 00398 btfsc RC5_Data_Ready ; Is the RC5 data available? 00B9 28BF 00399 goto Process_RC5_Data ; YES: Process the RC5 data 00BA 1886 00400 btfsc Data_Ready ; NO: then is the RTC programming data ready? 00BB 292F 00401 goto Process_RTC_Data ; YES: Process RTC data 00BC 1B0C 00402 btfsc RTC_Ring_Time ; NO: then do we need to ring the computer? 00BD 294C 00403 goto RTC_Ring ; YES: then ring it 00BE 28B8 00404 goto Main_Loop ; NO: Loop 00405 ; 00406 ; RC5 Data processing 00407 ; 00BF 00408 Process_RC5_Data 00BF 303F 00409 movlw b'00111111' 00C0 0597 00410 andwf RC5_2,F ; set the RC5 Toggle bit (2 bits in Manchester) to 0 00C1 1D86 00411 btfss RC5_RW_Input ; YES: write to EEPROM, then? 00C2 28C4 00412 goto Compare_RC5_to_EEPROM ; NO: compare to EEPROM version 00C3 28ED 00413 goto Store_RC5_to_EEPROM ; YES: write to EEPROM 00C4 00414 Compare_RC5_to_EEPROM 00C4 3000 00415 movlw EEPROM_RC5_0 ; 00C5 0089 00416 movwf EEADR ; Address to read 00C6 1683 00417 SEL_BANK_1 00C7 1408 00418 bsf EECON1, RD ; EE Read 00C8 1283 00419 SEL_BANK_0 00C9 0808 00420 movf EEDATA, W ; W = EEDATA 00CA 0619 00421 xorwf RC5_0,W ; Compare RC5_0 and EEPROM_RTC_0 00CB 1D03 00422 btfss ZERO ; Is the result Null (RC5_0 == EEPROM_RC5_0)? 00CC 28E9 00423 goto Compare_RC5_End ; NO: go back to main loop 00424 ; YES: Check next RC5 byte 00CD 3001 00425 movlw EEPROM_RC5_1 ; 00CE 0089 00426 movwf EEADR ; Address to read 00CF 1683 00427 SEL_BANK_1 00D0 1408 00428 bsf EECON1, RD ; EE Read 00D1 1283 00429 SEL_BANK_0 gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 9 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00D2 0808 00430 movf EEDATA, W ; W = EEDATA 00D3 0618 00431 xorwf RC5_1,W ; Compare RC5_1 and EEPROM_RC5_1 00D4 1D03 00432 btfss ZERO ; Is the result Null (RC5_1 == EEPROM_RC5_1)? 00D5 28E9 00433 goto Compare_RC5_End ; NO: go back to main loop 00434 ; YES: Check next RC5 byte 00D6 3002 00435 movlw EEPROM_RC5_2 ; 00D7 0089 00436 movwf EEADR ; Address to read 00D8 1683 00437 SEL_BANK_1 00D9 1408 00438 bsf EECON1, RD ; EE Read 00DA 1283 00439 SEL_BANK_0 00DB 0808 00440 movf EEDATA, W ; W = EEDATA 00DC 0617 00441 xorwf RC5_2,W ; Compare RC5_2 and EEPROM_RC5_2 00DD 1D03 00442 btfss ZERO ; Is the result Null (RC5_2 == EEPROM_RC5_2)? 00DE 28E9 00443 goto Compare_RC5_End ; NO: go back to main loop 00444 ; YES: Check next RC5 byte 00DF 3003 00445 movlw EEPROM_RC5_3 ; 00E0 0089 00446 movwf EEADR ; Address to read 00E1 1683 00447 SEL_BANK_1 00E2 1408 00448 bsf EECON1, RD ; EE Read 00E3 1283 00449 SEL_BANK_0 00E4 0808 00450 movf EEDATA, W ; W = EEDATA 00E5 0616 00451 xorwf RC5_3,W ; Compare RC5_3 and EEPROM_RC5_3 00E6 1D03 00452 btfss ZERO ; Is the result Null (RC5_3 == EEPROM_RC5_3)? 00E7 28E9 00453 goto Compare_RC5_End ; NO: go back to main loop 00454 ; YES: They match. Let's wake up the computer (Ring) 00455 00E8 2098 00456 call Ring 00E9 00457 Compare_RC5_End 00E9 118C 00458 bcf RC5_Data_Ready ; Clear the flag 00EA 100B 00459 bcf INTCON,RBIF ; Clear the flag of a previous RC5 interrupt 00EB 158B 00460 bsf INTCON,RBIE ; Re-enable RC5 interrupts 00EC 28B8 00461 goto Main_Loop 00ED 00462 Store_RC5_to_EEPROM 00ED 118C 00463 bcf RC5_Data_Ready ; Clear the flag 00EE 138B 00464 bcf INTCON,GIE ; Disable all Interrupts 00465 00EF 1683 00466 SEL_BANK_1 00F0 1508 00467 bsf EECON1,WREN ; Enable Write 00468 00469 ; Write RC5_0 to EEPROM 00F1 1283 00470 SEL_BANK_0 00F2 3000 00471 movlw EEPROM_RC5_0 ; Address of register EEPROM_RC5_0... 00F3 0089 00472 movwf EEADR ; ... to EEADR 00F4 0819 00473 movf RC5_0,W ; Content of register RC5_0... 00F5 0088 00474 movwf EEDATA ; ... to EEPROM 00F6 1683 00475 SEL_BANK_1 00F7 3055 00476 movlw 0x55 ; 00F8 0089 00477 movwf EECON2 ; Write 55h 00F9 30AA 00478 movlw 0xaa ; 00FA 0089 00479 movwf EECON2 ; Write AAh 00FB 1488 00480 bsf EECON1,WR ; Set WR bit 00FC 00481 Store_RC5_Wait_Byte_0 00FC 1E08 00482 btfss EECON1,EEIF ; Has the interrupt occured? 00FD 28FC 00483 goto Store_RC5_Wait_Byte_0 ; NO: Wait some more gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 10 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00FE 1208 00484 bcf EECON1,EEIF ; YES: Clear the interrupt flag before continuing 00485 00486 ; Write RC5_1 to EEPROM 00FF 1283 00487 SEL_BANK_0 0100 3001 00488 movlw EEPROM_RC5_1 ; Address of register EEPROM_RC5_1... 0101 0089 00489 movwf EEADR ; ... to EEADR 0102 0818 00490 movf RC5_1,W ; Content of register RC5_1... 0103 0088 00491 movwf EEDATA ; ... to EEPROM 0104 1683 00492 SEL_BANK_1 0105 3055 00493 movlw 0x55 ; 0106 0089 00494 movwf EECON2 ; Write 55h 0107 30AA 00495 movlw 0xaa ; 0108 0089 00496 movwf EECON2 ; Write AAh 0109 1488 00497 bsf EECON1,WR ; Set WR bit 010A 00498 Store_RC5_Wait_Byte_1 010A 1E08 00499 btfss EECON1,EEIF ; Has the interrupt occured? 010B 290A 00500 goto Store_RC5_Wait_Byte_1 ; NO: Wait some more 010C 1208 00501 bcf EECON1,EEIF ; YES: Clear the interrupt flag before continuing 00502 00503 ; Write RC5_2 to EEPROM 010D 1283 00504 SEL_BANK_0 010E 3002 00505 movlw EEPROM_RC5_2 ; Address of register EEPROM_RC5_2... 010F 0089 00506 movwf EEADR ; ... to EEADR 0110 0817 00507 movf RC5_2,W ; Content of register RC5_2... 0111 0088 00508 movwf EEDATA ; ... to EEPROM 0112 1683 00509 SEL_BANK_1 0113 3055 00510 movlw 0x55 ; 0114 0089 00511 movwf EECON2 ; Write 55h 0115 30AA 00512 movlw 0xaa ; 0116 0089 00513 movwf EECON2 ; Write AAh 0117 1488 00514 bsf EECON1,WR ; Set WR bit 0118 00515 Store_RC5_Wait_Byte_2 0118 1E08 00516 btfss EECON1,EEIF ; Has the interrupt occured? 0119 2918 00517 goto Store_RC5_Wait_Byte_2 ; NO: Wait some more 011A 1208 00518 bcf EECON1,EEIF ; YES: Clear the interrupt flag before continuing 00519 00520 ; Write RC5_3 to EEPROM 011B 1283 00521 SEL_BANK_0 011C 3003 00522 movlw EEPROM_RC5_3 ; Address of register EEPROM_RC5_3... 011D 0089 00523 movwf EEADR ; ... to EEADR 011E 0816 00524 movf RC5_3,W ; Content of register RC5_3... 011F 0088 00525 movwf EEDATA ; ... to EEPROM 0120 1683 00526 SEL_BANK_1 0121 3055 00527 movlw 0x55 ; 0122 0089 00528 movwf EECON2 ; Write 55h 0123 30AA 00529 movlw 0xaa ; 0124 0089 00530 movwf EECON2 ; Write AAh 0125 1488 00531 bsf EECON1,WR ; Set WR bit 0126 00532 Store_RC5_Wait_Byte_3 0126 1E08 00533 btfss EECON1,EEIF ; Has the interrupt occured? 0127 2926 00534 goto Store_RC5_Wait_Byte_3 ; NO: Wait some more 0128 1208 00535 bcf EECON1,EEIF ; YES: Clear the interrupt flag before continuing 00536 00537 ; End of writing gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 11 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0129 1108 00538 bcf EECON1,WREN ; Disable Write 012A 1283 00539 SEL_BANK_0 012B 100B 00540 bcf INTCON,RBIF ; Clear the flag of a previous RC5 interrupt 012C 158B 00541 bsf INTCON,RBIE ; Re-enable RC5 interrupts 012D 178B 00542 bsf INTCON,GIE ; Enable all Interrupts 012E 28B8 00543 goto Main_Loop 00544 00545 ; 00546 ; RTC input data processing 00547 ; 012F 00548 Process_RTC_Data 012F 1A0C 00549 btfsc Reading_Data ; Are we already reading RTC data? 0130 2936 00550 goto Read_RTC_Data ; YES: skip initialization 0131 019D 00551 clrf RTC_Temp_L ; No: Initialize. Clear the Temp registers 0132 019C 00552 clrf RTC_Temp_H 0133 3010 00553 movlw d'16' ; Set the bit counter to 16 0134 009E 00554 movwf RTC_Bit_Counter 0135 160C 00555 bsf Reading_Data ; Set the reading flag 0136 00556 Read_RTC_Data 0136 0D9D 00557 rlf RTC_Temp_L,F ; Shift the RTC_Temp 0137 0D9C 00558 rlf RTC_Temp_H,F 0138 101D 00559 bcf RTC_Temp_L,0 ; Set the 0139 1906 00560 btfsc Data ; Read the data 013A 141D 00561 bsf RTC_Temp_L,0 013B 1405 00562 bsf Data_ACK ; Set Data_ACK 013C 00563 Wait_ACK_of_ACK 013C 1886 00564 btfsc Data_Ready ; Is the Data_Ready signal to 0 (i.e. other has got our ACK) 013D 293C 00565 goto Wait_ACK_of_ACK ; NO: then wait until it goes to 0 013E 1005 00566 bcf Data_ACK ; YES: clear the Data_Ready signal 013F 0B9E 00567 decfsz RTC_Bit_Counter,F ; 1 more bit read. Have we read all 16 bits now? 0140 28B8 00568 goto Main_Loop ; NO: there will be another data bit, hopefully 0141 00569 Save_RTC_Data ; Move the data to the RTC counters 0141 120C 00570 bcf Reading_Data ; Clear the reading flag 0142 128B 00571 bcf INTCON,T0IE ; Disable TMR0 Interrupt (necessary?) 0143 081D 00572 movf RTC_Temp_L,W ; Move RTC_Temp_L to RTC_L 0144 0094 00573 movwf RTC_L 0145 081C 00574 movf RTC_Temp_H,W ; Move RTC_Temp_H to RTC_H 0146 0093 00575 movwf RTC_H 0147 3040 00576 movlw d'64' ; Initialize RTC_64 counter to 64. 0148 0095 00577 movwf RTC_64 0149 168C 00578 bsf RTC_Enable ; Restart the RTC 014A 168B 00579 bsf INTCON,T0IE ; Re-enable TMR0 Interrupt (see disable's comment) 014B 28B8 00580 goto Main_Loop 00581 00582 ; 00583 ; RTC Event processing 00584 ; 014C 00585 RTC_Ring 014C 130C 00586 bcf RTC_Ring_Time ; Clear the time-to-ring flag 014D 2098 00587 call Ring ; and ring 014E 28B8 00588 goto Main_Loop 00589 00590 ; 00591 ; Code End gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 12 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00592 ; gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 13 SYMBOL TABLE LABEL VALUE Add_0_to_RC5 00000079 Add_1_bit_to_RC5 0000007C Add_1_to_RC5 00000076 Add_2_bits_to_RC5 00000083 Add_one_0_bit_to_RC5 00000081 Add_one_1_bit_to_RC5 0000007F Add_two_0_bit_to_RC5 0000008A Add_two_1_bit_to_RC5 00000087 Blink_Timer_LED 0000008D C 00000000 Clear_RC5 00000069 Compare_RC5_End 000000E9 Compare_RC5_to_EEPROM 000000C4 DC 00000001 Delay 00000011 Disable_Int 00000008 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 End_RB4_Int 00000042 F 00000001 FSR 00000004 GIE 00000007 INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IRP 00000007 Interrupt_Vector 00000004 Main_Loop 000000B8 Main_Start 000000A3 NOT_PD 00000003 NOT_RBPU 00000007 NOT_TO 00000004 OPTION_REG 00000081 PCL 00000002 PCLATH 0000000A PORTA 00000005 PORTB 00000006 PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 Pop 0000000F Prev_TMR0 0000000F Process_RC5_Data 000000BF Process_RTC_Data 0000012F Push 00000004 RAMbase 0000000C gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 14 LOC OBJECT CODE LINE SOURCE TEXT VALUE RB4_Int 00000014 RBIE 00000003 RBIF 00000000 RC5_0 00000019 RC5_1 00000018 RC5_1_bit 0000002F RC5_2 00000017 RC5_2_bits 00000031 RC5_3 00000016 RC5_Bit_Count 00000012 RC5_Check_Bit_Count 0000003A RC5_Decrement_Timer_Ovfl 00000020 RC5_First_bit 00000037 RC5_Is_Timer_Ovfl_Null 00000023 RC5_LED_Off 00000096 RC5_LED_On 00000094 RC5_Long_Delay 00000033 RC5_Timer_Ovfl 00000010 RD 00000000 RP0 00000005 RP1 00000006 RTC_64 00000015 RTC_Bit_Counter 0000001E RTC_H 00000013 RTC_L 00000014 RTC_Ring 0000014C RTC_Temp_H 0000001C RTC_Temp_L 0000001D Read_RTC_Data 00000136 Reset_Vector 00000000 Ring 00000098 Ring_Counter_H 0000001A Ring_Counter_L 0000001B Ring_Loop 0000009D STATUS 00000003 S_Temp 0000000E Save_RTC_Data 00000141 Shift_RC5 00000071 Store_RC5_Wait_Byte_0 000000FC Store_RC5_Wait_Byte_1 0000010A Store_RC5_Wait_Byte_2 00000118 Store_RC5_Wait_Byte_3 00000126 Store_RC5_to_EEPROM 000000ED T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TMR0 00000001 TMR0_Dec_RTC_H 00000064 TMR0_Inc_RC5_Timer_Ovfl 00000050 TMR0_Int 00000048 TMR0_Int_End 00000068 TMR0_Next 00000057 TMR0_RC5_End_of_Frame 00000052 gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 15 LOC OBJECT CODE LINE SOURCE TEXT VALUE TMR0_Ring 00000066 TRISA 00000085 TRISB 00000086 Timer_LED_Off 00000092 Timer_LED_On 00000090 W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 W_Temp 0000000D Wait_ACK_of_ACK 0000013C Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84A 00000001 flags 0000000C CARRY STATUS,C Data PORTB,2 Data_ACK PORTA,0 Data_Ready PORTB,1 EEPROM_RC5_0 0x00 EEPROM_RC5_1 0x01 EEPROM_RC5_2 0x02 EEPROM_RC5_3 0x03 IR_Input PORTB,4 Long_Delay 0x02 Prev_RC5_Val flags,0 RC5_Data_Ready flags,3 RC5_Enable flags,2 RC5_LED PORTA,2 RC5_RW_Input PORTB,3 RTC_Enable flags,5 RTC_Ring_Time flags,6 Reading_Data flags,4 Reading_RC5 flags,1 Ring_Output PORTA,1 SEL_BANK_0 bcf STATUS,RP0 SEL_BANK_1 bsf STATUS,RP0 TH1 d'10' TH2 d'07' Timer_LED PORTA,3 ZERO STATUS,Z MEMORY USAGE MAP ('X' = Used, '-' = Unused) gpasm-0.10.0 alpha rc5_timer.asm12-25-2003 20:52:04 PAGE 16 LOC OBJECT CODE LINE SOURCE TEXT VALUE 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 : XXXXXXXXXXXXXXX- ---------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 336 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 0 suppressed