Rtmip писал(а):Через регистр-защелку, как внешнюю память к Р0.0 и Р0.1.
По поводу вашей программы ИК-приемника, вы в "кейле" пишете?
Зачем на два файла разделили? Помощь еще нужна или разобрались?
Самый простой (малоногий, дешевый) вариант этого регистра защелки, это 74HC573, или есть проще ?
Пишу в MCStudio, но подправлю (во всяком случае надеюсь, что смогу) под себя и кейловский код.
Разделил на 2 файла, потому что помимо приема ИК сигнала, планирую реализовать еще много чего, поэтому дроблю проект на мелкие файлы согласно задачам, на каждую задачу свой файл. Мне так потом легче проект под себя собрать, надо только ИК и управление реле, создал проект с 2 файлами и все. Надо добавить вывод на ЖК, добавил 3 файл, подправил мелкие моменты, скомпилировал и готово. Я так уже несколько раз делал, очень удобно. Уже есть свои "библиотечки" под ЖК HD44780, матричную клавиатуру, вывод и прием байта по UART, сенсорную клавиатуру. Благодаря вам, появилась и под воспроизведение мелодий))
Помощь нужна, пока нашел только ошибку, что после первого использования команды cjne изменяется содержиое АСС, и я опять не заносил содержимое TH0 в АСС. Подправил это, но проект продолжает быть не рабочим. При включении макета, на светодиоды выводится какое-то число и на команды с пульта не реагирует. В железе все точно правильно, потому что библиотека от Ридико (под RC-5) отлично работает. На данный момент библиотека выглядит вот так:
Спойлер
Код: Выделить всё
IR equ INT0 ; Выбираем INTO (INT1) ножку для подключения выхода TSOP
Frequency equ 11059 ; Тактовая частота микроконтроллера в кГц, ввести нужное значение и скомпилировать, остальные значение расчитываются автоматически
StartBitLow equ 50*Frequency/12000 ; 50 - старший байт таймера (в десятичной системе) для фиксации минимальной длинны старт бита (13 мс)
StartBitHigh equ 54*Frequency/12000 ; 54 - старший байт таймера (в десятичной системе) для фиксации максимальной длинны старт бита (14 мс)
TimeBit equ 6*Frequency/12000 ; 6 - старший байт таймера (в десятичной системе) для порогового значения бита данных (примерно 1600 мкс, все что меньше - 0, все что больше - 1)
dseg at 7h
ShiftCounter: ; Счетчик 8 бит (1 байта)
ds 1
Symbol: ; Здесь появляется байт посылки после каждого вызова попдрограммы Receive
ds 1
ByteAdress: ; Байт адреса устройства
ds 1
InvByteAdress: ; Инвертированнный байт адреса устройства
ds 1
ByteCommand: ; Байт принятой команды
ds 1
InvByteCommand: ; Инвертированнный байт принятой команды
ds 1
Stack: ; А дальше пойдет стек
cseg
mov ShiftCounter,#8 ; Занесем значение в счетчик сдвига
mov Symbol,#0 ; Обнулим переменную для храния байта посылки
mov TH0,#0 ; Обнулим таймер, нам считать длинну байтов
mov TL0,#0
NEC: ; Процедура обработки входящего сигнала, запускается по переходу уровня из 1 в 0 на ножке внешнего прерывания
push PSW
push Acc
setb TR1 ; Запустим Timer0
jb TF0,Error ; При переполнении таймера выходим из цикла
jnb IR,$-3 ; Ждем конца низкого уровня старт-бита
; Дождались смены уровня с низкого на высокий
jb TF0,Error ; При переполнении таймера выходим из цикла
jb IR,$-3 ; Ждем конца высокого уровня старт-бита
clr TR0 ; Остановим Timer0
mov A,TH0 ; Загрузим старший байт счетного регистра Timer0 в Аккумулятор
cjne A,StartBitlow,Compare_1 ; Сравним с минимальным значением старт-бита (13 мс)
jmp Error ; Равно, значит неправильный старт-бит, значит это не посылка
Compare_1:
jc Error ; Меньше минимальной длинны, значит неправильный старт-бит, значит это не посылка
mov A,TH0 ; Опять загрузим старший байт счетного регистра Timer0
cjne A,StartBitHigh,Compare_2 ; Сравним с максимальным значением старт-бита (14 мс)
jmp Error ; Равно, значит неправильный старт-бит, значит это не посылка
Compare_2:
jnc Error ; Больше максимальной длинны, значит неправильный старт-бит, значит это не посылка ;
GoRecive: ; Старт-бит правильный, начинаем прием посылки
call Receive
mov ByteAdress,Symbol ; Первый байт - адрес устройства
call Receive
mov InvByteAdress,Symbol ; Второй байт - инверсный байт адреса устройства
call Receive
mov ByteCommand,Symbol ; Третий байт - байт команды
call Receive
mov InvByteCommand,Symbol ; Четвертый байт - инверсный байт команды
Error: ; Если мы пришли сюда джампом, значит была ошибка (переполнение таймера или еще какая-то фигня)
mov TH0,#0 ; Обнулим таймер, нам заново считать длинну байтов
mov TL0,#0
if IR=INT0 ; Очистим флаг внешнего прерывания,по которому попали в обработчик
clr IE0
else
clr IE1
endif
clr TF0 ; Очистим флаг переполнения таймера, на всякий случай, может мы сюда из-за этого и попали
pop Acc
pop PSW
reti
Receive: ; Подпрограмма приема посылки (1 байта, 8 бит)
mov TH0,#0 ; Обнулим таймер, нам заново считать длинну байтов
mov TL0,#0
setb TR0 ; Запустим Timer0
jb TF0,Error ; При переполнении таймера выходим из цикла
jnb IR,$-3 ; Пока низкий уровень - ждем
; Дождались смены уровня с низкого на высокий
jb TF0,Error ; При переполнении таймера выходим из цикл
jb IR,$-3 ; Ждем конца высокого уровня бита данных
clr TR0 ; Остановим Timer0
mov A,TH0 ; Загрузим старший байт счетного регистра Timer0
cjne A,TimeBit,Compare_3 ; Проверим
jmp Error ; Пороговое значение, скорее всего ошибка
Compare_3:
jc Log_0 ; Если был установлен флаг С, значит A меньше, чем TimeBit
log_1: ; Флаг С не был установлен, значит А больше чем TimeBit
setb C ; Это лог. 1
jmp Sdvig ; Идем сдвигать
Log_0:
clr C ; Это лог. 0
Sdvig:
mov A,Symbol ; Закинем значение в А (в первый раз там будет 0, а после 8 сдвигов туда 8 раз задвинется состояние флага С, и мы на выходе получим наш байт)
rrc A ; Сдвинем вправо, потому что команды передаются младшим битом вперед
mov Symbol,A ; И закинем назад
djnz ShiftCounter,Receive ; И валим принимать опять, пока не примем все 8 бит
mov ShiftCounter,#8 ; Приняли все 8 бит, заново занесем значение в счетчик сдвига
ret
end
Файл основного цикла без изминений.

и не очень понимаю как она там ассемблирует...