[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]

Отправлено Серега 16 декабря 2001 г. 02:37

Прошу посмотреть код и дать советов (но не по голове)

Я накрапал первую програмку для 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