[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Прошу посмотреть код и дать советов (но не по голове)
Я накрапал первую програмку для 12с508 и если есть у кого
несколько минут, прошу посмотреть - праильно ли и может
что-то лучше поменять.
Функции выполняет простейшие - хочется чтоб работало.
Сергей.
;****************************************************************************
;
; к GP0 и GP1 - через резисторы подключены LED на +5 в
; к GP4 и GP5 - через резисторы подключены LED на "землю"
;
; т.е. Выводы GP5 и GP4 - инвертир. по отношению к GP0 и GP1
;
; к GP3 подключен через рез 300 оМ - коллектор транз ключа
;
; "Нажатие кнопки" - транз ключ замыкает на "землю" GP3
;
; "Кнопка отпущена" - транз ключ закрыт - пул-ап на GP3 создает лог 1.
;
;
; ЗАДАЧА - при "нажатии кнопки" должны загораться свтодиоды (LEDs)
; и гореть еще 50 секунд после последнего "отпускания кнопки"
;
;****************************************************************************
; Эту байду взял из заготовки MPLAB
list p=12c508
include "p12c508.inc"
#define __12C508
__config _WDT_ON & _IntRC_OSC & _MCLRE_OFF & _CP_ON
; Дальше сам ваял
;********* Записываем число в GPIO, чтобы при включении выходных буферов
;********* на выводах появились нужные уровни
NewStart MOVLW 0x07 ; записываем 07h в W
MOVWF 06 ; теперь в GPIO ( 0000 0111 = 07h )
;********* Установим направление работы выводов:
;********* Выходы: GP5 GP4 GP2 GP1 GP0
;********* Вход: GP3
MOVLW 0x08 ; GP3 вход - надо записать в
TRIS GPIO ; TRIS число 0000 1000 = 08h
; Теперь в окне просмотра MPLAB в рег. GPIO появилось число 00110111
;********* строки для включения пулапа на - GP3
MOVLW 0x80 ; для вкл пулапа - GP3 GP1 GP0 - надо записать в
OPTION ; OPTION например '1000 0000' - главное bit6=0
; Тепрь будем ждать "нажатия кнопки" т.е. замыкания на землю GP3
; и появления на выводе низкого уровня
LoopON CLRWDT
NOP ;просто по-приколу
NOP
BTFSC GPIO,3 ; Если на GP3 ноль, то перескак через GOTO LoopON
GOTO LoopON
; Надо сделать "нули" на GP0 GP1 и "1" на GP5 GP4 -
; т.е. включить Светодиоды
MOVLW 0x34 ; записываем 34h в W
MOVWF 06 ; теперь 34h в регистр GPIO ( 0011 0100 )
; Тепрь будем ждать "1" на GP3 (т.е. отпускания кнопки) и не
; забывать сбрасывать собаку
LoopOFF CLRWDT
NOP
NOP
BTFSS GPIO,3 ; Если на GP3 единица, то перескак GOTO и идем дальше
GOTO LoopOFF
; Тепрь надо отсчитать задержку и выключить LEDs, при этом надо проверять
; бит GP3 и если он опять обнулится (опять кнопку нажали!) надо снова перейти
; в ожидание "1" на GP3 - т.е. перейти на LoopOFF
; Ну и про собаку незабываем конечно
;*********** Процедура отсчета времени - около 50 сек
;*********** Загружаем число для определения количества повторов отсчета
;*********** в произвольную ячейку памяти, например 1B
MOVLW 0xFF ; 255 в W *********************************
MOVWF 0C ; 255 в 0C - регистр хранит число раз вызова Delay1
; 255 x 196.6 mS = римерно 50 секунд
Loop1 CLRWDT
CALL Delay1 ; вызываем отсчет 391.68 mS и по истечении возвращаемся
; сюда попадаем после отсчета очередных - 392 mS
DECFSZ 0C ; делаем цикл Loop1 столько раз, сколько указано в 0C
; Инстр. DECFSZ 0C - уменьшаем на единицу число в регистре (здесь - 0C)
; и идем на следующую инструкцию. Если результат 0 то перескакиваем
; через GOTO Loop1 (прыгнем на - CLRWDT).
GOTO Loop1
CLRWDT ; Успокоили пса
; Время отсчитано - надо выключать LEDs
GOTO NewStart ; пойдем в начало - там как раз такое проделывается
; прцедура Delay1 - примерно 391680 uS или 391.68 mS
Delay1 MOVLW 0xFF ; 255 раз прокрутим
MOVWF 1A ; в ячейку RAM по адресу 1A сохраним 255
MOVWF 1B ;Теперь число FF помещ в регистр RAM 1B
DelX CLRWDT
NOP
NOP
DECFSZ 1B ;255 декрементов - на 256 раз перескочим GOTO
GOTO DelX ;по 6 uS * 255 раз DelX = примерно 1530 uS будем здесь
MOVLW 0xFF ; 255 в W
MOVWF 1B ; в ячейке RAM 1B востановим число 255
CLRWDT ; Успокоили пса
; проверим осталась ли единица на GP3 (не нажата ли кнопка) ?
; проверка происходит примерно раз в 1.53 mS
BTFSS GPIO,3 ; Если на GP3 1, то перескак. GOTO и дальше считаем время
GOTO LoopOFF ; Если на GP3 0, то идем ждать высокого уровня на GP3
; Сюда попадаем если на GP3 по-прежнему есть 1
DECFSZ 1A
GOTO DelX
RETLW 0x00 ; возврат в место вызова Delay1
;****************************************************************************
END ; Все конееец! УФФФФ!!!
E-mail: info@telesys.ru