gpasm-0.11.8 alpha lightpen2.asm4-29-2004 00:00:11 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; CPU configuration 00002 processor 16f84 00003 include 00001 LIST 00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00136 LIST 002007 3FF2 00004 __config _HS_OSC & _WDT_OFF & _PWRTE_ON 00005 00006 ; variables 00007 00000010 00008 tick EQU H'10' ; counter for pulsewidth (high freq) 00000011 00009 cycle EQU H'11' ; counter for the colour cycle (low freq) 00000012 00010 rpw EQU H'12' ; pulsewidths for rgb 00000013 00011 gpw EQU H'13' 00000014 00012 bpw EQU H'14' 00000015 00013 triin EQU H'15' ; value to use with maketriwave 00000016 00014 temp EQU H'16' 00000017 00015 scycle EQU H'17' ; slow version of the cycle 00016 00000017 00017 roff EQU H'17' ; phase offsets for the colour change 00000018 00018 goff EQU H'18' 00000019 00019 boff EQU H'19' 00020 00000001 00021 rpin EQU H'01' ; i/o pins for rgb 00000002 00022 gpin EQU H'02' 00000003 00023 bpin EQU H'03' 00000004 00024 invrpin EQU H'04' ; inverse of r for two colour blending 00025 0000 00026 main: 0000 3000 00027 movlw B'00000000' Warning [224] : Use of this instruction is not recommended. 0001 0065 00028 tris PORTA ; init port A as output 0002 30FF 00029 movlw B'11111111' Warning [224] : Use of this instruction is not recommended. 0003 0066 00030 tris PORTB ; init port B as input 00031 00032 ; init stuff 0004 0190 00033 clrf tick 0005 0191 00034 clrf cycle 0006 0192 00035 clrf rpw 0007 0193 00036 clrf gpw 0008 0194 00037 clrf bpw 0009 0197 00038 clrf roff 00039 00040 ; setup the offset values 000A 3040 00041 movlw D'64' 000B 0098 00042 movwf goff 000C 3080 00043 movlw D'128' 000D 0099 00044 movwf boff 00045 000E 00046 begin: 00047 00048 ; do the red pulsewidth 000E 0810 00049 movf tick,w ; load tick to w gpasm-0.11.8 alpha lightpen2.asm4-29-2004 00:00:11 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000F 0212 00050 subwf rpw,w ; subtract tick from rpw 0010 1C03 00051 btfss STATUS,C ; if carry is set, skip 0011 2815 00052 goto redelse ; goto else 0012 1485 00053 bsf PORTA,rpin ; set rpin on 0013 1205 00054 bcf PORTA,invrpin ; set reverse r off 0014 2817 00055 goto redendif ; get out 0015 00056 redelse: 0015 1085 00057 bcf PORTA,rpin ; else, rpin is off 0016 1605 00058 bsf PORTA,invrpin ; reverse r pin on 0017 00059 redendif: 00060 00061 00062 ; do the green pulsewidth 0017 0810 00063 movf tick,w ; load tick to w 0018 0213 00064 subwf gpw,w ; subtract tick from rpw 0019 1C03 00065 btfss STATUS,C ; if carry is set, skip 001A 281D 00066 goto greenelse ; goto else 001B 1505 00067 bsf PORTA,gpin ; set rpin on 001C 281E 00068 goto greenendif ; get out 001D 00069 greenelse: 001D 1105 00070 bcf PORTA,gpin ; else, gpin is off 001E 00071 greenendif: 00072 00073 00074 ; do the blue pulsewidth 001E 0810 00075 movf tick,w ; load tick to w 001F 0214 00076 subwf bpw,w ; subtract tick from rpw 0020 1C03 00077 btfss STATUS,C ; if carry is set, skip 0021 2824 00078 goto blueelse ; goto else 0022 1585 00079 bsf PORTA,bpin ; set bpin on 0023 2825 00080 goto blueendif ; get out 0024 00081 blueelse: 0024 1185 00082 bcf PORTA,bpin ; else, bpin is off 0025 00083 blueendif: 00084 00085 0025 0A90 00086 incf tick,f ; ++tick 0026 1903 00087 btfsc STATUS,Z 0027 2029 00088 call updatecycle ; update cycle once per pulse 0028 280E 00089 goto begin 00090 00091 ; 23 instr 00092 ; 24 with updatecycle 00093 0029 00094 updatecycle: 0029 0A91 00095 incf cycle,f 002A 1C11 00096 btfss cycle,0 ; every other cycle 002B 0A97 00097 incf scycle,f ; update slow cycle 00098 00099 ; call maketriwave for red 002C 0817 00100 movf scycle,w ; load the cycle 002D 0095 00101 movwf triin ; into tryiin 002E 203B 00102 call maketriwave 002F 0092 00103 movwf rpw ; move result into red pulse width gpasm-0.11.8 alpha lightpen2.asm4-29-2004 00:00:11 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00104 00105 ; call maketriwave for green 0030 0818 00106 movf goff,w ; load the offset for green 0031 0717 00107 addwf scycle,w ; add it to cycle 0032 0095 00108 movwf triin ; put it in tryiin 0033 203B 00109 call maketriwave 0034 0093 00110 movwf gpw ; move result into green pulse width 00111 00112 ; call maketriwave for blue 0035 0819 00113 movf boff,w ; load the offset for blue 0036 0717 00114 addwf scycle,w ; add it to cycle 0037 0095 00115 movwf triin ; put it in tryiin 0038 203B 00116 call maketriwave 0039 0094 00117 movwf bpw ; move result into blue pulse width 00118 003A 0008 00119 return 00120 00121 ; converts contents of triin to wave on w 003B 00122 maketriwave: 003B 3080 00123 movlw D'128' 003C 0096 00124 movwf temp 003D 0815 00125 movf triin,w 003E 0216 00126 subwf temp,w 003F 1803 00127 btfsc STATUS,C ; if triin is less than 128 0040 2845 00128 goto triwaveup ; goin up! 0041 0096 00129 movwf temp 0042 3080 00130 movlw D'128' 0043 0216 00131 subwf temp,w 0044 0008 00132 return ; returns 128-triin 0045 00133 triwaveup: 00134 ;movlw D'128' 00135 ;subwf triin,w ; shift down 128 0045 0815 00136 movf triin,w ; returns triin 0046 0008 00137 return 00138 00139 gpasm-0.11.8 alpha lightpen2.asm4-29-2004 00:00:11 PAGE 4 SYMBOL TABLE LABEL VALUE C 00000000 DC 00000001 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 F 00000001 FSR 00000004 GIE 00000007 INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IRP 00000007 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 RBIE 00000003 RBIF 00000000 RD 00000000 RP0 00000005 RP1 00000006 STATUS 00000003 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TMR0 00000001 TRISA 00000085 TRISB 00000086 W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 gpasm-0.11.8 alpha lightpen2.asm4-29-2004 00:00:11 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 begin 0000000E blueelse 00000024 blueendif 00000025 boff 00000019 bpin 00000003 bpw 00000014 cycle 00000011 goff 00000018 gpin 00000002 gpw 00000013 greenelse 0000001D greenendif 0000001E invrpin 00000004 main 00000000 maketriwave 0000003B redelse 00000015 redendif 00000017 roff 00000017 rpin 00000001 rpw 00000012 scycle 00000017 temp 00000016 tick 00000010 triin 00000015 triwaveup 00000045 updatecycle 00000029 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXX--------- ---------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 72 Errors : 0 Warnings : 2 reported, 0 suppressed Messages : 0 reported, 0 suppressed