При разработке переключателя линейного входа, я руководствовался двумя аспектами.
Первое – в этой разработке изучал способ записи и чтения информации из энергонезависимой памяти контроллера.
Второе – в то время я собирал аудио усилитель и была необходимость сделать устройство управления линейными входами усилителя.
В схеме не указано исполняющее устройство (устройство разрабатывалось и собиралось в спешке), я использовал 3 реле, катушки которых подключены через транзисторы к портам RB0, RB1, RB2 пины 6, 7, 8 соответственно. Реле с двумя группами контактов (при использовании стерео-режима). Порты OSC1, OSC2, MCLR пины 16, 15, 4 подключены штатным способом (подсмотреть можно на схеме переключателя световых эффектов).
Использование схемы простое. При нажатии на кнопку включается второй вход, а первый и третий отключается, при последующем нажатии включится третий, отключаться первый и второй, третье нажатие на кнопку приведёт к включению первого и отключения второго и третьего входов. Действующий вход индицируется светодиодом. При каждом нажатии в память контроллера записывается состояние портов RB0, RB1, RB2, RB5, RB6, RB7. При отключении питания контроллера информация в памяти остаётся. При новом включении контроллер возьмёт информацию с памяти и запишет в соответствующие порты.
На деле, в моём случае, если усилитель работал от второго входа до выключения, то при включении он подключиться ко второму входу. Удобно ненужно лишний раз тыкать кнопку :-) .
Прошивка для PIC контроллера написана на ассемблере в среде разработки MPLAB X IDE.
1 LIST P=PIC16F84A 2 __CONFIG 03FF1H 3 4 STATUS equ 03h 5 PORTA equ 05h 6 TRISA equ 05h 7 PORTB equ 06h 8 TRISB equ 06h 9 10 INTCON equ 0Bh ; регистр запрета прерывания 11 ; Константы ------------------------------------------------- 12 W equ 0 13 F equ 1 14 C equ 0 15 Z equ 2 16 17 PCL equ 02h 18 19 ; определение регистров для работы с памятью 20 EEData equ 08h ; EEPROM - данные 21 EECon1 equ 08h ; EECON1 - банк 1 22 EEAdr equ 09h ; EEPROM - адрес 23 EECon2 equ 09h ; EECON2 - банк 2 24 ;------------------------------------------------------------ 25 Reg_1 equ 0Ch 26 Reg_2 equ 0Dh 27 Reg_3 equ 0Eh 28 Reg_4 equ 0Fh 29 30 ; ==================================================================== 31 org 2100h ; обращение к EEPROM памяти 32 DE 1 ; предварительная запись 33 ; -------------------------------------------------------------------- 34 35 org 0 ; начало программы 36 ; подготовка --------------------------------------------------------- 37 bsf STATUS,5 ; переход в банк 1 38 movlw 1Fh ; запись в аккумулятор W 39 movwf TRISA ; порт А вход 40 clrf TRISB ; порт В выход 41 bcf STATUS,5 ; переход в банк 0 42 ; чтение из памяти и вывод в порт В ---------------------------------- 43 call Read ; чтение числа(подпрограмма Read) 44 movf Reg_4,W ; запись Reg_4 в аккумулятор W 45 call TABLE ; переход к подпрограмме TABLE 46 movwf PORTB ; запись в порт В из W 47 ; отслеживание нажатия кнопки (нажатие с защелкой) ------------------- 48 mk1 btfsc PORTA,4 ; бит-проверка на 0 49 goto mk1 50 mk2 btfss PORTA,4 ; бит-проверка на 1 51 goto mk2 52 call Pause ; пауза 200 мС (200000 циклов) 53 ; проверка на 3 (крайнее значение), увелечение значения регистра 54 bcf STATUS,C ; опускаем флаг С в ноль 55 movlw .253 ; (255-3)+1=253 __> W 56 addwf Reg_4,W ; (Reg_4)+W (значение остаётся в W) 57 btfss STATUS,C ; делаем проверку С-флага 58 ; если бит С=0 то выполняется следующая инструкция 59 ; если бит С=1 то следующая инструкция пропускается 60 goto mk4 61 goto mk3 62 mk4 incf Reg_4,F ; увеличить значение на 1 и сохранить 63 goto mk5 64 mk3 movlw .1 65 movwf Reg_4 66 mk5 movf Reg_4,W ; копирование Reg_4 в W 67 call TABLE 68 movwf PORTB 69 call Pause 70 call Write ; запись числа 71 goto mk1 72 73 ; ========================================================================= 74 ;delay = 200'000 machine cycles 75 Pause movlw .186 76 movwf Reg_1 77 movlw .4 78 movwf Reg_2 79 movlw .2 80 movwf Reg_3 81 wr decfsz Reg_1, F 82 goto wr 83 decfsz Reg_2, F 84 goto wr 85 decfsz Reg_3, F 86 goto wr 87 nop 88 89 ; ========================================================================= 90 TABLE addwf PCL,F ; содержимое счётчика PCL=PCL+W 91 retlw 0h ; 0 92 retlw 21h ; 1 93 retlw 42h ; 2 94 retlw 84h ; 3 95 96 ; ========================================================================= 97 ; запись данных в энергонезависимую память EEPROM (ПЗУ) 98 Write clrf INTCON ; Глобальный запрет прерываний 99 clrw ; обнулить W, т.е. установить адрес "0" 100 movwf EEAdr ; Скопировать W в регистр EEAdr 101 movf Reg_4,W ; Скопировать данные из Reg_4 в регистр W 102 movwf EEData ; Скопировать W в EEPROM 103 bsf STATUS,5 ; Переход в первый банк. 104 bsf EECon1,2 ; Разрешить запись. 105 movlw 55h ; Обязательная 106 movwf EECon2 ; процедура 107 movlw .170 ; при записи. 108 movwf EECon2 ; ----"---- 109 bsf EECon1,1 ; ----"---- 110 bcf EECon1,4 ; Сбросить флаг прерывания по окончании 111 bcf STATUS,5 ; Переход в нулевой банк. 112 return 113 114 ;========================================================================== 115 ; чтение данных из энергонезависимой памяти EEPROM (ПЗУ) 116 Read bcf STATUS,5 ; Переход в нулевой банк. 117 clrw ; обнулить W, т.е. установить адрес "0" 118 movwf EEAdr ; Скопировать W в регистр EEAdr 119 bsf STATUS,5 ; Переход в первый банк. 120 bsf EECon1,0 ; Инициализировать чтение. 121 bcf STATUS,5 ; Переход в нулевой банк. 122 movf EEData,W ; Скопировать в W из EEPROM 123 movwf Reg_4 ; Скопировать из W в регистр Reg_4 124 return 125 126 end ; конец программы
Прошивка проводиться через программатор Mini Pro TL866A с помощью программы WizardProg87
Файлы со схемой и кодом прошивки можно скачать с яндекса.
Напишите отзыв.
Схема переключателя