Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Помогите разобраться с маленьким кодиком


Автор: Pro_BD 8.6.2004, 10:02
Привет всем, в данный момент я учусь писать программы для микроконтроллеров. Пока что я ушел не слишком далеко от приметивных познаний но я в процессе так сказать.
Проблема заключаеться вот в чем. Есть устройство каторое при нажатии на кнопку зажигает свето - деод. С такой переодичностью: нажали 1 раз свето деод включился и мигает, нажали (быстро) (он тоже должен включиться) 2 раза деод мигает с более длинной переодичностью относительно первого нажатия, нажали и подержали кнопку 4 сек. все деод выключаеться.
Далее, проблема:
Подскажите как выразить вот эти вот нажатия в моем коде ? тоесть если при нажатие на кнопку мы проводим опрос порта к которому подключена КН, и от туда падают b'11111111' то как делать их проверку и тд и тп. Код прилогаеться
ЗЫ. Плз подскажите если кому не лень.
Код
;write by BD
list p=16f84a
__CONFIG b'11111111110011'
;=======описание операционных регистров
TMRO EQU 01h
PC EQU 02h
STATUS EQU 03h
FSR EQU 04h
;=======ригистры in\out
CNTRLPORT EQU 05h
DATAPORT EQU 06h
;======ячейки ОЗУ
SCRATCH EQU CED
;DIGIT EQU DED
;======биты ригистра STATUS
CED EQU 0h
DC EQU 1h
Z EQU 2h
PD EQU 3h
TO EQU 4h
RP EQU 5h
;======управляющие ргистры
TRISA EQU 85h
TRISB EQU 86h
;========слова инициализации для портов in\out

INITA EQU 0h
INITB EQU 0h

ORG 0
 GOTO BEGIN
ORG 100h
BEGIN:
;============= A  Вход  =============
BCF STATUS,RP  
CLRF CNTRLPORT
MOVLW INITA
BCF STATUS,RP
MOVWF TRISA


;=======инициализация порта В выход =============
BCF STATUS,RP
CLRF DATAPORT
MOVLW INITB
BSF STATUS,RP
MOVWF TRISB
BCF STATUS,RP


;=========говорим, зажгись

;===========================================ГОРИМ 1 сек. Гаснем 3 сек.===========================
F1:      
bcf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
bsf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
CALL Smile

;=========================================ГОРИМ 1 сек. гаснем 3 сек.===================================
F2:
bcf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
bsf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
CALL Smile

;========================================= Не че не делаем =========================================
F3:
bcf DATAPORT,0
CALL delay
bsf DATAPORT,0
CALL delay
CALL Smile


i equ 20h
j equ 21h
q equ 22h
del1 equ 0Ah
del2 equ 14h
del3 equ 7Fh

delay:
MOVLW del1;W=del1 1 цикл
MOVWF i;i=W заполняем счетчик внешнего цикла 1 цикл
m3:  MOVLW del2;W=del2 1 цикл
MOVWF j;j=W заполняем счетчик среднего цикла 1 цикл
m2:  MOVLW del3;W=del3 1 цикл
MOVWF q;q=W заполняем счетчик внутрен. цикла 1 цикл
m1:  DECFSZ q,1;q=q-1 и если q==0 пропускаем сл. команду 1(2)цикла
GOTO m1
DECFSZ j,1;j=j-1 и если j==0 пропускаем сл. команду 1(2)цикла
GOTO m2
DECFSZ i,1;i=i-1 и если i==0 пропускаем сл. команду 1(2)цикла
GOTO m3
RETURN
;+=========+++++================================================  Опрашиваем порт=====

;r equ 30h  
;w equ 31h  
;e equ 32h
;dell1 equ 0FFh
;dell2 equ b'11111111'
;dell3 equ 0FFh

Smile:
addlw 0FFh  ; нужно ли это, я это у видел в контесте другово кода где говорится что тут мы опрашиваем порт  
btfss CNTRLPORT,b'00000001'
goto F1
btfss CNTRLPORT,b'00000010'
goto F2
 btfss CNTRLPORT,b'00000100'
goto F3
goto Smile



END

З.Ы. после метки Smile у меня идет (или должен идти ) опрос порта, вот там на мой взгляд я что то напут, подкаректируйте меня.

Автор: Sardar 8.6.2004, 18:26
Цитата
CALL Smile

У тебя стек не резиновый, ты возвращаешся из Smile прыжком оставляя в стеке адрес возврата. Прыгай по адресу.
Цитата
addlw 0FFh; нужно ли это

Нет, смысла от этого нет, разве извращенным путем C и DC биты в статусе изменять.
Код
MOVLW INITA
BCF STATUS,RP
MOVWF TRISA

Напутал с инструкцией, BSF STATUS,RP
Цитата
F3: bcf DATAPORT,0 CALL delay bsf DATAPORT,0 CALL delay CALL Smile

Вместо битов ставить, лучше бы NOP'ом "ничего не делал"
Цитата
delay:

Пауза очень не красивая, можно и таймер использовать.
Цитата
и от туда падают b'11111111' то как делать их проверку и тд и тп. Код прилогаеться

Сейчас ты с порта A считываешь число. Для этого нужна еще и внешняя логика. Используй прерывания для отлова нажатия кнопки.

Автор: Darked 8.6.2004, 21:19
Давно на асме не писал, аж в глазах зарябило biggrin.gif Мой тебе совет, если знаком с Си, то поставь себе сишный компилер HT-PICC.
А код сейчас почитаю... smile.gif

Автор: Pro_BD 9.6.2004, 07:08
2 Sardar
Код
list p=16f84a
__CONFIG b'11111111110011'
;=======описание операционных регистров
TMRO EQU 01h
PC EQU 02h
STATUS EQU 03h
FSR EQU 04h
;=======ригистры in\out
CNTRLPORT EQU 05h
DATAPORT EQU 06h
;======ячейки ОЗУ
SCRATCH EQU CED
;DIGIT EQU DED
;======биты ригистра STATUS
CED EQU 0h
DC EQU 1h
Z EQU 2h
PD EQU 3h
TO EQU 4h
RP EQU 5h
;======управляющие ргистры
TRISA EQU 85h
TRISB EQU 86h
;========слова инициализации для портов in\out

INITA EQU 0h
INITB EQU 0h

ORG 0
 GOTO BEGIN
ORG 100h
BEGIN:
;============= A  Вход  =============
BCF STATUS,RP
CLRF CNTRLPORT
MOVLW INITA
BSF STATUS,RP
MOVLW 0ffh
MOVWF TRISA
BCF STATUS,RP
;=======инициализация порта В выход =============
BCF STATUS,RP
CLRF DATAPORT
MOVLW INITB
BSF STATUS,RP
MOVWF TRISB
BCF STATUS,RP


;=========говорим, зажгись

;===========================================ГОРИМ 1 сек. Гаснем 3 сек.===========================
F1:      
bcf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
CALL delay
bsf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
GOTO Smile



;=========================================ГОРИМ 1 сек. гаснем 3 сек.===================================
F2:
bcf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
bsf DATAPORT,1
CALL delay
CALL delay
CALL delay
CALL delay
GOTO Smile


i equ 20h
j equ 21h
q equ 22h
del1 equ 0Ah
del2 equ 14h
del3 equ 7Fh

delay:
MOVLW del1;W=del1 1 цикл
MOVWF i;i=W заполняем счетчик внешнего цикла 1 цикл
m3:  MOVLW del2;W=del2 1 цикл
MOVWF j;j=W заполняем счетчик среднего цикла 1 цикл
m2:  MOVLW del3;W=del3 1 цикл
MOVWF q;q=W заполняем счетчик внутрен. цикла 1 цикл
m1:  DECFSZ q,1;q=q-1 и если q==0 пропускаем сл. команду 1(2)цикла
GOTO m1
DECFSZ j,1;j=j-1 и если j==0 пропускаем сл. команду 1(2)цикла
GOTO m2
DECFSZ i,1;i=i-1 и если i==0 пропускаем сл. команду 1(2)цикла
GOTO m3
RETURN
;+=========+++++================================================  Опрашиваем порт=====

;r equ 30h  
;w equ 31h  
;e equ 32h
;dell1 equ 0FFh
;dell2 equ b'11111111'
;dell3 equ 0FFh

Smile:
btfss CNTRLPORT,b'00000001'
goto F1
btfss CNTRLPORT,b'00000010'
goto F2
goto Smile
END



P.S. Таймером и перехватом прерываний пока что пользоваться не умею писал так, что знал
ЗЫ. Так код лучше ???

Автор: Pro_BD 9.6.2004, 07:19
Цитата
Пауза очень не красивая, можно и таймер использовать.

Гм hmmm.gif , а ты можешь показать как пользоваться таймером, например сделай с помощью таймера туже задержку что и уменя, если конечно не тяжело.


Народ подскажите книгу или ссылочку, на такую тему как у меня. Типа таймеры, прерывания ....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)