[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено AK 16 декабря 2001 г. 09:24
В ответ на: Прошу посмотреть код и дать советов (но не по голове) отправлено Серега 16 декабря 2001 г. 02:37

В принципе все ничего, но полезно обратить внимание на стиль... При 50сек задержке защиту от дребезга можно и не вводить, но уж для демонстрации...
Еще, в конфе рекомендую использовать команды pre и /pre в угловых скобках, тогда HTML не сожрет форматирование

; к GP0 и GP1 - через резисторы подключены LED на +5 в
; к GP4 и GP5 - через резисторы подключены LED на "землю"
; т.е. Выводы GP5 и GP4 - инвертир. по отношению к GP0 и GP1
; к GP3 подключен через рез 300 оМ - коллектор транз ключа

(АК)------------------------------------
В "Ом" буква О большая, м - маленькая. Собственно, правило очень простое: если единица измерения названа в честь ученого, то она пишется с большой буквы.
-------------------------------------(AK)

; "Нажатие кнопки" - транз ключ замыкает на "землю" GP3
; "Кнопка отпущена" - транз ключ закрыт - пул-ап на GP3 создает лог 1.
;
; ЗАДАЧА - при "нажатии кнопки" должны загораться свтодиоды (LEDs)
; и гореть еще 50 секунд после последнего "отпускания кнопки"
;
;*********************************************************************
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

(АК)--------------------------------------
; Я обычно вначале определяю константы, чтоб не забыть что
; это константа, обозначаю их с суффиксом подчеркивания

OPTION_ equ b'10000000' ; для портов удобнее расписывать двоичное значение
TRIS_ equ b'00001000' ; GP3-ввод, остальные - вывод
LEDS_OFF_ equ b'00000111' ; значение порта по умолчанию, все
; светодиоды выключены
LEDS_ON_ equ b'00110100' ; все светодиоды выключены
LED1s equ 0 ; out: LED на +5
LED2s equ 1 ; out: LED на +5
; out - не используется
BTN equ 3 ; in: кнопка
LED3g equ 4 ; out: LED на землю
LED4g equ 5 ; out: LED на землю

; А потом определяю имена переменных, чтобы не заморачиваться
ж с абсолютными адресами
CNT equ 0Ch ; счетчик
WRK equ 0Dh ; рабочая ячейка
SUBCNT1 equ 0Eh ; счетчик для подпрограмм
SUBCNT2 equ 0Eh ; еще счетчик для подпрограмм

; ********* Начало программы ****************
org 0 ; это для определенности :-)
_NewStart ; все метки начинаю с префикса подчеркивания
movlw LEDS_OFF_ ; грузим константу в порт
movwf GPIO ; используя символический адрес порта
movlw TRIS_ ; задаем направление
tris ;
movlw OPTION_ ; задаем пулл-ап
option ;
goto _LoopIdle ; прыгаем на главную программу

; ********************
; *** Подпрограммы ***
; ********************
; д.б. в младших адресах, так что сдвинем главную программу
; "наверх", а сюда вклиним подпрограммы
; *** Малые задержки (в расчете на кварц 4МГц)
; в этой проге они не нужны, но вообще очень полезны,
; пригодится в будущем
_Dly20 goto $+1 ; 20us, прыгаем на _Dly18
_Dly18 goto $+1 ; 18us
_Dly16 goto $+1 ; 16us
_Dly14 goto $+1 ; 14us
_Dly12 goto $+1 ; 12us
_Dly10 goto $+1 ; 10us
_Dly8 goto $+1 ; 8us
_Dly6 goto $+1 ; 6us
_Dly4 retlw 0 ; сall=2us, retlw=2us, в сумме 4us

; *** Большие задержки (можно и по-другому, дело вкуса)
; ***********
; *** 5мс ***
; ***********
_Dly5ms movlw .250 ; десятичное число 250
movwf SUBCNT1 ; в счетчик
_Dly5ms_loop ; время цикла 20мкс
clrwdt ; 1мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
goto $+1 ; задержка 2мкс
decfsz SUBCNT1 ; 1мкс
goto _Dly5ms_loop ; 2мкс
retlw 0 ; 250*20мкс+x ~5мс

; ***************************
; *** переменные задержки ***
; ***************************
; W задает задержку в 10-мс тиках
_DlyX movwf SUBWRK2 ; сохраняем задержку в счетчике
_DlyX_loop
call _Dly5ms ; 5ms
call _Dly5ms ; 5ms
decfsz SUBWRK2 ; считаем тики
goto _DlyX_loop ; ждем
retlw 0 ;
--------------------------------------(AK)

; Тепрь будем ждать "нажатия кнопки" т.е. замыкания на землю 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 )

(АК)--------------------------------------
_LoopIdle ; имена меткам лучше давать осмысленные
clrwdt ;
nop ; просто по-приколу :-)
nop ;
btfsc PORT,BTN ; кнопка нажата?
goto _LoopIdle ; нет, ждем-с...
movlw 5 ; защита от дребезга -
call _DlyX ; 50мс задержка
btfsc PORT,BTN ; кнопка нажата?
goto _LoopIdle ; нет, это дребезг, ждем-с...
movlw 5 ; защита от дребезга -
call _DlyX ; 50мс задержка
btfsc PORT,BTN ; кнопка нажата?
goto _LoopIdle ; нет, это дребезг, ждем-с...

; *** кнопка нажата
_LoopKeyOn
movlw LEDS_ON_ ; включаем все светодиоды
movwf GPIO ; в цикле это не повредит :-)
movlw .250 ; 0.2сек*250=50сек
movwf CNT ; зарядили счетчик

; *** проверять будем через каждые 100мс
_ChkBtn
btfss GPIO,BTN ; кнопка отпущена?
goto _ChkBtn ; нет
movlw .10 ; 100мс
call _DlyX ; задержка
btfss GPIO,BTN ; кнопка отпущена?
goto _LoopKeyOn ; нет
movlw .10 ; 100мс
call _DlyX ; задержка
decfsz CNT ; 50сек задержка закончилась?
goto _ChkBtn ; нет еще

; *** Задержка закончилась, выключаем LEDs
movlw LEDS_OFF_ ;
movwf GPIO ;
goto _LoopIdle ; ждем нового нажатия

; писАл наспех, могут быть ляпы... :-)



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru