Данная разработка так и не была реализована в железе, но всё же в эмуляторе работала, это была последняя работа с PIC контроллерами. Но главное это то что работа с PICами помогла разобраться с устройством и работой контроллеров.
Схема в принципе полная, не указаны только семисегментные индикаторы. Но в принципе все они схожи и неплохо расписаны в интернете, кроме того некоторую информацию выложил в архиве. Кварцевый резонатор в схеме 16 МГц. На индикаторе символ «с» означает килогерцы. Реализованы две кнопки для увеличения и уменьшения частоты.
Прошивка для PIC контроллера написана на ассемблере в среде разработки MPLAB X IDE.
1 ;******************************************************************************* 2 ; Генератор. 3 ; PIC16F84 Кварц 16 мГц. 4 ;=============================================================================== 5 LIST p=16F84 ; Установка типа микроконтроллера. 6 __CONFIG 03FF1H ; Бит защиты выключен, WDT выключен, 7 ; стандартный XT - генератор. 8 ;=============================================================================== 9 ; Определение положения регистров специального назначения. 10 ;=============================================================================== 11 Status equ 03h ; Регистр выбора банка. 12 PORTA equ 05h 13 TrisA equ 05h 14 TrisB equ 06h ; Регистр выбора направления работы выводов 15 ; порта В. 16 PortB equ 06h ; Регистр управления защелками порта В. 17 ;=============================================================================== 18 ; Константы ------------------------------------------------- 19 W equ 0 20 F equ 1 21 C equ 0 22 Z equ 2 23 PCL equ 02h 24 ; Регистры--------------------------------------------------- 25 Reg_1 equ 0Dh 26 Reg_2 equ 0Eh 27 Reg_3 equ 0Fh 28 Reg_4 equ 1Fh 29 Reg_5 equ 1Eh 30 Reg_6 equ 1Dh 31 ; ============================================================================== 32 ; Определение названия и положения регистров общего назначения. 33 ;=============================================================================== 34 Sec equ 0Ch ; Счетчик времени полупериода. 35 ;=============================================================================== 36 org 0 ; Начать выполнение программы с адреса 0 PC. 37 38 ;******************************************************************************* 39 ; Текст рабочей части программы. 40 ;******************************************************************************* 41 ; Установка направления работы RB0 - на выход. 42 ;------------------------------------------------------------------------------- 43 44 bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит 45 ; регистра Status). 46 movlw .0 ; Записать константу 0 в аккумулятор (W). 47 movwf TrisB ; Скопировать 0 из W в регистр TrisB. 48 bsf TrisA,0 ; Ввод 49 bcf TrisA,1 ; Выход 50 bcf TrisA,2 ; Выход 51 bcf TrisA,3 ; Выход 52 bsf TrisA,4 ; Ввод 53 bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит 54 ; регистра Status). 55 movwf Reg_1 56 bsf PORTA,1 57 bcf PORTA,2 58 bcf PORTA,3 59 60 movlw .70 ; Записать в регистр W константу .10 61 movwf Reg_5 ; Скопировать из W в рег Reg_5 (задерж) 62 movlw .70 ; Записать в регистр W константу 63 movwf Reg_6 ; Скопировать из W в рег Reg_6 64 65 movlw .6 ; Записать в регистр W константу 66 movwf Reg_1 ; Скопировать из W в рег Reg_1 67 68 ;------------------------------------------------------------------------------- 69 ; Кнопка увеличение 70 ;------------------------------------------------------------------------------- 71 ; отслеживание нажатия кнопки (нажатие с защелкой) ------------------- 72 mk1 btfsc PORTA,0 ; бит-проверка на 0 73 goto mk2 74 mk3 btfss PORTA,0 ; бит провнрка на 1 75 goto mk3 76 ; проверка на 15 (крайнее значение), увелечение значения регистра 77 bcf Status,C ; опускаем флаг С в ноль 78 movlw .241 ; (255-15)+1=241 __> W 79 addwf Reg_1,W ; (Reg_4)+W (значение остаётся в W) 80 btfss Status,C ; делаем проверку С-флага 81 ; если бит С=0 то выполняется следующая инструкция 82 ; если бит С=1 то следующая инструкция пропускается 83 incf Reg_1,F ; увеличить значение на 1 и сохранить 84 85 ;movf Reg_5,W ; копируем Reg_5 в W 86 ;bcf Status,Z ; опускаем флаг Z в ноль 87 ;xorlw .250 ; сравниваем W с константой 88 ;btfss Status,Z ; делаем проверку Z-флага 89 ; если бит Z=0 то выполняется следующая инструкция 90 ; если бит Z=1 то следующая инструкция пропускается 91 ;goto a3 92 ;movlw .70 ; Записать в регистр W константу 93 ;a4 movwf Reg_6 ; Скопировать из W в рег Reg_6 94 95 ; отслеживание нажатия кнопки (нажатие с защелкой) ------------------- 96 97 ;------------------------------------------------------------------------------- 98 ; Кнопка уменьшение 99 ;------------------------------------------------------------------------------- 100 ; отслеживание нажатия кнопки (нажатие с защелкой) ------------------- 101 mk2 btfsc PORTA,4 ; бит-проверка на 0 102 goto mk5 103 mk4 btfss PORTA,4 ; бит провнрка на 1 104 goto mk4 105 ; проверка на 15 (крайнее значение), увелечение значения регистра 106 107 movf Reg_1,W ; копируем Reg_1 в W 108 bcf Status,Z ; опускаем флаг Z в ноль 109 xorlw .0 ; сравниваем W с константой 110 btfss Status,Z ; делаем проверку Z-флага 111 ; если бит Z=0 то выполняется следующая инструкция 112 ; если бит Z=1 то следующая инструкция пропускается 113 decf Reg_1,F ; уменьшить значение на 1 и сохранить 114 115 ;movf Reg_5,W ; копируем Reg_1 в W 116 ;bcf Status,Z ; опускаем флаг Z в ноль 117 ;xorlw .250 ; сравниваем W с константой 118 ;btfss Status,Z ; делаем проверку Z-флага 119 ; если бит Z=0 то выполняется следующая инструкция 120 ; если бит Z=1 то следующая инструкция пропускается 121 ;goto a1 122 ;movlw .70 ; Записать в регистр W константу 123 ;a2 movwf Reg_6 ; Скопировать из W в рег Reg_6 124 125 126 ; ----------------------------------------------------------------------- 127 mk5 btfsc PORTA,1 ; бит проверка включен ли 1 сегмент 128 goto s1 129 btfsc PORTA,2 ; бит проверка включен ли 2 сегмент 130 goto s2 131 btfsc PORTA,3 ; бит проверка включен ли 3 сегмент 132 goto s3 133 134 135 ;------------------------------------------------------------------------------- 136 ; Определение времени полупериода (закладка константы в регистр Sec). 137 ;------------------------------------------------------------------------------- 138 139 140 ;------------------------------------------------------------------------------- 141 ; Формирование на выводе RB0 еденичного уровня. 142 ;------------------------------------------------------------------------------- 143 meadr bsf PortB,7 ; Установить на выходе защелки RB7 еденицу. 144 nop ; Калибровочный машинный цикл. 145 nop ; -------------"-------------- 146 nop 147 nop 148 movf Reg_1,W ; копирование Reg_1 в W 149 call Zader1 ; переход к таблице Zader1 (полупериод) 150 movwf Sec ; Скопировать W в регистр Sec. 151 152 ; Включение диапазонов до 1 кГц и более 1 кГц. 153 154 movf Reg_1,W ; копирование Reg_1 в W 155 call Pdiap ; переход к таблице Pdiap 156 movwf Reg_3 ; Скопировать W в регистр Reg_3. 157 158 movf Reg_1,W ; копирование Reg_1 в W 159 call Pdiap1 ; переход к таблице Pdiap1 160 movwf Reg_4 ; Скопировать W в регистр Reg_4. 161 162 z1 decfsz Reg_3,F ; Дополнительная задержка полупериода, 163 goto z1 ; для достижения большого полупериода 164 decfsz Reg_4,F ; при низких частотах до 1 кГц. 165 goto z1 166 167 Pause_1 decfsz Sec,F ; Декремент содержимого регистра Sec с 168 goto Pause_1 ; помещением результата в этот же регистр. 169 ; Если этот результат не=0, то 170 ; осуществляется переход 171 ; в ПП Pause_1 ("закольцовка" в этой ПП). 172 ; Если =0, то программа исполняется далее. 173 174 ;------------------------------------------------------------------------------- 175 ; Определение времени полупериода (закладка константы в регистр Sec). 176 ;------------------------------------------------------------------------------- 177 movf Reg_1,W ; копирование Reg_1 в W 178 call Zader2 ; переход к подпрограмме Zader2 179 movwf Sec ; Скопировать W в регистр Sec. 180 ;------------------------------------------------------------------------------- 181 ; Формирование на выводе RB0 нулевого уровня. 182 ;------------------------------------------------------------------------------- 183 bcf PortB,7 ; Установить на выходе защелки RB7 ноль. 184 ; То же самое, что и для нулевого уровня, 185 ; только "закольцовка" происходит в ПП Pause_2. 186 187 ;movlw .250 ; Записать в регистр W константу 188 movf Reg_1,W ; копирование Reg_1 в W 189 call Pdiap ; переход к таблице Pdiap 190 movwf Reg_3 ; Скопировать W в регистр Reg_3. 191 ;movlw .51 ; Записать в регистр W константу 192 movf Reg_1,W ; копирование Reg_1 в W 193 call Pdiap1 ; переход к таблице Pdiap1 194 movwf Reg_4 ; Скопировать W в регистр Reg_4. 195 movwf Reg_5 ; Скопировать W в регистр Reg_5. 196 197 z2 decfsz Reg_3,F 198 goto z2 199 decfsz Reg_4,F 200 goto z2 201 202 Pause_2 decfsz Sec,F ; ------------------"------------------- 203 goto Pause_2 ; ------------------"------------------- 204 goto mk1 ; Переход на новый полный цикл программы. 205 206 ; -------------------------------------------------------------------------- 207 ;a1 movlw .10 ; Записать в регистр W константу 208 ; goto a2 209 ;a3 movlw .10 ; Записать в регистр W константу 210 ; goto a4 211 212 ;******************************************************************************* 213 ; Включение 1 сегмента и вывод в сегмент 214 s1 nop 215 nop 216 nop 217 nop 218 decfsz Reg_2 219 goto zad1 220 movf Reg_6,W ; копирование Reg_6 в W 221 ;Задержка отображения сегмента 222 movwf Reg_2 ; Скопировать W в рег Reg_2 (задерж) 223 bcf PORTA,1 224 bsf PORTA,2 ; включение 2 сегмента 225 goto zad11 226 zad1 nop 227 nop 228 nop 229 nop 230 nop 231 zad31 movf Reg_1,W ; копирование Reg_1 в W 232 call Segm1 ; переход к подпрограмме Segm1 233 movwf PortB 234 goto meadr 235 ;------------------------------------------------------------------------------- 236 ; Включение 2 сегмента и вывод в сегмент 237 s2 nop 238 nop 239 decfsz Reg_2 240 goto zad2 241 movf Reg_6,W ; копирование Reg_6 в W 242 ;Задержка отображения сегмента 243 movwf Reg_2 ; Скопировать из W в рег Reg_2 (задерж) 244 bcf PORTA,2 245 bsf PORTA,3 ; включение 3 сегмента 246 goto zad21 247 zad2 nop 248 nop 249 nop 250 nop 251 nop 252 zad11 movf Reg_1,W ; копирование Reg_1 в W 253 call Segm2 ; переход к подпрограмме Segm2 254 movwf PortB 255 goto meadr 256 ;------------------------------------------------------------------------------- 257 ; Включение 3 сегмента и вывод в сегмент 258 s3 decfsz Reg_2 259 goto zad3 260 movf Reg_6,W ; копирование Reg_6 в W 261 ;Задержка отображения сегмента 262 movwf Reg_2 ; Скопировать из W в рег Reg_2 (задерж) 263 bcf PORTA,3 264 bsf PORTA,1 ; включение 1 сегмента 265 goto zad31 266 zad3 nop 267 nop 268 nop 269 nop 270 nop 271 zad21 movf Reg_1,W ; копирование Reg_1 в W 272 call Segm3 ; переход к подпрограмме Segm3 273 movwf PortB 274 goto meadr 275 ;******************************************************************************* 276 Segm1 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 277 ; 278 retlw 0h ; цифра (50) 279 retlw 30h ; цифра1 (100) 280 retlw 79h ; цифра3 (300) 281 retlw 5Bh ; цифра5 (500) 282 retlw 5Fh ; цифра6 (600) 283 retlw 7Fh ; цифра8 (800) 284 retlw 0h ; цифра (1c) 285 retlw 0h ; цифра (3c) 286 retlw 0h ; цифра (5c) 287 retlw 0h ; цифра (6c) 288 retlw 0h ; цифра (8c) 289 retlw 30h ; цифра1 (10c) 290 retlw 30h ; цифра1 (12c) 291 retlw 30h ; цифра1 (15c) 292 retlw 30h ; цифра1 (18c) 293 retlw 6Dh ; цифра2 (20c) 294 295 ;******************************************************************************* 296 Segm2 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 297 ; 298 retlw 5Bh ; цифра (50) 299 retlw 7Eh ; цифра1 (100) 300 retlw 7Eh ; цифра3 (300) 301 retlw 7Eh ; цифра5 (500) 302 retlw 7Eh ; цифра6 (600) 303 retlw 7Eh ; цифра8 (800) 304 retlw 30h ; цифра (1c) 305 retlw 79h ; цифра (3c) 306 retlw 5Bh ; цифра (5c) 307 retlw 5Fh ; цифра (6c) 308 retlw 7Fh ; цифра (8c) 309 retlw 7Eh ; цифра1 (10c) 310 retlw 6Dh ; цифра1 (12c) 311 retlw 5Bh ; цифра1 (15c) 312 retlw 7Fh ; цифра1 (18c) 313 retlw 7Eh ; цифра2 (20c) 314 315 ;******************************************************************************* 316 Segm3 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 317 ; 318 retlw 7Eh ; цифра (50) 319 retlw 7Eh ; цифра1 (100) 320 retlw 7Eh ; цифра3 (300) 321 retlw 7Eh ; цифра5 (500) 322 retlw 7Eh ; цифра6 (600) 323 retlw 7Eh ; цифра8 (800) 324 retlw 0Dh ; цифра (1c) 325 retlw 0Dh ; цифра (3c) 326 retlw 0Dh ; цифра (5c) 327 retlw 0Dh ; цифра (6c) 328 retlw 0Dh ; цифра (8c) 329 retlw 0Dh ; цифра1 (10c) 330 retlw 0Dh ; цифра1 (12c) 331 retlw 0Dh ; цифра1 (15c) 332 retlw 0Dh ; цифра1 (18c) 333 retlw 0Dh ; цифра2 (20c) 334 335 ;******************************************************************************* 336 Zader1 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 337 ; 338 retlw .255 ; цифра (50) 339 retlw .230 ; цифра1 (100) 340 retlw .163 ; цифра3 (300) 341 retlw .44 ; цифра5 (500) 342 retlw .79 ; цифра6 (600) 343 retlw .57 ; цифра8 (800) 344 retlw .148 ; цифра (1c) 345 retlw .209 ; цифра (3c) 346 retlw .120 ; цифра (5c) 347 retlw .98 ; цифра (6c) 348 retlw .70 ; цифра (8c) 349 retlw .53 ; цифра1 (10c) 350 retlw .42 ; цифра1 (12c) 351 retlw .31 ; цифра1 (15c) 352 retlw .24 ; цифра1 (18c) 353 retlw .20 ; цифра2 (20c) 354 355 ;******************************************************************************* 356 Zader2 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 357 ; 358 retlw .250 ; цифра (50) 359 retlw .225 ; цифра1 (100) 360 retlw .158 ; цифра3 (300) 361 retlw .39 ; цифра5 (500) 362 retlw .74 ; цифра6 (600) 363 retlw .52 ; цифра8 (800) 364 retlw .143 ; цифра (1c) 365 retlw .204 ; цифра (3c) 366 retlw .115 ; цифра (5c) 367 retlw .93 ; цифра (6c) 368 retlw .65 ; цифра (8c) 369 retlw .48 ; цифра1 (10c) 370 retlw .37 ; цифра1 (12c) 371 retlw .26 ; цифра1 (15c) 372 retlw .19 ; цифра1 (18c) 373 retlw .15 ; цифра2 (20c) 374 375 ;******************************************************************************* 376 ;Perecl addwf PCL,F ; Содержимое счётчика PCL=PCL+W 377 ; 378 ; retlw .50 ; цифра (50) 379 ; retlw .50 ; цифра1 (100) 380 ; retlw .50 ; цифра3 (300) 381 ; retlw .50 ; цифра5 (500) 382 ; retlw .50 ; цифра6 (600) 383 ; retlw .50 ; цифра8 (800) 384 ; retlw .50 ; цифра (1c) 385 ; retlw .60 ; цифра (3c) 386 ; retlw .80 ; цифра (5c) 387 ; retlw .80 ; цифра (6c) 388 ; retlw .100 ; цифра (8c) 389 ; retlw .100 ; цифра1 (10c) 390 ; retlw .100 ; цифра1 (12c) 391 ; retlw .130 ; цифра1 (15c) 392 ; retlw .150 ; цифра1 (18c) 393 ; retlw .150 ; цифра2 (20c) 394 395 ; ****************************************************************************** 396 Pdiap addwf PCL,F ; Содержимое счётчика PCL=PCL+W 397 ; 398 retlw .250 ; цифра (50) 399 retlw .250 ; цифра1 (100) 400 retlw .250 ; цифра3 (300) 401 retlw .250 ; цифра5 (500) 402 retlw .250 ; цифра6 (600) 403 retlw .250 ; цифра8 (800) 404 retlw .250 ; цифра (1c) 405 retlw .1 ; цифра (3c) 406 retlw .1 ; цифра (5c) 407 retlw .1 ; цифра (6c) 408 retlw .1 ; цифра (8c) 409 retlw .1 ; цифра1 (10c) 410 retlw .1 ; цифра1 (12c) 411 retlw .1 ; цифра1 (15c) 412 retlw .1 ; цифра1 (18c) 413 retlw .1 ; цифра2 (20c) 414 ; ****************************************************************************** 415 Pdiap1 addwf PCL,F ; Содержимое счётчика PCL=PCL+W 416 ; 417 retlw .51 ; цифра (50) 418 retlw .25 ; цифра1 (100) 419 retlw .8 ; цифра3 (300) 420 retlw .5 ; цифра5 (500) 421 retlw .4 ; цифра6 (600) 422 retlw .3 ; цифра8 (800) 423 retlw .2 ; цифра (1c) 424 retlw .1 ; цифра (3c) 425 retlw .1 ; цифра (5c) 426 retlw .1 ; цифра (6c) 427 retlw .1 ; цифра (8c) 428 retlw .1 ; цифра1 (10c) 429 retlw .1 ; цифра1 (12c) 430 retlw .1 ; цифра1 (15c) 431 retlw .1 ; цифра1 (18c) 432 retlw .1 ; цифра2 (20c) 433 434 435 end ; Директива конца программы (всегда 436 ; последняя снизу). 437
Прошивка проводиться через программатор Mini Pro TL866A с помощью программы WizardProg87
Файлы со схемой, разводкой платы и кодом прошивки можно
скачать с яндекса.
Напишите отзыв.
Схема генератора