===== Parallax PIC16Cxx Assembler v4.7 ===== 1 ;author:ON1BEW 2 ;version:1.6 3 ;date: 14/12/2012 4 5 ;frequency counter, uitlezen frequentie van sat tuner 6 ;de offset frequentie is 479.500MHz 7 ;de frequentie output van de tuner is de helft van de reele waarde. 8 ;de SW corrigeert dit. 9 ;uitlezing op een 7-segment led display CA(common anode) 10 ;type processor PIC 16F84 11 ;kristal frequentie 4.000.000Hz 12 13 ;---------------------------------------------------------------------------- 14 0000- DEVICE PIC16C84,hs_osc,wdt_off,pwrt_off,protect_off 15 16 ;declaratie variabelen 17 000C- org 0Ch 18 =0006 gate = RB.0 ;input gate frequentiecounter 19 000C- count DS 1 ;lokale teller 20 000D- fhh DS 1 ;ruwe teldata bin/hex 21 000E- fhi DS 1 ;ruwe teldata bin/hex 22 000F- flo DS 1 ;ruwe teldata bin/hex 23 0010- dig43 DS 1 ;decimale waarde 2 digits 24 0011- dig21 DS 1 ;decimale waarde 2 digits 25 0012- htd87 DS 1 ;gebruikt tijdens conversie 26 0013- htd65 DS 1 ;gebruikt tijdens conversie 27 0014- htd43 DS 1 ;gebruikt tijdens conversie 28 0015- htd21 DS 1 ;gebruikt tijdens conversie 29 0016- zero DS 1 ;gebruikt voor leading zeros 30 0017- ms5 DS 1 ;teller voor 5mS 31 0018- us DS 1 ;teller voor 50 æS 32 0019- segm DS 1 ;teller voor segmentprocedure 33 ;---------------------------------------------------------------------------- 34 EEPROM 00- eeorg 000h 35 EEPROM 00- FF FF FF FF eedata 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh EEPROM 04- FF FF FF FF EEPROM 08- FF FF FF FF EEPROM 0C- FF FF FF FF 36 EEPROM 10- FF FF FF FF eedata 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh EEPROM 14- FF FF FF FF EEPROM 18- FF FF FF FF EEPROM 1C- FF FF FF FF 37 EEPROM 20- FF FF FF FF eedata 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh EEPROM 24- FF FF FF FF EEPROM 28- FF FF FF FF EEPROM 2C- FF FF FF FF 38 EEPROM 30- FF FF FF FF eedata 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh EEPROM 34- FF FF FF FF EEPROM 38- FF FF FF FF EEPROM 3C- FF FF FF FF 39 ;---------------------------------------------------------------------------- 40 ;Hier begin het programma 41 0000- ORG 0 42 ;initialisatie en reset 43 0000- 1683 setb rp0 ;ga naar bank 1 44 0001- 3010 0085 mov trisa,#010h ;portA xxx1 0000 (1=ingang) 45 0003- 3000 0086 mov trisb,#000h ;portB 0000 0000 (0=uitgang) 46 0005- 1681 setb T0CS ;koppel pin RA4 aan tmr0 47 0006- 1201 clrb T0SE ;Low to High 48 0007- 1181 clrb PSA ;koppel prescaler aan de deler 49 0008- 1501 setb PS2 ;)deler op 111 =>dus 50 0009- 1481 setb PS1 ;)deel door 256 51 000A- 1401 setb PS0 ;) 52 000B- 1283 clrb rp0 ;ga naar bank 0 53 000C- 018D clr fhh ;clear fhh 54 000D- 018E clr fhi ;clear fhi 55 000E- 018F clr flo ;clear flo 56 000F- 0190 clr dig43 ;clear dig43 57 0010- 0191 clr dig21 ;clear dig21 58 59 ;Hoofdlus 60 0011- 2018 :loop call sample ;tel ingang gedurende 1ms 61 0012- 2026 call segment ;data naar display 62 0013- 20BE call getfreq ;lees tmr0 en prescaler uit 63 0014- 2026 call segment ;data naar display 64 0015- 2063 call convert ;zet de BCD waarde om naar decimaal 65 0016- 2026 call segment ;data naar display 66 0017- 2811 jmp :loop ;herbegin de uitlezing 67 ;---------------------------------------------------------------------------- 68 ;Sample routine 69 ;stelt ingangspoort open 1ms 70 ;telt gedurende deze tijd de pulsen 71 ;resultaat staat in tmr0 en prescaler 72 ;exact 1mS met aanroepen terugkeer tijd 73 74 0018- 0181 sample clr TMR0 ;clear tmr0 => gekoppeld aan RA4 75 0019- 3012 008C mov count,#18 ;aantal keer 76 001B- 20B6 call enagate ;open de input 77 001C- 20B1 call mikro50 ;wacht 50uS 78 001D- 0B8C 281C djnz count,$-1 ;aantal keer loop 79 001F- 300D 008C mov count,#13 80 0021- 0B8C 2821 djnz count,$ ;aantal keer loop 81 0023- 0000 nop ;fijn regeling 82 0024- 20BA call disgate ;sluit de input 83 0025- 0008 ret 84 ;---------------------------------------------------------------------------- 85 ;omzetten naar 7 segment data 86 ;bron is dig43 en dig21 87 88 0026- 0196 segment clr zero ;blanking register 89 0027- 0E10 mov w,<>dig43 ;high nibble in w 90 0028- 390F and w,#00Fh ;filter low nibble 91 0029- 1903 2831 jz $+8 ;0=blanking 92 002B- 2058 call segdat ;lookup tabel pc+w 93 002C- 0086 mov RB,w ;zet dit op poort RB 94 002D- 3001 0085 mov RA,#1 ;licht display MSB op 95 002F- 3001 0096 mov zero,#1 ;geen blanking 96 0031- 20A7 call vijfms ;wacht 5ms 97 98 0032- 0810 mov w,dig43 ;low nibble in w 99 0033- 390F and w,#00Fh ;filter low nibble 100 0034- 1D03 2839 jnz $+5 ;<>0 toon 7segment 101 0036- 0896 test zero ;vorig segment 0? 102 0037- 1903 283F jz $+8 ;blank segment 103 0039- 2058 call segdat ;lookup tabel pc+w 104 003A- 0086 mov RB,w ;zet dit op poort RB 105 003B- 3002 0085 mov RA,#2 ;licht display op 106 003D- 3001 0096 mov zero,#1 ;geen blanking 107 003F- 20A7 call vijfms ;wacht 5ms 108 109 0040- 0E11 mov w,<>dig21 ;high nibble in w 110 0041- 390F and w,#00Fh ;filter low nibble 111 0042- 1D03 2847 jnz $+5 ;<>0 toon 7segment 112 0044- 0896 test zero ;vorig segment 0? 113 0045- 1903 284D jz $+8 ;0=blanking 114 0047- 2058 call segdat ;lookup tabel pc+w 115 0048- 0086 mov RB,w ;zet dit op poort RB 116 0049- 3004 0085 mov RA,#4 ;licht display op 117 004B- 3001 0096 mov zero,#1 ;geen blanking 118 004D- 20A7 call vijfms ;wacht 5ms 119 120 004E- 0811 mov w,dig21 ;low nibble in w 121 004F- 390F and w,#00Fh ;filter low nibble 122 0050- 2058 call segdat ;lookup tabel pc+w 123 0051- 0086 mov RB,w ;zet dit op poort RB 124 0052- 3008 0085 mov RA,#8 ;licht display LSB op 125 0054- 20A7 call vijfms ;wacht 5ms 126 127 0055- 3000 0085 mov RA,#0 ;alle displays uit 128 0057- 0008 ret 129 ;---------------------------------------------------------------------------- 130 0058- 0782 segdat jmp pc+w ;spring 131 ;common anode code. 132 0059- 3480 retw 080h ;0 133 005A- 34F2 retw 0F2h ;1 134 005B- 3448 retw 048h ;2 135 005C- 3460 retw 060h ;3 136 005D- 3432 retw 032h ;4 137 005E- 3424 retw 024h ;5 138 005F- 3404 retw 004h ;6 139 0060- 34F0 retw 0F0h ;7 140 0061- 3400 retw 000h ;8 141 0062- 3420 retw 020h ;9 142 ;---------------------------------------------------------------------------- 143 ;Conversie module bin/hex naar decimal 144 ;brondata zit in fhh,fhi en flo 145 ;maximum waarde (of frequentie) is 256*256*256=16.777.216 146 ;resultaat komt in dig65,dig43 en dig21 als decimale waarde 147 ;6 decimale digits ter beschikking 148 ;dig21 bevat decimaal dig2 en dig1, high en low nibble 149 ;selecteer op het laatste van de procedure welke te tonen 150 151 0063- 0192 convert clr htd87 152 0064- 0193 clr htd65 153 0065- 0194 clr htd43 154 0066- 0195 clr htd21 155 0067- 0190 clr dig43 156 0068- 0191 clr dig21 157 158 ;vanaf hier de conversie 159 0069- 3018 008C mov count,#24 ;3 bytes lang doorschuiven 160 006B- 1003 :loop clc ;clear de carry 161 006C- 0D8F rl flo ;schuif de teller 1 x door 162 006D- 0D8E rl fhi ;via de carry komt wordt de 163 006E- 0D8D rl fhh ;waarde doorgeklokt 164 006F- 0D95 rl htd21 ; 165 0070- 0D94 rl htd43 ;htd21,43,65,87 worden gebruikt om de 166 0071- 0D93 rl htd65 ;omrekening naar decimaal uit te rekenen 167 0072- 0D92 rl htd87 ; 168 0073- 3001 020C 1903 2889 cje count,#1,:einde ;stop wanneer count op 1 staat 169 170 0077- 0815 0084 mov fsr,htd21 ;hex omzetten naar decimaal 171 0079- 2096 call bindec ;zet om 172 007A- 0095 mov htd21,w ;spaar decimale waarde 173 174 007B- 0814 0084 mov fsr,htd43 ;hex omzetten naar decimaal 175 007D- 2096 call bindec ;zet om 176 007E- 0094 mov htd43,w ;spaar decimale waarde 177 178 007F- 0813 0084 mov fsr,htd65 ;hex omzetten naar decimaal 179 0081- 2096 call bindec ;zet om 180 0082- 0093 mov htd65,w ;spaar decimale waarde 181 182 0083- 0812 0084 mov fsr,htd87 ;hex omzetten naar decimaal 183 0085- 2096 call bindec ;zet om 184 0086- 0092 mov htd87,w ;spaar decimale waarde 185 186 0087- 0B8C 286B djnz count,:loop ;werk volgende rotate af 187 188 ;vanaf hier bepalen welke digits er op de display komen 189 ;in dit geval digit 7,6,5,4 190 0089- 0E12 :einde mov w,<>htd87 ;haal swapped nibble 191 008A- 39F0 and w,#0F0h ;filter high nibble 192 008B- 0090 mov dig43,w ;spaar in de vorm htd7 0000 193 194 008C- 0E13 mov w,<>htd65 ;haal swapped nibble 195 008D- 390F and w,#00Fh ;filter low nibble 196 008E- 0790 add dig43,w ;spaar in de vorm xxxx htd6 197 198 008F- 0E13 mov w,<>htd65 ;haal swapped nibble 199 0090- 39F0 and w,#0F0h ;filter high nibble 200 0091- 0091 mov dig21,w ;spaar in de vorm htd5 0000 201 202 0092- 0E14 mov w,<>htd43 ;haal swapped nibble 203 0093- 390F and w,#00Fh ;filter low nibble 204 0094- 0791 add dig21,w ;spaar in de vorm xxxx htd4 205 206 0095- 0008 ret 207 ;---------------------------------------------------------------------------- 208 ;conversie routine bindec 209 ;doorgeefluik is FSR, genoemd naar de bits 210 ;converteer hier de lage nibble 211 0096- 1984 bindec snb fsr.3 ;>4 212 0097- 289D jmp :ltel 213 0098- 1D04 sb fsr.2 ;>4 of =4 214 0099- 289E jmp :nib1 ;<4 215 009A- 1884 snb fsr.1 ;b1= 216 009B- 1B8A skip ;b1=set 217 009C- 1804 snb fsr.0 ;b0= 218 009D- 3E03 :ltel add w,#003h 219 220 ;converter hier de hoge nibble 221 009E- 1B84 :nib1 snb fsr.7 ;>4 222 009F- 28A5 jmp :htel 223 00A0- 1F04 sb fsr.6 ;>4 of =4 224 00A1- 28A6 jmp :end ;<4 225 00A2- 1A84 snb fsr.5 ;b5= 226 00A3- 1B8A skip ;b5=set 227 00A4- 1A04 snb fsr.4 ;b4= 228 00A5- 3E30 :htel add w,#030h 229 00A6- 0008 :end ret 230 ;---------------------------------------------------------------------------- 231 ;wacht 5 ms 232 00A7- 305E 0097 vijfms mov ms5,#94 ;coarse tuning 233 00A9- 20B1 call mikro50 ; / 234 00AA- 0B97 28A9 djnz ms5,$-1 ; / 235 00AC- 3004 0097 mov ms5,#4 ;fine tuning 236 00AE- 0B97 28AE djnz ms5,$ ; / 237 00B0- 0008 ret 238 ;---------------------------------------------------------------------------- 239 ;50 uSeconden h‚‚l nauwkeurig uitgerekend met 4MHz kristal als oscillator 240 00B1- 300F 0098 mikro50 mov us,#15 ;tuning 241 00B3- 0B98 28B3 djnz us,$ ; / 242 00B5- 0008 ret 243 ;---------------------------------------------------------------------------- 244 ;enable de meetpoort 245 00B6- 1683 enagate setb rp0 ;ga naar bank 1 246 00B7- 1406 setb gate ;maak er een input van 247 00B8- 1283 clrb rp0 ;ga naar bank 0 248 00B9- 0008 ret 249 ;---------------------------------------------------------------------------- 250 ;disable de meetpoort 251 00BA- 1683 disgate setb rp0 ;ga naar bank 1 252 00BB- 1006 clrb gate ;maak er een output van 253 00BC- 1283 clrb rp0 ;ga naar bank 0 254 00BD- 0008 ret 255 ;---------------------------------------------------------------------------- 256 ;getfreq, toggles de RB7 pin en schuift zo de waarde uit de 257 ;prescaler. (prescaler is niet rechtstreeks uit te lezen) 258 ;Het aantal toggles is gespaard in count. 256-toggles=prescaler waarde 259 ;Indien de waarde in tmr0 verhoogd, dan is de flo waarde = not(count)+1 260 ;De low waarde van de frequentie is bewaard in flo en de high in fhi. 261 00BE- 0801 008E getfreq mov fhi,TMR0 ;haal de tmr0 waarde 262 00C0- 018F clr flo 263 00C1- 018C clr count ;tel de toggles 264 00C2- 038C dec count 265 00C3- 0A8C :toggle inc count 266 00C4- 1006 clrb gate ;toggle de input (rb7) 267 00C5- 1406 setb gate ; / 268 00C6- 0801 020E 1903 28C3 cje fhi,TMR0,:toggle;tmr0 niet veranderd? 269 270 00CA- 098C not count 271 00CB- 0A8C inc count 272 00CC- 080C 008F mov flo,count 273 274 ;vermenigvuldig aantal keren de prescaler deling om zo op de reele waarde 275 ;te komen, de vermenigvuldigings faktor staat in count 512 = 2^9 276 277 00CE- 018D clr fhh ;begin met een leeg register 278 00CF- 3009 008C mov count,#9 ;aantal vermenigvuldigen 279 00D1- 1003 clc ;clear carry 280 00D2- 0D8F rl flo ;rl=vermenigvuldig met 2 281 00D3- 0D8E rl fhi ; / 282 00D4- 0D8D rl fhh ; / 283 00D5- 0B8C 28D1 djnz count,$-4 ;genoeg vermenigvuldigd? 284 285 ;lokale oscillator correctie 479.500 MHz 286 ;deze waarde dient afgetroken te worden, omdat de tuner 287 ;een boven mixer is. 288 ;479500 dec = 7510C hex 289 00D7- 300C 028F sub flo,#00Ch ;derde deel van 479.500 290 00D9- 1803 28DD jc $+4 ;leen een bit 291 00DB- 3001 028E sub fhi,#1 ;borrow 1 292 00DD- 1803 28E1 jc $+4 ;leen een bit 293 00DF- 3001 028D sub fhh,#1 ;borrow 1 294 295 00E1- 3051 028E sub fhi,#051h ;tweede deel van 479.500 296 00E3- 1803 28E7 jc $+4 ;leen een bit 297 00E5- 3001 028D sub fhh,#1 298 299 00E7- 3007 028D sub fhh,#007h ;eerste deel van 479.500 300 00E9- 0008 ret 301 ;---------------------------------------------------------------------------- ===== Errors: 0 =====