| Автор | Сообщение |
Arduino_ATmega8 Новичок Сообщения: 6
|
Привет!
Долго рыл интернет, чтобы запихать библиотеку IRremote в мегу8, с 8 кб памяти. Наконец нашел способ!
В библиотеке есть Файл IRremote.h
Удаляем из него все не нужные пульты, кроме той модели что будет использоваться для управления и сохраняем. После этих действий скетч влезет в 8 мегу!)
В чем плюс её использование- код становится до безобразия простой, не нужно настраивать регистра меги!
Может кому пригодится!
#include
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 Новичок Сообщения: 6
|
Никому не интересно?  |
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
Ну дык если никто ничего не написал...
А вот у меня возник вопрос ...
Помнится как то давно уже, лет может быть пятнадцать назад меня вштырило сделать собственную магнитолу с управлением на ИК и прочими премудростями. Ничего кроме PIC16F84 под рукой не было и я написал два кода. Один для процессора в магнитоле. Нужно было обеспечить параллельное управление механизмом, например счетчик импульсов автостопа, и конечно же "ловить" посылки с пульта при условии, что с приемника всегда лезет какая то хрень типа помех и шумов, воспринятых приемником "за свое".
В общем что в один процессор, что в другой все влезло без всяких проблем. Я даже не задумывался, что одной тысячи команд кода мне не хватит!
Так в чем заключается подвиг?
Я в принципе человек не злобный, но когда мне говорят, что из этого векового дуба может получиться не один, а целых два коробки спичек, у меня начинаются вопросы!

|
|
dsp155 Участник Сообщения: 1073
|
Васисуалий, Мню бы постигнуть arduinu... Писал сразу на bascom avr... Для пиков написал код декодера rc5 все работало...
В ардуине дохрена лишнего как я понял кроме загрузчика и отладчика
Хотя это не всегда является минусом. При отладке вроде плюс. Пару раз выручало. Но на платах discovery от STm.. Все гораздо проще..
Про ардуину. Ну как то так типа это все и работает...  |
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
| dsp155 писал: | | Для пиков написал код декодера rc5 все работало... |
Ну и вот? Смог С ТРУДОМ запихать это ЧУДО-ИЗОБРЕТЕНИЕ в восемь килобайт?
Или просто все залезло в килограмм пиковской Гарвардской памяти и даже не задумался об объеме?
Добавлено 04-01-2017 01:14
dsp155, я счас могу ляпнуть одну мысль, за которую меня тапками закидают! Но я считаю, что использование языков типа СИ и прочих универсальных или узкоспец подставлялок машинного кода вместо стихов А.С. Пушкина, должно быть очень осторожным и по возможности оправданным! А использование чужих библиотек, да еще и каких то там типа "универсальных" особенно случайно скачанных с тырнета за бесплатно, да еще и без всякой вразумительной документации и приводит к ситуации, когда в доме уже просто нет вообще ни одного устройства, в котором не обнаружены глюки! А когда становишься сам автором такого глюка потому, что вместо вдумчивой проработки задачи и написания пары десятков строк на АСМе тупо "лепишь горбатого на костылях" используя неизвестно чью библиотеку без описания и в результате вместо экономии времени получаешь головомойку в несколько бессонных ночей, то понимаешь простую истину - хочешь сделать хорошо, сделай сам! |
|
Konstantin_18 Участник Сообщения: 3394
|
| Васисуалий писал: | | использование чужих библиотек, да еще и каких то там типа "универсальных" особенно случайно скачанных с тырнета за бесплатно, да еще и без всякой вразумительной документации и приводит к ситуации, когда в доме уже просто нет вообще ни одного устройства, в котором не обнаружены глюки! |
Чужие библиотеки нужно использовать только как пример написания собственного кода.
А вот насчет С - не согласен.
Правильный компилятор не делает ПОЧТИ ничего лишнего, а жизнь сильно облегчает.
Насчет ПОЧТИ смотрим сгенерированный им ассемблерный промежуточный текст и делаем выводы, а если нужно - правим.
С ругают люди плохо его знающие.
ПС. Я его тоже плохо знаю, но пытаюсь узнать получше. |
|
dsp155 Участник Сообщения: 1073
|
| Васисуалий писал: | | dsp155 писал: | | Для пиков написал код декодера rc5 все работало... |
Ну и вот? Смог С ТРУДОМ запихать это ЧУДО-ИЗОБРЕТЕНИЕ в восемь килобайт?
Или просто все залезло в килограмм пиковской Гарвардской памяти и даже не задумался об объеме?
Добавлено 04-01-2017 01:14
dsp155, - хочешь сделать хорошо, сделай сам! |
Rc5 декодировал просто
Основная программа работает, разрешаем прерывания от rb0 .
После возникновения прерывания
Запрещаем прерывания.
принимаем
И записываем 2 стартовых бита
Адрес устройства и код кнопки каждое в свой регистр.
Если адрес сошелся.. То выполняем команду.
Проц был pic16f873. 4 kb flash.
В проге часы и термометр с двумя ds18b20.
С выводом на 4разрядный индикатор .индикация
Динамическая. Ещё килобайта полтора Флеша осталось...
В использовании чужих библиотек
Нет ничего зазорного, но если глючат приходится писать своё.
Писалось это в микро c.
В принципе если не проверять ошибки передачи
То в пол килобайта влезет. |
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
| dsp155 писал: | если не проверять ошибки передачи
То в пол килобайта влезет. |
А в RC5 чексумм передается? В прочем я не заморачивался. Ведь даже если вдруг примется что то не так, то это же не команда пуска баллистической ракеты! Ну сработает механизм не на перемотку, а на старт воспроизведения. В прочем я такого не заметил ни разу! Чаще бывало просто неприем команды, но это у любого телика или видака как за "здрассте". Короче мой код получился не лучше и не хуже любого кода в любом процессоре любого телика, а если брать современные шедевры программирования, так и лучше иных вышло! Главное сама программа декодирования занимала комманд двести или триста на АСМе. Программа для пульта вообще оказалась и того меньше, комманд до двухсот. Ну, понятно, что у меня всего то использовалось не более десятка команд, но даже если бы я их добавил, пусть даже и пару десятков, а больше и не надо, то все равно каждая новая команда, это от силы пара команд в опросе клавиш и еще пара команд в кодере посылки. Все равно за килограмм пиковсской памяти вылезти трудно. |
|
Murka Профессор Сообщения: 2340
|
Васисуалий, Чек сума нету, но условие включения/выключения прохождение двух подряд пакетов одной команды маркированных чёт/нечет ну или нечет/чёт. |
|
dsp155 Участник Сообщения: 1073
|
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
dsp155, вспомнил. Давно было, разбирался....  |
|
Arduino_ATmega8 Новичок Сообщения: 6
|
Прелесть библиотеки IR remote в том, что это готовая библиотека. там уже всё написано. Ненужно играть с регистрами счётчиками и прочим. Программный код получается до безумия простой. Но в самую распространенную 8-ю мегу он не влазил. Я долго искал путь как уменьшить и уменьшил. Вот решил поделится, тк в свое время весь русский и английский интернет перерыл в поисках таковой, т.к не смог настроить стетчики таймеры меги для декодирования ИР команд с пульта. И действительно примеров создания ик управления на 8 меги на СИ в интренете НЕТ
Если есть кидайте ссылки, но их пока нет) |
|
LDZ Участник Сообщения: 928
|
Arduino_ATmega8, СИ есть СИ... тут заморачиваться нечего...
берем любой линукс проект на СИ за основу и пишем на любой проц...
как угодно... хоть на СИ, хоть на АСМ... хто на что горазд...
искать конкретно на 8 мегу - глупо...
все давно придумано до нас... |
|
Arduino_ATmega8 Новичок Сообщения: 6
|
| LDZ писал: | Arduino_ATmega8, СИ есть СИ... тут заморачиваться нечего...
берем любой линукс проект на СИ за основу и пишем на любой проц...
как угодно... хоть на СИ, хоть на АСМ... хто на что горазд...
искать конкретно на 8 мегу - глупо...
все давно придумано до нас... |
Регистры и счётчики у всех МК разные. И обращятся ним нужно по разному. А код и будет основан в в основном на управлении счётчиков. Это значит весь когд нужно переделывать под конкретно Мегу8.
Не все это сделают, а потом ещй компилятор на непонятные мелочи начнет ругатся.
А тут получается очень простой когд, из-за библиотеки IR Remote. Тут для нас уже годовая переменная с полученным кодом.
Добавлено 08-01-2017 09:56
Это как собирать УНЧ на транзисторах с кучей обвязки и расчётов, либо взять TDA2030 готовую. Что удобней?) |
|
LDZ Участник Сообщения: 928
|
ну, сделал и сделал... молодец...
я чего влез то, восьмая мега для меня умерла просто... давно...
в паре проектов на ней, со временем перестал запускаться тактовый... на температуре чуть отличной от комнатной...
посему твое упорство позабавило... я бегу от нее, а ты наоборот в нее лезешь...  |
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
| LDZ писал: | ну, сделал и сделал... молодец...  |
Таки да! Я в таких случаях люблю говорить - победителей не судят! Работает, значит прав!
Однако остаются и вопросы и замечания!
Добавлено 08-01-2017 14:09
| Arduino_ATmega8 писал: |
Регистры и счётчики у всех МК разные. И обращятся ним нужно по разному. А код и будет основан в в основном на управлении счётчиков. Это значит весь код нужно переделывать под конкретно Мегу8. |
И чего ты уперся в Мегу8? А если взять ПИК или СТМ8? Что изменится?
А с другой стороны, что значит разные регистры? Да у всех повально контроллеров примерно одинаковое строение регистров! Тут большую сумятицу в дело вносят не разные "принципы", потому что они одинаковые, а скорее разное название регистров по собственной классификации производителя. Но в сути все регистры во всех процессорах выглядят одинаково:
1. сам регистр
2. маска регистра вход\выход
3. маска регистра подтягивающих резисторов (или один общий бит, включающий сразу все резики на всех ногах регистра)
4. маска режимов "наложенных" на регистры разных спец-портов, АЦП, ЦАП, УАРТ, И2Ц, и прочих.
Последние три пункта как правило устанавливаются в первых строках программы еще на этапе инициализации после жесткого ресета, а первый пункт и есть сам регистр. Им пользуйся согласно задачи. Что тут разного или уникального?
Сложнее? Ну в чем? У СТМ32Ф4... регистров больше? Да! Потому, что мало того, что самих портов много, так еще на каждый порт наложены самые разные дополнительные периферийные интерфейсы. Но это только в начале! Просто при инициализации надо вдумчиво определиться со всеми параметрами всех регистров и потом "очистив" процессор от излишеств пиши себе что угодно!
Счетчики? Посмотри на фотку великого и ужасного Билла Гейтса чуть выше в этой теме! Постарайся написать программу так, что бы потом тебе не пришлось обьяснять принцип ее действия с таким же лицом!


|
|
dsp155 Участник Сообщения: 1073
|
Arduino_ATmega8, вопрос сколько килобайт занял код ? |
|
Arduino_ATmega8 Новичок Сообщения: 6
|
|
dsp155 Участник Сообщения: 1073
|
слишком большой обьем кода. так в килобайт влезает если на асме или C писать. Интересно спасибо! |
|
Васисуалий monitor.net.ru  Сообщения: 3539
|
| 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 Сообщения: 8043
|
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
;sts EICRA,tmp ;
;ldi tmp,(1
;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
;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
;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
|
|
|
LDZ Участник Сообщения: 928
|
ради инереса глянул свое...
| Код: | 8 162 bytes of CODE memory
|
весь проект на си...
в проекте:
управление цапом посредством пульта...
вывод инфо на люминесцентный дисплей...
по логу у меня
| Код: | 410 bytes in segment CODE
6 bytes in segment INITTAB
70 bytes in segment NEAR_Z
410 bytes of CODE memory (+ 6 bytes shared)
70 bytes of DATA memory
Errors: none
Warnings: none |
нек код...
плюс отдельно прерывания...
| Код: | Segment part sizes:
Bytes Function/Label
----- --------------
188 IR_INT0
4 IR_INT0::??INTVEC 4
1 _A_MCUCR
1 _A_TCCR2
1 _A_TCNT2
1 cnt
1 ovf
100 time1_ovf
4 time1_ovf::??INTVEC 36
6 -- Other
3 bytes in segment ABSOLUTE
288 bytes in segment CODE
6 bytes in segment INITTAB
8 bytes in segment INTVEC
2 bytes in segment NEAR_Z
288 bytes of CODE memory (+ 14 bytes shared)
2 bytes of DATA memory (+ 3 bytes shared)
Errors: none
Warnings: none |
 |
|
dsp155 Участник Сообщения: 1073
|
| LDZ писал: |
ради инереса глянул свое...
| Код: | 8 162 bytes of CODE memory
|
весь проект на си...
в проекте:
управление цапом посредством пульта...
вывод инфо на люминесцентный дисплей...
по логу у меня
| Код: | 410 bytes in segment CODE
6 bytes in segment INITTAB
70 bytes in segment NEAR_Z
410 bytes of CODE memory (+ 6 bytes shared)
70 bytes of DATA memory
Errors: none
Warnings: none |
нек код...
плюс отдельно прерывания...
| Код: | Segment part sizes:
Bytes Function/Label
----- --------------
188 IR_INT0
4 IR_INT0::??INTVEC 4
1 _A_MCUCR
1 _A_TCCR2
1 _A_TCNT2
1 cnt
1 ovf
100 time1_ovf
4 time1_ovf::??INTVEC 36
6 -- Other
3 bytes in segment ABSOLUTE
288 bytes in segment CODE
6 bytes in segment INITTAB
8 bytes in segment INTVEC
2 bytes in segment NEAR_Z
288 bytes of CODE memory (+ 14 bytes shared)
2 bytes of DATA memory (+ 3 bytes shared)
Errors: none
Warnings: none |
 |
Что тыхотел этим сказать?
Исходников не видно, и управление цапом , видится 500 байт ну килобайт уже много.,,
Какая среда разработки и что требуется? |
|
dsp155 Участник Сообщения: 1073
|
LDZ, только не ардуино.,....пробовал работает, удобно, но тормозит...не в обиду но в некоторых проектах надо быстрее....
Asm, C# там рулят... Имхо.
Легко отлаживать потом переписываешь на C#, иногда местами ASM... И все путем....
Более быстрые процы для более сложных задач и дисплеев тфт с гуй.,...
Добавлено 24-06-2017 04:58
pavel-pervomaysk, в обработчике прерывания декодируется? |
|
LDZ Участник Сообщения: 928
|
dsp155, чего хотел сказать...
ничего... просто не вижу в каком месте Уменьшенная библиотека IR-Remote уменьшена...
зы... а если честно... хочу сказать следующее...
молодцы вы, хлопцы...
есть какой то интерес, хобби... так держать!
да еще и ассемблер... я уже давно не пишу на нем...
хотя и пользуюсь своими прежними наработками...
сорри, если кого задел...  |
|
dsp155 Участник Сообщения: 1073
|
LDZ, Понятно! Хобби как то в жизнь разнообразия добавляет.  |
|
pavel-pervomaysk Your editor Сообщения: 8043
|
dsp155, я не совсем понял суть твоего вопроса. Что декодировать собрался? Адрес совпал - наш пульт. Приняли команду, обработали.
Это готовый код для NEC IR, коменты есть, разбирайся. |
|
smart_pic Новичок Сообщения: 3
|
Для PIC18F67J60 написал программу декодирования кодов пультов системы NEC , RC5. Там всего немного кода на С. Для PIC18F252 делал на ASM - вообще минимум кода. декодер ИК на PIC18F67J60 имеет ВЕБ интерфейс, легко обучается под любой пульт, можно даже несколько пультов завести. Можно использовать как перекодировщик ИК команд управления. Тормозов нет.
Немного описал здесь http://www.yakorev.com |
|
dsp155 Участник Сообщения: 1073
|
| pavel-pervomaysk писал: | dsp155, я не совсем понял суть твоего вопроса. Что декодировать собрался? Адрес совпал - наш пульт. Приняли команду, обработали.
Это готовый код для NEC IR, коменты есть, разбирайся. |
Да ты что ... С рце 5 я давно разобрался...
Писалось на асме а потом на си. Усе работает у меня нет вопросов.  |
|
antonluba Участник Сообщения: 611
|
|
smart_pic Новичок Сообщения: 3
|
Решил добавить фото грабера ИК кодов с ВЕБ интерфейсом . Есть возможность формировать ИК команды, настраивая свои длительности через ВЕБ.
Работает распознавание команд, практически любых пультов. Код пульта отображается на ВЕБ, передается по ТСР или RS485. При использовании двух устройств можно использовать как ретранслятор ИК команд по ТСР. Питание По РОЕ.


ВЕБ формирователя ИК команд.JPG 85,5 КБ Скачано: 68 раз(а)
IR graber.jpg 77,19 КБ Скачано: 61 раз(а)
|
|
|
Текущий раздел»
Разработка цифровых устройств (FPGA, CPLD, PLD, ARM, AVR и т.д.)
|
|
|