Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.12.2005, 14:21
|
|
Kristina
Гость
|
Pic 16f84 - сигналы поворота и сигнал СТОП
Здравствуйте!
Помогите, пожалуйста, дописать/написать программу на pic 16f84:
нужно устройство для управления сигналами поворота и сигналами «СТОП» автомобиля:
- при включении поворота направо – на линейке светодиодов должны включиться 2 светодиода и переключаться, создавая эффект движения включенных светодиодов от центра вправо
- при включении поворота налево – на линейке светодиодов должны включиться 2 светодиода и переключаться, создавая эффект движения включенных светодиодов от центра влево
- при включении сигнала «СТОП» должны загореться все светодиоды от центра к краям.
Схему устройства и блоксхему программы начетрила, посмотреть можно здесь:
Вот моя программка:
Код:
|
; Полоса светодиодов
list P=16f84
include ‹p16f84.inc›
__config b`00000111`
INPUT_A equ b `00011100`
INPUT_B equ b `11111111`
org 0; Указатель для ассемблера - последующий код начинается с нулевого адреса
goto START
; Основная программа
START:
; Инициализация и начальные условия
clrf PORTA ; Очистка порта А
clrf PORTB ; Очистка порта B
bsf STATUS, PRO ; Переход в банк 1
movlw INIT_A ; Настраиваем порт A0
movwf TRISA ; Входы RA2, RA3, RA4 остальные выходы
movlw INIT_B ; Настраиваем порт B0
movwf TRISB ; Все выходы
; Рабочая часть
LOOP:
btfsc PORTA, 2 ; если заданый бит сброшен, то пропустить команду
goto L1 ; если на порт RA2 пришел сигнал, то переходим к обработке левого поворота
btfsc PORTA, 3
goto R1
btfsc PORTA, 4
goto S1
goto LOOP
; Левый поворот
L1:
movlw INIT_A ; Настраиваем порт A0
movwf b`00000001`; Через выходы RA0 включаем левую часть линейки светодиодов
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
goto START ; Возврат в начало программы
; Правый поворот
R1:
movlw INIT_A ; Настраиваем порт A0
movwf b`00000010`; Через выходы RA1 включаем правую часть линейки светодиодов
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
goto START ; Возврат в начало программы
; Сигнал СТОП
S1:
movlw INIT_A ; Настраиваем порт A0
movwf b`00000011`; Через выходы RA0 и RA1 включаем обе части линейки светодиодов
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
goto START ; Возврат в начало программы
; Подпрограмма положений светодиодов
MASK:
addwf PCL, 1 ; Задается смещение в таблице
retlw `00000001`
retlw `00000011`
retlw `00001100`
retlw `00011000`
retlw `00110000`
retlw `01100000`
retlw `11000000`
retlw `10000000`
end ; Конец программы |
Заранее благодарна, Кристина (Kristina_ks@mail.ru
|
|
|
|
08.12.2005, 19:28
|
|
Прописка
Регистрация: 27.08.2004
Сообщений: 107
Сказал спасибо: 0
Сказали Спасибо 21 раз(а) в 20 сообщении(ях)
|
Код:
|
; Левый поворот
L1:
movlw INIT_A ; Настраиваем порт A0
movwf b`00000001`; Через выходы RA0 включаем левую часть линейки светодиодов
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
goto START ; Возврат в начало программы |
я так понимаю совсем работать не хочет? комментарии, вроде дельные написаны, а вот дальше...
к тому ж с таблицей связываться имхо не к месту здесь...
завтра, если время будет, попробую написать как надо. К тому ж, вроде PIC16F84 где-то завалялся, так что смогу протестировать.
|
|
|
|
08.12.2005, 19:30
|
|
Прописка
Регистрация: 27.08.2004
Сообщений: 107
Сказал спасибо: 0
Сказали Спасибо 21 раз(а) в 20 сообщении(ях)
|
кстати, INIT_A, DATAPORT что у вас обозначает?
|
|
|
|
08.12.2005, 20:08
|
|
Временная регистрация
Регистрация: 10.12.2004
Сообщений: 70
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Даже не поленился
Код:
|
; Полоса светодиодов
list P=16f84
include ‹p16f84.inc›
__config b'00000111'
INIT_A equ b'00011100'
INIT_B equ b'00000000'
#define DATAPORT PORTB
;
; Переменные
;
cblock 0C
SV_COUNT
SV_STOP
_END_RAM_:0
endc
org 0; Указатель для ассемблера - последующий код начинается с нулевого адреса
goto START
; Основная программа
START:
; Инициализация и начальные условия
clrf PORTA ; Очистка порта А
clrf PORTB ; Очистка порта B
bsf STATUS, RP0 ; Переход в банк 1
movlw INIT_A ; Настраиваем порт A0
movwf TRISA ; Входы RA2, RA3, RA4 остальные выходы
movlw INIT_B ; Настраиваем порт B0
movwf TRISB ; Все выходы
bcf STATUS, RP0 ; Переход в банк 0
clrf SV_COUNT
; Рабочая часть
LOOP:
btfsc PORTA, 2 ; если заданый бит сброшен, то пропустить команду
goto L1 ; если на порт RA2 пришел сигнал, то переходим к обработке левого поворота
btfsc PORTA, 3
goto R1
btfsc PORTA, 4
goto S1
clrf SV_COUNT
clrf PORTB
goto LOOP
; Левый поворот
L1:
movlw b'00000001' ; Настраиваем порт A0
movwf PORTA ; Через выходы RA0 включаем левую часть линейки светодиодов
movfw SV_COUNT
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
movlw b'00000001'
addwf SV_COUNT,1
goto LOOP ; Возврат в начало программы
; Правый поворот
R1:
movlw b'00000010'; Настраиваем порт A0
movwf PORTA ; Через выходы RA1 включаем правую часть линейки светодиодов
movfw SV_COUNT
call MASK ; Вызвать подпрограмму
movwf DATAPORT ; Вывести элемент таблицы в порт B
movlw b'00000001'
addwf SV_COUNT,1
goto LOOP ; Возврат в начало программы
; Сигнал СТОП
S1:
movlw b'00000011'; Настраиваем порт A0
movwf PORTA ; Через выходы RA1 включаем правую часть линейки светодиодов
movfw SV_COUNT
call MASK ; Вызвать подпрограмму
iorwf SV_STOP,1
movfw SV_STOP
movwf DATAPORT ; Вывести элемент таблицы в порт B
movlw b'00000001'
addwf SV_COUNT,1
goto LOOP ; Возврат в начало программы
; Подпрограмма положений светодиодов
MASK:
addwf PCL, 1 ; Задается смещение в таблице
retlw b'00000001'
retlw b'00000011'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000000'
end ; Конец программы |
Типа так.
|
|
|
|
09.12.2005, 13:15
|
|
Временная регистрация
Регистрация: 10.12.2004
Сообщений: 70
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
ЗЫ: Тока я там немного не доработал... ![Смущение](images/smilies/icon_redface.gif) Нада в главном лупе в конце поставить обнуление переменной SV_STOP и в его начале поставить проверку на предмет превышения значения SV_COUNT (шоб больше 8-ми не был), и там-же поставить временную задержку, а то в реальном устройстве очень быстро моргать будет
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:16.
|
|