Данная разработка так и не была реализована в железе, но всё же в эмуляторе работала, это была последняя работа с 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

 

Файлы со схемой, разводкой платы и кодом прошивки можно

скачать с яндекса.

Напишите отзыв.

Схема генератора

Генератор фиксированных звуковых частот на PIC