ик пульт и ик приёмник на Attiny13

Здесь обсуждаем устройства на МК и программы для них
Re-Pay
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 26 июл 2013, 15:41

Re: ик пульт и ик приёмник на Attiny13

Сообщение Re-Pay »

Здравствуйте,уважаемые, форумчане.
Попробовал перенести прошивку http://radiohlam.ru/program/ikpriemnik_ ... _rc5_2.htm с Attiny13 на Attiny2313.Приемник ИК на РВ1,остальные ноги порта управляют 7-ми сегментным индикатором(показывают номер команды)-в исходном состоянии на выходах 1(индикатор с общим анодом). Так-вот я столкнулся и бьюсь уже неделю со странной работой программы контроллера:
1.Прием цифры 1(код команды-00001)-прием нормальный,индикация адекватная.
2.Прием цифры 2(код команды-00010)то-же.
3.Прием 3(код команды 00011)первый проход(если удерживается 3)правильная индикация,второй проход-индикация кода 1(00001). То-есть происходит какой-то сдвиг на 1 вправо(00011->00001). На цифру 7,пульта,(00111)-делает 3 шага:7,3,1(00111->00011->00001).

Помогите,пожалуйста,разобраться с проблемой.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: ик пульт и ик приёмник на Attiny13

Сообщение rhf-admin »

Так ты хоть выложи то, что получилось в результате переноса.
С уважением, администрация сайта.
Re-Pay
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 26 июл 2013, 15:41

Re: ик пульт и ик приёмник на Attiny13

Сообщение Re-Pay »

;.device ATtiny13
.include "tn2313def.inc"
;.list
;-- определяем свои переменные
.def w=r16 ; это будет наш аккумулятор
.def MBC=r17 ; старший байт посылки
.def LBC=r18 ; младший байт посылки
.def Sch=r19 ; счётчик принятых бит
.def C_time=r20; текущее значение таймера
.def H_time=r21; 3/4 бита
;-- определяем константы
.equ Sys=29 ; номер системы
.equ CMD_1=4 ; 000001 код команды=1
.equ CMD_2=3 ; 000010 код команды=2
.equ CMD_3=2 ; 000011 код команды=3
.equ CMD_4=1 ; 000100 код команды=4
;-- Используемые регистры
; SPL - указатель вершины стека
; ACSR - управление компаратором
; DDRB - направление работы ног
; PORTB - выходы порта
; PCMSK - разрешение прерываний на отдельных входах
; GIMSK - общее разрешение прерываний по входам
; GTCCR - сброс предделителя
; TCCR0B - управление таймером
; TIMSK0 - прерывания от таймера
;-- начало программного кода
.cseg
.org 0

rjmp Init ; переход на начало программы
;-- вектора прерываний
reti;
reti ; External Interrupt 0
reti;
reti ; External Interrupt Request 0
reti;
rjmp Timer ; Timer
reti;
reti ; EEPROM Ready
reti;
reti ; Analog Comparator
rjmp Pch ; Pin Change
reti ; Timer/Counter0 Compare Match 0A
reti;
reti ; Timer/Counter Compare Match B
reti;
reti ; Watchdog Time-out
reti; ; ADC Conversion Complete reti;

;-- начало программы
Init: ldi w,RAMEND ; устанавливаем указатель вершины
out SPL,w ; стека на старший байт RAM
;sbi ACSR,7 ; выключаем компаратор

ldi w,0b1111111 ;конфиг. вход-0,выход-1
out DDRD,w ;
ldi w,0b1000000 ;подтяжка-1
out PORTD,w ;

ldi w,0b11111101 ;
out DDRB,w ;
ldi w,0b11111101 ;
out PORTB,w ;

ldi w,0b0000 ;
out DDRA,w ;
ldi w,0b1111 ;
out PORTA,w ;

;-- разрешить прерывания от таймера --
;-- (пока он не запущен - прерывания всё равно не будет) --

ldi w,0b00000001
out TIMSK,w ; разрешить прерывания от таймера
;-- Обнуляем счётчик и регистр флагов
Reset:
;in w,PORTB ; читаем порт
;clr LBC
;ldi w,RAMEND ; устанавливаем указатель вершины
;out SPL,w ; стека на старший байт RAM
;pop w
; pop w
;clr LBC
;clr MBC
clr Sch
clt ; сбрасываем флаг Т

;-- разрешить прерывание от входов
ldi w,0b00100000
out GIMSK,w ; разрешаем прерывание от входов

Start:
;cli
ldi w,0x20
out EIFR,w ; сбросить флаг прерываний от входов
ldi w,0b00000010
out PCMSK,w ; разрешаем прерывания на входе PB1

sei ; разрешить глобальные прерывания
;sbi PortB,4

Scan:
nop
rjmp Scan

;-- ОБРАБОТЧИК ПРЕРЫВАНИЯ ПО ВХОДУ
;-- инициализируем счётчик, адр.бита, пров.рег., адр.рег.записи
Pch:

tst Sch ; счётчик =0?
brne Next
Nachalo:
sbic PinB,1 ; если на входе низкий уровень - пропускаем команду
reti ; это не приём - выходим
; clr w
; out PCMSK,w ; запрещаем прерывания от всех входов
ldi w,0b00000001
out GTCCR,w ; сбросить предделитель
ldi w,0b00000100
out TCCR0B,w ; запустить таймер с делителем на 256
sec ; поднять флаг переноса
rol LBC ;сдвигаем влево(запись 1)
rol MBC
inc Sch
reti
Next:

in C_time,TCNT0 ; читаем значение таймера
clr w
out TCNT0,w ; перезапускаем таймер
cpi Sch,1 ; Sch=1?
brne n_2 ; переходим если >1

mov H_time,C_time
lsr C_time ; находим четверть бита(сдвигаем вправо)
add H_time,C_time ; находим 3/4 бита
set ; ставим флаг пропуска (T в регистре SREG)
sec ; поднять флаг переноса
rol LBC
rol MBC
inc Sch ; увеличиваем счётчик
reti
n_2:
brts Not_Signed_FRont;переход-если установлен Т
Signed_Front:
cp C_time,H_time
brsh Long_time ;переход если больше или равно(флаг S1)
Short_time:
set ; установить признак пропуска
clc
sbrc LBC,0 ; пропустить, если прошлоне значение = 0
sec
rjmp Zapis_bita
Long_time:
clc ; принимаемый бит инвертирован, по отношению к последнему
sbrs LBC,0 ; пропустить, если прошлое значение = 1
sec
Zapis_bita:
rol LBC
rol MBC
inc Sch
cpi Sch,14
breq rab_chast
reti
Not_Signed_Front:
clt
reti

;-- ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ ТАЙМЕРА
Timer: clr w
out TCCR0B,w ; выключить таймер
pop w ; очищаем стек
;clr LBC
; clr MBC
pop w
rjmp Reset ; ресетимся

;-- РАБОЧАЯ ЧАСТЬ
;-- Проверка номера системы и команды
rab_chast:
clr w
; clr Sch

;out GIMSK,w ; запрещаем прерывание от входов

; out PCMSK,w ; запрещаем прерывания на входе PB1

out TCCR0B,w ; выключить таймер
out TCNT0,w ; сбросить таймер
pop w ; очищаем стек
pop w
;clr w
clc
rol LBC ; сдвигаем всё, кроме номера команды в MBC
rol MBC
clc
rol LBC
rol MBC
lsr LBC ; выравниваем номер команды младшим битом к
lsr LBC ; младшему биту байта
; in w,PORTB ; читаем порт
;out PORTB,LBC

cpi LBC,CMD_3
breq Button3
cpi LBC,CMD_2
breq Button2
cpi LBC,CMD_1
breq Button1
cpi LBC,CMD_4
breq Button4

out PORTB,MBC
rjmp Thats_all
Button1:
ldi w,0b10110101
;eor w,Sch
out PORTB,w
rjmp Thats_all
Button2:
ldi w,0b00011000
; eor w,Sch
out PORTB,w
rjmp Thats_all
Button3:
ldi w,0b00010100
;eor w,Sch
out PORTB,w
rjmp Thats_all
Button4:
ldi w,0b10000101
;eor w,Sch
out PORTB,w
rjmp Thats_all
Thats_all:
rcall Pause
rjmp Reset
Pause:
ldi w,0xFF
Pause_cikl:
nop
nop
nop
nop
nop
dec w
brne Pause_cikl

ret
;---------------------------------------------------------
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: ик пульт и ик приёмник на Attiny13

Сообщение rhf-admin »

Похоже разобрался в чём дело.
Получается вот что. Когда последние два бита 1 - имеем в конце вот такую фигню (на выходе с приёмника):
конец посылки rc-5.JPG
конец посылки rc-5.JPG (2.87 КБ) 7168 просмотров
В месте, отмеченном красной стрелочкой, мы уже определяем все биты сообщения и переходим к паузе и обработке этого сообщения. Пауза (с тактовым 4МГц) занимает 511 мкс, рабочая часть - вообще незначительное время. То есть прога успевает всё сделать и перейти к ожиданию новой посылки ещё до того, как придут последние полбита (обозначены синей стрелочкой). Поэтому, когда при приёме этой половины бита происходит падение уровня сигнала в ноль - прога воспринимает это как второй полубит первого бита следующей посылки. Соответственно, следующая посылка будет принята неправильно.
Надо либо увеличить паузу, чтоб она была длиннее 888 мкс, либо при отсутствии изменения сигнала, дольше, скажем, двух бит, - ресетить всё нафиг.

З.Ы. Ты такие большие куски кода кидай архивами, а то на целую страницу - одно сообщение. Как-то это не айс.
С уважением, администрация сайта.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: ик пульт и ик приёмник на Attiny13

Сообщение rhf-admin »

Вспомнил окончательно эту прогу. Защита оказывается есть, от того что сигнал долго не меняется, - при переполнении таймера (по прерыванию) мы ресетимся. Но тут частота ниже и эта защита походу просто не успевает сработать, т.е. за время паузы между посылками таймер не успевает переполниться. Так что ещё пути решения - увеличить частоту или взять другой предделитель таймера.
С уважением, администрация сайта.
Re-Pay
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 26 июл 2013, 15:41

Re: ик пульт и ик приёмник на Attiny13

Сообщение Re-Pay »

Я уже решил свой вопрос.Мне только не понятно - Вы ,что выложили код который сами не проверяли? Я убил неделю думая,что лыжи не едут :? ,а собака порылась,как оказалось, в другом месте.Во это действительно НЕ АЙС.
З.Ы Все остальное выложенное на Вашем сайте Вами проверенно?Или это материал для ознакомления(работа не гарантируется :shock: )
Re-Pay
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 26 июл 2013, 15:41

Re: ик пульт и ик приёмник на Attiny13

Сообщение Re-Pay »

Да вспомнил-на 8MHz прога тоже не работает :oops: Если нужно могу скинуть Вам рабочий код
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: ик пульт и ик приёмник на Attiny13

Сообщение rhf-admin »

Обычно я все девайсы собираю, проверяю и только потом выкладываю, но конкретно этот код я лично в железе не проверял, потому что он родился намного позже пульта, но его проверял sergeus и у него этот код с пультом от телека работал.
Прочитай сообщения на второй страничке этой темы, от самого верха до моего поста от 22 мая и ты всё поймёшь.
Рабочий код - в студию, интересно всё же, где-таки порылась собака.
С уважением, администрация сайта.
safin395
Читатель
Читатель
Сообщения: 6
Зарегистрирован: 28 авг 2013, 02:19
Откуда: Мухосранск

Re: ик пульт и ик приёмник на Attiny13

Сообщение safin395 »

всем привет!
нет ли у вас прошивки под приемник ...что бы было 4 канала но без переключения...то есть нажал кнопку на пульте и пока держишь работает отпустил не работает.
с пультом понятно а вот приемник....получается как триггер......
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: ик пульт и ик приёмник на Attiny13

Сообщение rhf-admin »

Нет, прошивки такой нет, но в чём проблема её сделать? Ты же знаешь, через какое время пульт посылает повторные посылки. Отсчитывай в приёмнике, скажем, три таких интервала и если посылка так и не пришла - значит кнопку точно отпустили.
С уважением, администрация сайта.
Ответить

Вернуться в «Устройства на микроконтроллерах»