Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > микроконтроллер pic12f629 |
Автор: БОЕК1 29.6.2019, 22:40 | ||
помогите кто-нибудь переписать код ассемблера на си, микроконтроллер pic12f629![]() ![]() list p = 12f629 __config 01FC4h ;*** Переменные ****************************************** CBLOCK 0x20 ; Начальный адрес блока пользовательской памяти T1 T2 ENDC ;**** Константы / Адреса регистров ************************ Status equ 03h ; выбор банка Cmcon equ 19h ; компаратор (банк 0) OSCCAL equ 10h ; хранение калибровочной константы (банк 1) INTCON equ 0Bh ; разрешение(1)/запрет(0) прерываний (любой банк) IOCB equ 16h ; регистр разрешения прерываний по GP0...GP5 INDF equ 0h ; регистр косвенной адресации FSR equ 04h ; регистр адреса при косвенной адресации GPIO equ 05h ; управление защелками порта (банк 0) TrisIO equ 05h ; выбор направления работы выводов порта (банк 1) ;********************************************************* org 0 goto start org 4 ;********************************************************* ;-— Смотрим, откуда прерывание —- btfss GPIO,3 ; если кнопка нажата - проп.следующ.команду goto priem ;-— Инвертировать светодиод —- knopka movlw .16 ; 00010000 - маска для инверсии сост-я светодиода xorwf GPIO,1 ; инвертируем состояние светодиода goto exit ;-— Если сигнал с приёмника —- priem btfsc GPIO,2 ; если на входе ILMS ноль - пришёл сигнал goto exit ;-— Проверяем, не помеха ли это —- movlw .4 movwf T1 ; кол-во циклов проверки timer movlw .25 movwf T2 ; таймер на каждую проверку time_cikl nop decfsz T2,1 goto time_cikl btfsc GPIO,2 ; если на входе 0 - подтвержд-ся сигнал и проп.выход goto exit decfsz T1,1 goto timer ;-— Если разрешено, то инвертировать состояние оптрона —- btfsc GPIO,4 ; если светодиод вкл. - пропустить следующ.команду goto exit movlw .1 ; 00000001 xorwf GPIO,1 ; после этого выход оптрона инвертируется exit call pause ; пауза bcf INTCON,0 ; сбросить флаг прерываний retfie ;********************************************************* ;*** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ************************ ;****** Калибровка Генератора **************************** start bsf Status,5 Call 3FFh ; Загрузить калибровочную константу в w movwf OSCCAL ;*** Установка направления работы ног ******************** bcf Status,5 ; перейти в банк 0 clrf GPIO ; инициализация защелок (все выходы равны нулю) movlw .7 ; биты 0..2 поднять movwf Cmcon ; компарат.выключен, GP0,GP1,GP2 - цифров.вх/вых bsf Status,5 ; Перейти в 1-й банк movlw b'00101100' ; настройка входов/выходов movwf TrisIO bcf Status,5 ; перейти в нулевой банк ;*** Включить оптрон и погасить светодиод **************** bsf GPIO,0 ; поднять нулевой бит (включить свет) nop bsf GPIO,4 ; поднять 4-й бит (выключить светодиод) ;*** Разрешить прерывания на входах GP2, GP3 ************* bsf Status,5 ; перейти в первый банк movlw .12 ; .12 = 00001100 movwf IOCB ; разрешить прерыв.на GP2, GP3, на остальных - нет bcf Status,5 ; Перейти в 0-й банк movlw .8 ; .8 = 00001000 movwf INTCON ; разрешить прерывание от GPIO bsf INTCON,7 ; разрешить немаскированные прерывания ;------------------— work nop ; ждём прерывание goto work ;------------------— pause movlw .100 movwf T1 cikl1 movlw .255 movwf T2 cikl2 nop nop decfsz T2,1 goto cikl2 decfsz T1,1 goto cikl1 return end ;---------------------------------------------------------
|
Автор: vol4ek 3.7.2019, 00:11 | ||||
коряво конечно но тебе пойдет.
компилятор xc8 v2.05 |
Автор: vol4ek 3.7.2019, 11:46 | ||
было поздно я забыл одну проверку. функция прерываний должна быть такая
|