Файлы  •  Ссылки  •  Прошивки  •  Правила  •  Архив  •   FAQ  •  Участники  •  Поиск
Регистрация  •  Вход

Уменьшенная библиотека IR-Remote для МК ATmega8

Список форумов » Разработка цифровых устройств
АвторСообщение
Arduino_ATmega8
Новичок
Сообщения: 5




20-12-2016 20:00

Привет!
Долго рыл интернет, чтобы запихать библиотеку IRremote в мегу8, с 8 кб памяти. Наконец нашел способ!
В библиотеке есть Файл IRremote.h
Удаляем из него все не нужные пульты, кроме той модели что будет использоваться для управления и сохраняем. После этих действий скетч влезет в 8 мегу!)
В чем плюс её использование- код становится до безобразия простой, не нужно настраивать регистра меги!
Может кому пригодится!

#include <IRremote.h>

int RECV_PIN = 2; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
int LED = 9;


void setup()

{
irrecv.enableIRIn(); // включить приемник
pinMode(LED, OUTPUT);

}

void loop() {



if (irrecv.decode(&results))
{
if (results.value == 0x20DF8E7) //код моей кнопки "2FD807F". У Вас он будет дугой
{
digitalWrite(LED, HIGH);
}
if (results.value == 0x20DF4EB)//код моей кнопки "2FD40BF". У Вас он будет дугой
{
digitalWrite(LED, LOW);
}




irrecv.resume();
}
}


Измененный файл (в этом примере под пульт от LG & RC5-6)


//******************************************************************************
// IRremote
// Version 2.0.1 June, 2015
// Copyright 2009 Ken Shirriff
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
// Edited by Mitra to add new controller SANYO
//
// Interrupt code based on NECIRrcv by Joe Knapp
// http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
// Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-ardui ...
//
// JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
// LG added by Darryl Smith (based on the JVC protocol)
// Whynter A/C ARC-110WD added by Francesco Meschia
//******************************************************************************

#ifndef IRremote_h
#define IRremote_h

//------------------------------------------------------------------------------
// The ISR header contains several useful macros the user may wish to use
//
#include "IRremoteInt.h"

//------------------------------------------------------------------------------
// Supported IR protocols
// Each protocol you include costs memory and, during decode, costs time
// Disable (set to 0) all the protocols you do not need/want!
//
#define DECODE_RC5 1
#define SEND_RC5 1

#define DECODE_RC6 1
#define SEND_RC6 1


#define DECODE_LG 1
#define SEND_LG 1







//
#define PRONTO_ONCE false
#define PRONTO_REPEAT true
#define PRONTO_FALLBACK true
#define PRONTO_NOFALLBACK false

//------------------------------------------------------------------------------
// An enumerated list of all supported formats
// You do NOT need to remove entries from this list when disabling protocols!
//
typedef
enum {
UNKNOWN = -1,
UNUSED = 0,
RC5,
RC6,

LG,




}
decode_type_t;

//------------------------------------------------------------------------------
// Set DEBUG to 1 for lots of lovely debug output
//
#define DEBUG 0

//------------------------------------------------------------------------------
// Debug directives
//
#if DEBUG
# define DBG_PRINT(...) Serial.print(__VA_ARGS__)
# define DBG_PRINTLN(...) Serial.println(__VA_ARGS__)
#else
# define DBG_PRINT(...)
# define DBG_PRINTLN(...)
#endif

//------------------------------------------------------------------------------
// Mark & Space matching functions
//
int MATCH (int measured, int desired) ;
int MATCH_MARK (int measured_ticks, int desired_us) ;
int MATCH_SPACE (int measured_ticks, int desired_us) ;

//------------------------------------------------------------------------------
// Results returned from the decoder
//
class decode_results
{
public:
decode_type_t decode_type; // UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; // Used by Panasonic & Sharp [16-bits]
unsigned long value; // Decoded value [max 32-bits]
int bits; // Number of bits in decoded value
volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks
int rawlen; // Number of records in rawbuf
int overflow; // true iff IR raw code too long
};

//------------------------------------------------------------------------------
// Decoded value for NEC when a repeat code is received
//
#define REPEAT 0xFFFFFFFF

//------------------------------------------------------------------------------
// Main class for receiving IR
//
class IRrecv
{
public:
IRrecv (int recvpin) ;
IRrecv (int recvpin, int blinkpin);

void blink13 (int blinkflag) ;
int decode (decode_results *results) ;
void enableIRIn ( ) ;
bool isIdle ( ) ;
void resume ( ) ;

private:
long decodeHash (decode_results *results) ;
int compare (unsigned int oldval, unsigned int newval) ;

//......................................................................
# if (DECODE_RC5 || DECODE_RC6)
// This helper function is shared by RC5 and RC6
int getRClevel (decode_results *results, int *offset, int *used, int t1) ;
# endif
# if DECODE_RC5
bool decodeRC5 (decode_results *results) ;
# endif
# if DECODE_RC6
bool decodeRC6 (decode_results *results) ;
# endif

//......................................................................
# if DECODE_LG
bool decodeLG (decode_results *results) ;
# endif
//......................................................................


} ;

//------------------------------------------------------------------------------
// Main class for sending IR
//
class IRsend
{
public:
IRsend () { }

void custom_delay_usec (unsigned long uSecs);
void enableIROut (int khz) ;
void mark (unsigned int usec) ;
void space (unsigned int usec) ;
void sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) ;

//......................................................................
# if SEND_RC5
void sendRC5 (unsigned long data, int nbits) ;
# endif
# if SEND_RC6
void sendRC6 (unsigned long data, int nbits) ;
# endif

# if SEND_LG
void sendLG (unsigned long data, int nbits) ;
# endif


} ;

#
endif

https://www.youtube.com/watch?v=yGugg9aF50E
Arduino_ATmega8
Новичок
Сообщения: 5




02-01-2017 17:23

Никому не интересно? недовольство, огорчение
Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




03-01-2017 00:27

Ну дык если никто ничего не написал...

А вот у меня возник вопрос ...

Помнится как то давно уже, лет может быть пятнадцать назад меня вштырило сделать собственную магнитолу с управлением на ИК и прочими премудростями. Ничего кроме PIC16F84 под рукой не было и я написал два кода. Один для процессора в магнитоле. Нужно было обеспечить параллельное управление механизмом, например счетчик импульсов автостопа, и конечно же "ловить" посылки с пульта при условии, что с приемника всегда лезет какая то хрень типа помех и шумов, воспринятых приемником "за свое".

В общем что в один процессор, что в другой все влезло без всяких проблем. Я даже не задумывался, что одной тысячи команд кода мне не хватит!

Так в чем заключается подвиг?

Я в принципе человек не злобный, но когда мне говорят, что из этого векового дуба может получиться не один, а целых два коробки спичек, у меня начинаются вопросы!

img.bibo.kz.jpg



dsp155
Участник
Сообщения: 1474




03-01-2017 15:56

Васисуалий, Мню бы постигнуть arduinu... Писал сразу на bascom avr... Для пиков написал код декодера rc5 все работало...
В ардуине дохрена лишнего как я понял кроме загрузчика и отладчика
улыбка

Хотя это не всегда является минусом. При отладке вроде плюс. Пару раз выручало. Но на платах discovery от STm.. Все гораздо проще.. улыбка

Про ардуину. Ну как то так типа это все и работает... шок гы-гы
Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




04-01-2017 01:00

dsp155 писал:
Для пиков написал код декодера rc5 все работало...


Ну и вот? Смог С ТРУДОМ запихать это ЧУДО-ИЗОБРЕТЕНИЕ в восемь килобайт? помираю со смеху!

Или просто все залезло в килограмм пиковской Гарвардской памяти и даже не задумался об объеме?

Добавлено 04-01-2017 01:14

dsp155, я счас могу ляпнуть одну мысль, за которую меня тапками закидают! Но я считаю, что использование языков типа СИ и прочих универсальных или узкоспец подставлялок машинного кода вместо стихов А.С. Пушкина, должно быть очень осторожным и по возможности оправданным! А использование чужих библиотек, да еще и каких то там типа "универсальных" особенно случайно скачанных с тырнета за бесплатно, да еще и без всякой вразумительной документации и приводит к ситуации, когда в доме уже просто нет вообще ни одного устройства, в котором не обнаружены глюки! А когда становишься сам автором такого глюка потому, что вместо вдумчивой проработки задачи и написания пары десятков строк на АСМе тупо "лепишь горбатого на костылях" используя неизвестно чью библиотеку без описания и в результате вместо экономии времени получаешь головомойку в несколько бессонных ночей, то понимаешь простую истину - хочешь сделать хорошо, сделай сам!
Konstantin_18
Участник
Сообщения: 3373




04-01-2017 09:01

Васисуалий писал:
использование чужих библиотек, да еще и каких то там типа "универсальных" особенно случайно скачанных с тырнета за бесплатно, да еще и без всякой вразумительной документации и приводит к ситуации, когда в доме уже просто нет вообще ни одного устройства, в котором не обнаружены глюки!

одобряю стопудово
Чужие библиотеки нужно использовать только как пример написания собственного кода.

А вот насчет С - не согласен.
Правильный компилятор не делает ПОЧТИ ничего лишнего, а жизнь сильно облегчает.
Насчет ПОЧТИ смотрим сгенерированный им ассемблерный промежуточный текст и делаем выводы, а если нужно - правим.

С ругают люди плохо его знающие. улыбка
ПС. Я его тоже плохо знаю, но пытаюсь узнать получше.
dsp155
Участник
Сообщения: 1474




04-01-2017 23:57

Васисуалий писал:
dsp155 писал:
Для пиков написал код декодера rc5 все работало...


Ну и вот? Смог С ТРУДОМ запихать это ЧУДО-ИЗОБРЕТЕНИЕ в восемь килобайт? помираю со смеху!

Или просто все залезло в килограмм пиковской Гарвардской памяти и даже не задумался об объеме?

Добавлено 04-01-2017 01:14

dsp155, - хочешь сделать хорошо, сделай сам!


Rc5 декодировал просто
Основная программа работает, разрешаем прерывания от rb0 .

После возникновения прерывания
Запрещаем прерывания.

принимаем
И записываем 2 стартовых бита
Адрес устройства и код кнопки каждое в свой регистр.
Если адрес сошелся.. То выполняем команду.
Проц был pic16f873. 4 kb flash.
В проге часы и термометр с двумя ds18b20.
С выводом на 4разрядный индикатор .индикация
Динамическая. Ещё килобайта полтора Флеша осталось...
подшучивать, дразнить

В использовании чужих библиотек
Нет ничего зазорного, но если глючат приходится писать своё.

Писалось это в микро c.
В принципе если не проверять ошибки передачи
То в пол килобайта влезет.
Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




05-01-2017 01:00

dsp155 писал:
если не проверять ошибки передачи
То в пол килобайта влезет.


А в RC5 чексумм передается? В прочем я не заморачивался. Ведь даже если вдруг примется что то не так, то это же не команда пуска баллистической ракеты! Ну сработает механизм не на перемотку, а на старт воспроизведения. В прочем я такого не заметил ни разу! Чаще бывало просто неприем команды, но это у любого телика или видака как за "здрассте". Короче мой код получился не лучше и не хуже любого кода в любом процессоре любого телика, а если брать современные шедевры программирования, так и лучше иных вышло! Главное сама программа декодирования занимала комманд двести или триста на АСМе. Программа для пульта вообще оказалась и того меньше, комманд до двухсот. Ну, понятно, что у меня всего то использовалось не более десятка команд, но даже если бы я их добавил, пусть даже и пару десятков, а больше и не надо, то все равно каждая новая команда, это от силы пара команд в опросе клавиш и еще пара команд в кодере посылки. Все равно за килограмм пиковсской памяти вылезти трудно.
Murka
Профессор
Сообщения: 2748




05-01-2017 02:07

Васисуалий, Чек сума нету, но условие включения/выключения прохождение двух подряд пакетов одной команды маркированных чёт/нечет ну или нечет/чёт.
dsp155
Участник
Сообщения: 1474




05-01-2017 06:26

Васисуалий, Murka, там каждый бит передаётся нулем и единицей. Если в каком то принятом бите два нуля или две единицы то ошибка и команду не выполняем.

http://digit-el.com/files/open/rc5/rc5.html

pic4.gif


  pic2.gif  8,87 КБ  Скачано: 30 раз(а)

Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




05-01-2017 13:49

dsp155, вспомнил. Давно было, разбирался.... гы-гы
Arduino_ATmega8
Новичок
Сообщения: 5




07-01-2017 13:33

Прелесть библиотеки IR remote в том, что это готовая библиотека. там уже всё написано. Ненужно играть с регистрами счётчиками и прочим. Программный код получается до безумия простой. Но в самую распространенную 8-ю мегу он не влазил. Я долго искал путь как уменьшить и уменьшил. Вот решил поделится, тк в свое время весь русский и английский интернет перерыл в поисках таковой, т.к не смог настроить стетчики таймеры меги для декодирования ИР команд с пульта. И действительно примеров создания ик управления на 8 меги на СИ в интренете НЕТ улыбка
Если есть кидайте ссылки, но их пока нет)
LDZ
Участник
Сообщения: 892




07-01-2017 21:29

Arduino_ATmega8, СИ есть СИ... тут заморачиваться нечего...
берем любой линукс проект на СИ за основу и пишем на любой проц...
как угодно... хоть на СИ, хоть на АСМ... хто на что горазд...
искать конкретно на 8 мегу - глупо...
все давно придумано до нас...
Arduino_ATmega8
Новичок
Сообщения: 5




08-01-2017 09:54

LDZ писал:
Arduino_ATmega8, СИ есть СИ... тут заморачиваться нечего...
берем любой линукс проект на СИ за основу и пишем на любой проц...
как угодно... хоть на СИ, хоть на АСМ... хто на что горазд...
искать конкретно на 8 мегу - глупо...
все давно придумано до нас...


Регистры и счётчики у всех МК разные. И обращятся ним нужно по разному. А код и будет основан в в основном на управлении счётчиков. Это значит весь когд нужно переделывать под конкретно Мегу8.
Не все это сделают, а потом ещй компилятор на непонятные мелочи начнет ругатся.
А тут получается очень простой когд, из-за библиотеки IR Remote. Тут для нас уже годовая переменная с полученным кодом.

Добавлено 08-01-2017 09:56

Это как собирать УНЧ на транзисторах с кучей обвязки и расчётов, либо взять TDA2030 готовую. Что удобней?)
LDZ
Участник
Сообщения: 892




08-01-2017 10:36

ну, сделал и сделал... молодец... улыбка
я чего влез то, восьмая мега для меня умерла просто... давно...
в паре проектов на ней, со временем перестал запускаться тактовый... на температуре чуть отличной от комнатной...
посему твое упорство позабавило... я бегу от нее, а ты наоборот в нее лезешь... улыбка
Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




08-01-2017 13:51

LDZ писал:
ну, сделал и сделал... молодец... улыбка


Таки да! Я в таких случаях люблю говорить - победителей не судят! Работает, значит прав!

Однако остаются и вопросы и замечания!

Добавлено 08-01-2017 14:09

Arduino_ATmega8 писал:


Регистры и счётчики у всех МК разные. И обращятся ним нужно по разному. А код и будет основан в в основном на управлении счётчиков. Это значит весь код нужно переделывать под конкретно Мегу8.


И чего ты уперся в Мегу8? А если взять ПИК или СТМ8? Что изменится?

А с другой стороны, что значит разные регистры? Да у всех повально контроллеров примерно одинаковое строение регистров! Тут большую сумятицу в дело вносят не разные "принципы", потому что они одинаковые, а скорее разное название регистров по собственной классификации производителя. Но в сути все регистры во всех процессорах выглядят одинаково:

1. сам регистр
2. маска регистра вход\выход
3. маска регистра подтягивающих резисторов (или один общий бит, включающий сразу все резики на всех ногах регистра)
4. маска режимов "наложенных" на регистры разных спец-портов, АЦП, ЦАП, УАРТ, И2Ц, и прочих.

Последние три пункта как правило устанавливаются в первых строках программы еще на этапе инициализации после жесткого ресета, а первый пункт и есть сам регистр. Им пользуйся согласно задачи. Что тут разного или уникального?

Сложнее? Ну в чем? У СТМ32Ф4... регистров больше? Да! Потому, что мало того, что самих портов много, так еще на каждый порт наложены самые разные дополнительные периферийные интерфейсы. Но это только в начале! Просто при инициализации надо вдумчиво определиться со всеми параметрами всех регистров и потом "очистив" процессор от излишеств пиши себе что угодно!

Счетчики? Посмотри на фотку великого и ужасного Билла Гейтса чуть выше в этой теме! Постарайся написать программу так, что бы потом тебе не пришлось обьяснять принцип ее действия с таким же лицом!

помираю со смеху!

bill.jpg



dsp155
Участник
Сообщения: 1474




08-01-2017 20:03

Arduino_ATmega8, вопрос сколько килобайт занял код ?
Arduino_ATmega8
Новичок
Сообщения: 5




12-01-2017 08:56

dsp155, 5 068 байт
https://youtu.be/yGugg9aF50E
dsp155
Участник
Сообщения: 1474




15-01-2017 14:02

Arduino_ATmega8 писал:
dsp155, 5 068 байт
https://youtu.be/yGugg9aF50E

слишком большой обьем кода. так в килобайт влезает если на асме или C писать. Интересно спасибо!
Васисуалий
monitor.net.ru
monitor.net.ru
Сообщения: 5128




18-01-2017 01:24

dsp155 писал:
в килобайт влезает


Я уже писАл, что не только влезет, но еще и место останется! Вот мой собственный пример АСМ для ПИК, декодер команд пульта от видеокамеры Сони, модель не помню, кому интересно, заливайте в чип и пробуйте.

Причем это декодер, кодер сделать еще проще!

Код:
list     p=16c84


status   equ     03h      ; STATUS register F3
porta    equ     05h      ; portregister-A
portb    equ     06h      ; portregister-B
;--------------------------------------------------------------------------
trisa    equ     85h      ;
trisb    equ     86h      ;
;--------------------------------------------------------------------------
inda     equ     08h      ; indication segments
indb     equ     09h      ;
indc     equ     10h      ;
indd     equ     11h      ;
;--------------------------------------------------------------------------
byte1    equ     12h      ; worc byte's for any operation
byte2    equ     13h      ;
byte4    equ     14h      ;
;--------------------------------------------------------------------------
timeind  equ     15h      ; indication time
;--------------------------------------------------------------------------
loop1    equ     16h      ; time of looped timer
loop2    equ     17h      ;
;--------------------------------------------------------------------------
remote1  equ     18h      ;
remote2  equ     19h      ;
remote3  equ     1Ah      ;
remote4  equ     1Bh      ;
;--------------------------------------------------------------------------
w        equ     0        ; TRANSCRIPTION WECTOR
f        equ     1        ;
;-------------------------------bit----------------------------------------
c        equ     00h      ;carry
dc       equ     01h      ;digit carry
z        equ     02h      ;zero
rp0      equ     05h
;--------------------------------------------------------------------------
ra0      equ     00h      ;porta bit0
ra1      equ     01h      ;porta bit1
ra2      equ     02h      ;porta bit2
ra3      equ     03h      ;porta bit3
ra4      equ     04h      ;porta bit4

;        equ     00h      ;
;        equ     01h      ;
;        equ     02h      ;
;        equ     03h      ;
;------------------------------symbolgenerator-----------------------------
                                  ;               
bi0      equ     b'11010111'      ; symbolgenerator for maket n1/0.00Beta
bi1      equ     b'00010001'      ;
bi2      equ     b'01110110'      ;
bi3      equ     b'01110011'      ;
bi4      equ     b'10110001'      ;
bi5      equ     b'11100011'      ;
bi6      equ     b'11100111'      ;
bi7      equ     b'01010001'      ;
bi8      equ     b'11110111'      ;
bi9      equ     b'11110011'      ;
bia      equ     b'11110101'      ;A
bib      equ     b'10100111'      ;B
bic      equ     b'11000110'      ;C
bid      equ     b'00110111'      ;D
bio      equ     b'00100111'      ;O
bie      equ     b'11100110'      ;E
bif      equ     b'11100100'      ;F
bip      equ     b'11110100'      ;P
bil      equ     b'10000110'      ;L
biy      equ     b'10110011'      ;Y
bis      equ     b'11100011'      ;S
bit      equ     b'10100110'      ;T
bir      equ     b'00100100'      ;R
;---------------------------------+----------------------------------------
;
;
;--------------------------------------------------------------------------
org0
goto start
;--------------------------------------------------------------------------
;
;
;-------------------------------start module-------------------------------
     start                           ;
     clrf     porta                  ;
     clrf     portb                  ;
     bsf      status, rp0            ;
     movlw    b'00010000'            ; set tris register's
     movwf    trisa                  ;
     movlw    b'00000000'            ;
     movwf    trisb                  ;
     bcf      status, rp0            ;
                                     ;

;----------------------------end of start module---------------------------
;
;     
;-------------------------------PROGRAM MODULE-----------------------------       
program   
           btfsc         porta,ra4     ;
           goto          program       ; bit low
           movlw         b'00000111'   ;
           movwf         timeind       ;
           clrf          byte1         ; l
           clrf          byte2         ; l
           clrf          remote1       ; l
           clrf          remote2       ; l
           clrf          remote3       ; l
           clrf          remote4       ; l

test1                                  ; l
           btfss         porta,ra4     ; h
           goto          test1         ; h
test1a     incfsz        byte1         ; h
           goto          endtest1      ; h
           incfsz        byte2         ; h
           goto          endtest1      ; h
           goto          program       ; h
endtest1                               ; h
           btfsc         porta,ra4     ; l
           goto          test1a        ; l
;--------------------------------------------------------------------------

           call          bytereader
           movlw         21h
           subwf         remote1,f
           btfss         status,z
           goto          program
           movlw         21h
           subwf         remote2,f
           btfss         status,z
           goto          program

decoder    movlw         16h
           subwf         remote3,w
           btfsc         status,z
           goto          cstill
           
           movlw         24h
           subwf         remote3,w
           btfsc         status,z
           goto          cstart

           movlw         19h
           subwf         remote3,w
           btfsc         status,z
           goto          cplay

           movlw         18h
           subwf         remote3,w
           btfsc         status,z
           goto          crewers

           movlw         15h
           subwf         remote3,w
           btfsc         status,z
           goto          cstop

           movlw         1Eh
           subwf         remote3,w
           btfsc         status,z
           goto          cdispl

           movlw         22h
           subwf         remote3,w
           btfsc         status,z
           goto          czoomw

           movlw         1Ah
           subwf         remote3,w
           btfsc         status,z
           goto          cfor

           movlw         21h
           subwf         remote3,w
           btfsc         status,z
           goto          czoomt

           goto          program
;--------------------------------------------------------------------------
cplay      movlw         bip
           movwf         inda
           movlw         bil
           movwf         indb
           movlw         bia
           movwf         indc
           movlw         biy
           movwf         indd
           call          indicate
           goto          program

cstill     movlw         bis
           movwf         inda
           movlw         bit
           movwf         indb
           movlw         bi1
           movwf         indc
           movlw         bil
           movwf         indd
           call          indicate
           goto          program
           
cstart     movlw         bis
           movwf         inda
           movlw         bit
           movwf         indb
           movlw         bia
           movwf         indc
           movlw         bit
           movwf         indd
           call          indicate
           goto          program

crewers    movlw         bir
           movwf         inda
           movlw         bie
           movwf         indb
           movlw         bir
           movwf         indc
           movlw         bis
           movwf         indd
           call          indicate
           goto          program

cstop      movlw         bis
           movwf         inda
           movlw         bit
           movwf         indb
           movlw         bi0
           movwf         indc
           movlw         bip
           movwf         indd
           call          indicate
           goto          program

cdispl     movlw         bid
           movwf         inda
           movlw         bi1
           movwf         indb
           movlw         bis
           movwf         indc
           movlw         bip
           movwf         indd
           call          indicate
           goto          program

czoomw     movlw         bia
           movwf         inda
           movlw         bib
           movwf         indb
           movlw         bia
           movwf         indc
           movlw         bic
           movwf         indd
           call          indicate
           goto          program

cfor       movlw         bif
           movwf         inda
           movlw         bio
           movwf         indb
           movlw         bir
           movwf         indc
           movlw         bid
           movwf         indd
           call          indicate
           goto          program

czoomt     movlw         bia
           movwf         inda
           movlw         bib
           movwf         indb
           movlw         bia
           movwf         indc
           movlw         bic
           movwf         indd
           call          indicate
           goto          program

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;
;--------------------------end of program module---------------------------

;--------------------------------------------------------------------------
;                                 indicate
;--------------------------------------------------------------------------
indicate   
     movf     inda,0                 ;
     movwf    portb                  ;
     bcf      porta,ra0              ; 1-digit in indicator
     bsf      porta,ra1              ;
     bsf      porta,ra2              ;
     bsf      porta,ra3              ;
     call     loop                   ;
     movf     indb,0                 ;
     movwf    portb                  ;
     bsf      porta,ra0              ; 2-digit in indicator
     bcf      porta,ra1              ;
     bsf      porta,ra2              ;
     bsf      porta,ra3              ;
     call     loop                   ;
     movf     indc,0                 ;
     movwf    portb                  ;
     bsf      porta,ra0              ; 3-digit in indicator
     bsf      porta,ra1              ;
     bcf      porta,ra2              ;
     bsf      porta,ra3              ;
     call     loop                   ;
     movf     indd,0                 ;
     movwf    portb                  ;
     bsf      porta,ra0              ; 4-digit in indicator
     bsf      porta,ra1              ;
     bsf      porta,ra2              ;
     bcf      porta,ra3              ;
     call     loop                   ;
     decfsz   timeind,f              ;
     goto     indicate               ;
     bsf      porta,ra0              ;  no digit in indicator
     bsf      porta,ra1              ;
     bsf      porta,ra2              ;
     bsf      porta,ra3              ;
     
     return
;--------------------------------------------------------------------------
;                            loop subroutine
;--------------------------------------------------------------------------
loop                                 ;
                                     ;
           movlw    b'00000111'      ;
           movwf    loop2            ;
loopb      movlw    b'11111111'      ;
           movwf    loop1            ;
loopa      decfsz   loop1,1          ;
           goto     loopa            ;
           decfsz   loop2,1          ;
           goto     loopb            ;
return                               ;

;--------------------------------------------------------------------------
;                           subroutine bittest
;--------------------------------------------------------------------------

bittest    clrf          byte1
test2      btfss         porta,ra4     ; h
           goto          test2         ; h
test2a     incfsz        byte1         ; h
           goto          endtest2      ; h
           return
endtest2   
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           btfsc         porta,ra4     ; l
           goto          test2a        ; l
bitanaliz  bcf           byte1,00h
           bcf           byte1,01h
           bcf           byte1,02h
           bcf           byte1,03h
return


;--------------------------------------------------------------------------
;                          bytereader subroutine 
;--------------------------------------------------------------------------
bytereader           
           clrf          byte4
           call          byterd1
           movf          byte4,w
           movwf         remote1
           clrf          byte4
           call          byterd1
           movf          byte4,w
           movwf         remote2
           clrf          byte4
           call          byterd1
           movf          byte4,w
           movwf         remote3
return
;--------------------------------------------------------------------------
byterd1           
           clrf          byte1
bit1       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit2
           bsf           byte4,00h

bit2       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit3
           bsf           byte4,01h
           
bit3       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit4
           bsf           byte4,02h

bit4       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit5
           bsf           byte4,03h

bit5       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit6
           bsf           byte4,04h

bit6       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit7
           bsf           byte4,05h

bit7       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          bit8
           bsf           byte4,06h

bit8       call          bittest       ;
           movlw         b'00100000'
           subwf         byte1,f           
           btfsc         status,z
           goto          endbit
           bsf           byte4,07h
endbit     return

;--------------------------------------------------------------------------
end

pavel-pervomaysk
Your editor
Сообщения: 8022




18-06-2017 13:35

NEC протокол

Код:
 
; DATE:     12.01.2014
; Modified  12.02.2017
; Модуль для работы с  NEC IR пультами
; Результат по завершению приема находится в
; четырех регистрах Address L, Address H,Data N, Data Invert
; Пока держим кнопку, данные сохраняются в регистрах


; NEC IR receive bytes any Low registers
;.def   bytei = R11   ; Инвертированный байт команды
;.def   byten = R12   ; Нормальный байт команды
;.def   adrh  = R13   ; Адрес старший
;.def   adrl  = R14   ; Адрес младший


; NEW OSC 15.000 MHz
; NEC IR constants init
; all constants are true us values !

.equ   IR_pin    = PIND                ; PIND
.equ   IR        = PD2                 ; IR receiver INT0 pin
.equ   pre       = 8                   ; TIMER1 prescaller
.equ   const     = (FCLK/10000)/pre    ;
.equ   starth    = (9000*const)/100    ; SOF          9,000ms 
.equ   startl    = (4500*const)/100    ; Second width 4,500ms   
.equ   log1      = (2250*const)/100    ; Logic 1 (2,250ms)
.equ   restart   = log1                ; Packet 4,500ms + 2.250ms = REPEAT each 110ms 
.equ   log0      = (1125*const)/100    ; Logic 0 (1,125ms)
.equ   IRrip     = (200*const)/100     ; Ripple 200uS; Noise filter constant 

; Это вписываем после инициализации STACK 
;************************;
;**** INIT T1 & INT0 ****;

; INT0 falling mode      ; IR remote control
; INT1 rising mode       ; Zero cross detector

;ldi     tmp,(1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(0<<ISC00)  ;
;sts     EICRA,tmp        ;
;ldi     tmp,(1<<INT1)|(1<<INT0)    ;
;out     EIMSK,tmp        ; enable INT0 & INT1

;----- TIMER1 -----------;
;                        ; 0-STOP, 1-/1, 2-/8, 3-/64, 4-/256, 5-/1024. OVF mode
;ldi     tmp,0x01         ; ICNC1, ICES1, –, WGM13, WGM12, CS12, CS11, CS10.  F.osc / 1 no prescalling !
;sts     TCCR1B,tmp       ;
;sts     TCCR1A,zero      ;
;sts     TCCR1C,zero      ;
;sts     TCNT1H,zero      ;
;sts     TCNT1L,zero      ;
;sts     OCR1AH,zero      ;
;sts     OCR1AL,zero      ;
;sts     OCR1BH,zero      ;
;sts     OCR1BL,zero      ;
;sts     ICR1H,zero       ;
;sts     ICR1L,zero       ;
;lds     tmp,TIMSK1       ;
;ori     tmp,(1<<TOIE1)   ;
;sts     TIMSK1,tmp       ; Enable TIMER1

; NEC IR commands load    ;
;ldi    zl,low (IR_cmd*2)  ; IR address FLASH data pointer
;ldi    zh,high(IR_cmd*2)  ;
;ldi    yl,low (IR_ram)    ; загружаем адрес IR_ram
;ldi    yh,high(IR_ram)    ; 
;ldi    loop,22            ; количество кнопок, записанных во флеш Normal byte only ! 
;IR_ram_load:              ;
;lpm    tmp,Z+             ; Flash data --> R0   
;st     Y+,tmp             ; сохраняем в рам с постинкрементом адреса
;dec    loop               ; счетчик байт  - 1
;brne   IR_ram_load        ; если не равен 0 то продолжаем цикл

;.dseg
;IR_ram:      .byte 22   ;
;nec:         .byte 1    ; NEC command byte
;IR_status:   .byte 1    ; NEC IR Status byte Operative / Inoperative
;IR_cnt:      .byte 1    ;
 

;***********************************************************************************
; touched registers
; tmp
; Flags
; XL,XH
; ZL,ZH

IR_read:                 ;
sei                      ; Enable interrupts for DIMER
push    tmp              ; сохранить tmp в STACK
in      tmp,SREG         ; прочитать содержимое SREG в tmp
push    tmp              ; сохранить tmp в STACK
push    xl               ; сохранить XL в STACK
push    xh               ; сохранить XH в STACK
push    zl               ; сохранить ZL в STACK
push    zh               ; сохранить ZH в STACK
;------------------------;
lds     tmp,IR_cnt       ; Get INT0 counter
inc     tmp              ; INT0 counter + 1
sts     IR_cnt,tmp       ; Store INT0 counter
;------------------------;
cpi     tmp,1            ; IF cnt  = 1 -> goto IR_start
breq    IR_start         ; Start T1, запуск счета, прерывание по фронту, ловим 9мс
;------------------------;
cpi     tmp,2            ; IF cnt  = 2 -> goto IR_start
breq    IR_9ms           ; Check SOF 9ms (+ - ripple)
;------------------------;
cpi     tmp,3            ; IF cnt  = 3 -> goto IR_repeat -> OR normal start
breq    IR_repeat        ; Get data start transfer or REPEAT.
;------------------------; IF cnt >= 4 -> goto IR_data
rjmp    GET_IR_data      ; Get DATA 32 bits ! LSB first
;************************;
IR_start:                ;
lds     tmp,EICRA        ; Get Interrupt settings
ori     tmp,0x03         ; INT0 - rising (0x03)
sts     EICRA,tmp        ; Store INT0 setting
ldi     flags, 1         ; Flags = 1
rcall   Get_TCNT1        ; Z = TCNT1, TCNT1=0
rjmp    IR_ok            ; выходим из прерывания WAIT Hi level on INT0 !

;************************;
IR_9ms:                  ; 9.136 ms NORMAL !  INT0 - rising cnt=1 !
lds     tmp,EICRA        ; Get Interrupt settings
andi    tmp,0xFC         ; Clear bit 0
ori     tmp,0x02         ; INT0 - falling 02
sts     EICRA,tmp        ; Store INT0 setting
rcall   Get_TCNT1        ; Z = TCNT1, TCNT1=0
ldi     xl,byte1(starth-IRrip) ; load 9.000 ms - Ripple
ldi     xh,byte2(starth-IRrip) ;
cp      zl,xl            ;  comparing  TCNT1 with starth constant !
cpc     zh,xh            ; 
brlo    IR_9ms_br        ; если меньше, чем 8,8 мс то ошибка, не наш протокол !
ldi     xl,byte1(starth+IRrip) ; load 9.000 ms + Ripple
ldi     xh,byte2(starth+IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with starth constant !
cpc     zh,xh            ;
brsh    IR_error         ; если больше, чем 9,25 мс то ошибка, не наш протокол !
ldi     flags, 2         ; Flags = 2
rjmp    IR_ok            ;

IR_9ms_br:               ;
rjmp   IR_error          ;

;************************;
IR_repeat:               ;
rcall   Get_TCNT1        ; Z = TCNT1, TCNT1=0
ldi     xl,byte1(restart-IRrip) ; 2.250 ms - Ripple
ldi     xh,byte2(restart-IRrip) ;
cp      zl,xl            ;  comparing  TCNT1 with starth constant !
cpc     zh,xh            ; 
brlo    IR_error         ; если меньше, чем 8,8 мс то ошибка, не наш протокол !
ldi     xl,byte1(restart+IRrip) ; 2.250 ms + Ripple
ldi     xh,byte2(restart+IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with starth constant !
cpc     zh,xh            ;
brsh    IR_N_start       ; если больше, чем 2.250 мс то проверяем нормальный старт
ldi     flags,  3        ; Flags = 3 (REPEAT command)
sts     IR_status,zero   ; Reset IR Status
rjmp    IR_check         ;


;************************;
IR_N_start:              ; NEC normal start 9 ms + 4.5 ms ! FLAGS = 3 !
ldi     xl,byte1(startl-IRrip) ; load 4.500 ms - Ripple
ldi     xh,byte2(startl-IRrip) ;
cp      zl,xl            ;  comparing  TCNT1 with starth constant !
cpc     zh,xh            ; 
brlo    IR_error         ; если меньше, чем 4.3 мс то ошибка, не наш протокол !
ldi     xl,byte1(startl+IRrip) ; load 4.500 ms + Ripple
ldi     xh,byte2(startl+IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with starth constant !
cpc     zh,xh            ;
brsh    IR_error         ; если больше, чем 4.7 мс то ошибка, не наш протокол !
ldi     flags, 4         ; Flags = 4

;************************; Success Receive
IR_ok:                   ;
lds     tmp,IR_cnt       ; Get INT0 counter
cpi     tmp,35           ; максимальное количество прерываний посылки пульта = 35 ! далее повторы по 3 прерывания
brsh    IR_check         ; => 35 - проверяем флаг повтора !

;************************; IR ADDRESS CHECK !
ldi    zl,low (IR_adr*2) ; IR address pointer
ldi    zh,high(IR_adr*2) ;
lpm     xl,z+            ;  X = NEC IR ADR 
lpm     xh,z             ;  xl <-- ADRL, xh <-- ADRH
;cp      adrl,xl          ;
;cpc     adrh,xh          ;
;brne    IR_adr_err       ; если адрес не совпадает,с указанным в программе, то в команду пишем FFH

rcall  IR_store          ; Store KEY's flag


;************************;
Exit:                    ; метка выхда из прерывания
pop     zh               ; извлечь ZH из STACK
pop     zl               ; извлечь ZL из STACK
pop     xh               ; извлечь XH из STACK
pop     xl               ; извлечь XL из STACK
pop     tmp              ; извлечь tmp из STACK
out     SREG,tmp         ; восстановить SREG
pop     tmp              ; извлечь tmp из STACK
reti                     ; выход из внешнего прерывания INT0





;************************;
IR_adr_err:              ; Ошибка принятого адреса от пульта IR
sts     nec,ones         ; сохраняем 255 в команду
rjmp    Exit             ; на выход из прерывания

;************************;
IR_error:                ; Не наш протокол, ошибка приема !
sts     IR_cnt,zero      ; Clear INT0 counter
mov     bytei,ones       ; NEC IR Command_INV  = FFH
mov     byten,ones       ; NEC IR Command_Nor  = FFH
mov     adrh,ones        ; NEC IR Address High = FFH
mov     adrl,ones        ; NEC IR Address Low  = FFH
;------------------------;
lds     tmp,EICRA        ; Get Interrupt settings
andi    tmp,0xFC         ; Clear bit 0
ori     tmp,0x02         ; INT0 - falling 02
sts     EICRA,tmp        ; Store INT0 setting
;------------------------;
;clr     flags            ; ERROR - 0
;sts     TCCR1B,zero      ; STOP Timer1
; Don't STOP Timer1 !!!  ; 
; Must be initialization ;
rjmp    Exit             ; на выход


IR_check:                ; Проверка статусов и адреса пульта !!!
sts     nec,byten        ; сохраняем байт команды !
sts     IR_cnt,zero      ; Clear INT0 counter
cpi     flags, 3         ; если статус = 0x03 то приняты данные
breq    IR_ok            ; идем на OK!
cpi     flags, 5         ; если статус = 0x05 то приняты данные
breq    IR_ok            ; идем на OK!
rjmp    IR_error         ; если флаг установлен, то не стираем данные


;************************;
GET_IR_data:             ; GET data [0...31]
rcall   Get_TCNT1        ; Z = TCNT1, TCNT1=0
IR_data_0:               ; Прием бита 0 (1.125ms)
ldi     xl,byte1(log0-IRrip) ; load 1.125 ms - Ripple
ldi     xh,byte2(log0-IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with log0 constant !
cpc     zh,xh            ;
brlo    IR_error         ; если меньше, чем 1,025 то не наш протокол, ошибка
;------------------------;
ldi     xl,byte1(log0+IRrip) ; load 1.125 ms + Ripple
ldi     xh,byte2(log0+IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with log0 constant !
cpc     zh,xh            ;
brsh    IR_data_1        ; если больше, чем 1,225 то принимаем лог 1
clr     tmp              ; Set received bit [0]
rjmp    SHR_32           ; Jump to store bit[N]
;------------------------;
IR_data_1:               ; Прием бита 1 (2,25ms)
ldi     xl,byte1(log1-IRrip) ; load 2.25 ms - Ripple
ldi     xh,byte2(log1-IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with log0 constant !
cpc     zh,xh            ;
brlo    IR_error         ; если меньше чем 2.15ms то не наш протокол, ошибка
;------------------------;
ldi     xl,byte1(log1+IRrip) ; load 2.25 ms + Ripple
ldi     xh,byte2(log1+IRrip) ;
cp      zl,xl            ; comparing  TCNT1 with log0 constant !
cpc     zh,xh            ;
brsh    IR_error         ; если больше чем 2.35ms то не наш протокол, ошибка
ldi     tmp,0b10000000   ; Set received bit [1]
;------------------------;
SHR_32:                  ; Shift Right 32bit WORD
clc                      ; DATA 32 bits = >> 1 LSB first !
lsr     bytei            ; bytei old
ror     byten            ; byten old
ror     adrh             ; adrh  old
ror     adrl             ; adrl  old
or      bytei,tmp        ; DATA = | Received bit; bytei old
ldi     flags,5          ; Flags = 5
rjmp    IR_ok            ; Jump to label IR_ok


;************************;
Get_TCNT1:               ; Z = TCNT1, TCNT1=0;
sts     TCCR1B,zero      ; STOP Timer1
cli                      ;
lds     zl,TCNT1L        ; Z = TCNT1
lds     zh,TCNT1H        ; Low conter must be read FIRST !
sts     TCNT1H,zero      ;
sts     TCNT1L,zero      ; TCNT1=0
sei                      ;
ldi     tmp,0x02         ; T1 Prescaller = F.osc / 8
sts     TCCR1B,tmp       ;
sts     ADCSRA,zero      ; Disable ADC interrupt mode
ret                      ; return

;************************;
; TIMER 1 Overflow       ;
T1_ovf:                  ;
sei                      ; Enable interrupts for DIMER
push    tmp              ; сохранить tmp в STACK
in      tmp,SREG         ; прочитать содержимое SREG в tmp
push    tmp              ; сохранить SREG в STACK
sts     IR_cnt,zero      ; Clear INT0 counter
;------------------------;
lds     tmp,IR_status    ; Get IR Repeat status
inc     tmp              ;
sts     IR_status,tmp    ; Store IR Repeat status
;cpi     tmp,3            ; If Status less than 3 ; 15 mhz
cpi     tmp,5            ; If Status less than 5 ; 22 mhz
brlo    T1_run           ; Don't Stop T1
;------------------------;
T1_stop:                 ;
sts     buttons,zero     ; Keys  =0
clr     Flags            ; Flags =0
sts     IR_status,zero   ;
sts     TCCR1B,zero      ; STOP Timer1
sts     TCNT1H,zero      ;
sts     TCNT1L,zero      ; TCNT1=0
sts     nec,ones         ; RAM NEC IR Command_Nor  = FFH
;
mov     bytei,ones       ; NEC IR Command_INV  = FFH
mov     byten,ones       ; NEC IR Command_Nor  = FFH
mov     adrh,ones        ; NEC IR Address High = FFH
mov     adrl,ones        ; NEC IR Address Low  = FFH
; Enable ADC interrupt
ldi     tmp,0xEF         ; Adc on interrupt mode Prescaller = 128
sts     ADCSRA, tmp      ;
;------------------------;
T1_run:                  ;
pop     tmp              ; извлечь tmp из STACK
out     SREG,tmp         ; восстановить SREG
pop     tmp              ; извлечь tmp из STACK
reti                     ; выход из прерывания  T1_ovf

;************************;
; END of NEC IR_receiver code


;**************************************************************************************************************************;
; NEC remote control
.org 0x3BE8

.db "NECIR Address:"
; NEC IR Address   L    H    ;
IR_adr:     .db 0x02,0xF9    ; OPENBOX S6 HD PVR

; RC openbox
IR_cmd:  ; up   dn    r    l   ok   mn
.db      0x00,0x01,0x02,0x03,0x1F,0x04,   0x0A,0x0C,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x4B,0x4A,0x49,0x48


; IR commands
;-----------------------;
.equ  ir_up        = 0
.equ  ir_down      = 1
.equ  ir_right     = 2
.equ  ir_left      = 3
.equ  ir_kok       = 4
.equ  ir_menu      = 5
;-----------------------;
.equ  ir_power     = 6
.equ  ir_mute      = 7
;-----------------------;
.equ  ir_key0      = 8
.equ  ir_key1      = 9   
.equ  ir_key2      = 10     
.equ  ir_key3      = 11   
.equ  ir_key4      = 12       
.equ  ir_key5      = 13     
.equ  ir_key6      = 14     
.equ  ir_key7      = 15       
.equ  ir_key8      = 16     
.equ  ir_key9      = 17
;-----------------------;
.equ  ir_keyred    = 18   
.equ  ir_keygreen  = 19 
.equ  ir_keyyello  = 20
.equ  ir_keyblue   = 21
;-----------------------;

.org 0x3BFE
jmp    RESET             ; Reset Handler

Список форумов » Разработка цифровых устройств » Уменьшенная библиотека IR-Remote для МК ATmega8
Перейти:  
Текущий раздел » Разработка цифровых устройств (FPGA, CPLD, PLD, ARM, AVR и т.д.)







Электроника
Прошивки и схемы на телевизоры, мониторы, dvd, телефоны. Schematic, Service Manual (mode), eeprom dumps Информация по ремонту для специалистов - справочники, инструкции, энциклопедия, советы и секреты ремонта,  настройка, сервисные режимы поиск и продажа электронных компонентов, магазины, datasheet, pdf, размещение в интернете рекламы на сайтах электронной тематики
Powered by phpBB 2.0.18 © 2001, 2002 phpBB Group!