IR-пуль по NEC протоколу на мк attiny13

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Rhonstin
Родился
Сообщения: 5
Зарегистрирован: Вт окт 04, 2016 23:12:58

IR-пуль по NEC протоколу на мк attiny13

Сообщение Rhonstin »

Доброго времени суток, захотелось мне сделать на мк однокнопочный пульт управления, считал код с нужной мне кнопки. Вышел такой "EF30CF" под тот что описан на ассемблере его не вставить, нашел под arduino код без бибилотек и под ним он работает, а вот под attiny переделать кроме смены ноги ничего не сделать не могу. Прошу у вас помощи, из кода подозреваю проблема в делеях
Код из Arduino IDE
Спойлер#include <avr/delay.h>
#include <avr/io.h>
#define IRLEDpin 3 //the arduino pin connected to IR LED to ground. HIGH=LED ON
#define BITtime 562 //length of the carrier bit in microseconds
//put your own code here - 4 bytes (ADDR1 | ADDR2 | COMMAND1 | COMMAND2)
unsigned long IRcode=0b111011110011000011001111;

// SOME CODES:
// Canon WL-D89 video remote START/STOP button = 0b11000001110001111100000000111111


void IRsetup(void)
{
pinMode(IRLEDpin, OUTPUT);
digitalWrite(IRLEDpin, LOW); //turn off IR LED to start
}

// Ouput the 38KHz carrier frequency for the required time in microseconds
// This is timing critial and just do-able on an Arduino using the standard I/O functions.
// If you are using interrupts, ensure they disabled for the duration.
void IRcarrier(unsigned int IRtimemicroseconds)
{
for(int i=0; i < (IRtimemicroseconds / 26); i++)
{
digitalWrite(IRLEDpin, HIGH); //turn on the IR LED
//NOTE: digitalWrite takes about 3.5us to execute, so we need to factor that into the timing.
delayMicroseconds(9); //delay for 13us (9us + digitalWrite), half the carrier frequnecy
digitalWrite(IRLEDpin, LOW); //turn off the IR LED
delayMicroseconds(9); //delay for 13us (9us + digitalWrite), half the carrier frequnecy
}
}

//Sends the IR code in 4 byte NEC format
void IRsendCode(unsigned long code)
{
//send the leading pulse
IRcarrier(9000); //9ms of carrier
delayMicroseconds(4500); //4.5ms of silence

//send the user defined 4 byte/32bit code
for (int i=0; i<32; i++) //send all 4 bytes or 32 bits
{
IRcarrier(BITtime); //turn on the carrier for one bit time
if (code & 0x80000000) //get the current bit by masking all but the MSB
delayMicroseconds(3 * BITtime); //a HIGH is 3 bit time periods
else
delayMicroseconds(BITtime); //a LOW is only 1 bit time period
code<<=1; //shift to the next bit for this byte
}
IRcarrier(BITtime); //send a single STOP bit.
}

int main(void)
{
pinMode(3, OUTPUT);
IRsetup();
while(1)
{
IRsendCode(IRcode);
_delay_ms(1000);
}

}
Реклама
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение ptr128 »

Rhonstin писал(а):под arduino код без бибилотек и под ним он работает, а вот под attiny переделать
А кто запрещает ATiny13 на 16МГц запустить?
А если очень хочется на более низкой частоте, то да, все задержки надо скурпулезно пересчитывать, выведя, предварительно, ассемблерыный листинг, чтобы учесть время на выполнение команд.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Mishany »

Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Novice user »

я тоже делал,но на си,только вкл и отк телевизора,ниже просто перебор команд по кругу(адрес =2)
Спойлер/*Chip type : ATtiny13A
AVR Core Clock frequency: 4,800000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/

#include <tiny13a.h>
#include <delay.h>
#define PulseON TCCR0A=0x42;TCCR0B=0x01
#define PulseOFF TCCR0A=0x00;TCCR0B=0x00
unsigned char com=0;
void Gen_NEC_Byte(unsigned char dat) //Генерация одного байта по NEC
{
unsigned char i;
for(i=0;i<8;i++) {PulseON; //подать частоту 36000
delay_us(540);
PulseOFF; //выключить частоту 36000
if(dat&1)delay_us(1629);//если бит = 1 то ждем 1,58 мс
else delay_us(540); //если бит = 0 то ждем 0,46 мс
dat>>=1; }}
void Gen_NEC_Code(unsigned char adr, unsigned char cmd) // Генерация всей комманды по NEC
{ PulseON; // стартовая последовательность
delay_us(8678);
PulseOFF;
delay_us(4339);
Gen_NEC_Byte(adr); // генерация адресса
Gen_NEC_Byte(~adr); // генерация инверсии адресса
Gen_NEC_Byte(cmd); // генерация комманды
Gen_NEC_Byte(~cmd); // генерация инверсии комманды
PulseON; // завершающий синхроимпульс
delay_us(660);
PulseOFF;}



void main(void)
{#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x00;
DDRB=0x01;
TCCR0A=0x42;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x3F;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK0=0x00;
ACSR=0x80;
ADCSRB=0x00;

while (1)
{Gen_NEC_Code(128,com);
com++;
delay_ms(150);

};
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18637
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение ARV »

ptr128 писал(а):А кто запрещает ATiny13 на 16МГц запустить?
даташит?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение ptr128 »

ARV писал(а):
ptr128 писал(а):А кто запрещает ATiny13 на 16МГц запустить?
даташит?
Да нет. Если ATiny13V ограничен 10МГц, то ATiny13, при напряжении питания от 4.5 до 5.5 вольт, допускает до 20МГц.
http://www.atmel.com/images/doc2535.pdf
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18637
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение ARV »

вы не поняли: тинька не имеет встроенных средств для тактирования с такой частотой. делать внешний тактовый генератор - это уже извращение, т.к. при любом раскладе и по размерам, и по цене будет больше тиньки. т.е. в этом случае разумнее брать не тиньку, а нечто иное... или хотя бы не тини13, а тини25/45 или вообще тини861 :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Rhonstin
Родился
Сообщения: 5
Зарегистрирован: Вт окт 04, 2016 23:12:58

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Rhonstin »

У меня возникает проблема только в том что во всех реализациях, код кнопки из 2 значных составляющих, в то время как у меня 6 знаков, в коде я могу разобраться
Так же имеется tiny2313
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Novice user »

я вам дал код,рабочий,он как раз для вашего случая
у вас EF30CF
первый байт EF -адрес устройства
второй байт 30 -команда устройства(00110000)
третий бай CF -команда устройства в инверсии(11001111)
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Zhuk72 »

Это не две и не шесть составляющих.
Нековский протокол содержит 2 (в стандартном варианте) или 3 (в расширенном варианте) байта.
В первом случае передается адрес, затем его инверсия, команда и ее инверсия, т.е. нужно только 2 байта.
Во втором случае передают младший, затем старший байт адреса, затем команда и в конце ее инверсия. Всего 3 байта.

Теория.

Чем вы вообще считали эти байты?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Rhonstin
Родился
Сообщения: 5
Зарегистрирован: Вт окт 04, 2016 23:12:58

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Rhonstin »

Считывал с помощью Arduino и vs1838b
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение Mishany »

Есть успехи запуска на тини13?
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение 12val12 »

Сделал полгода назад с нуля код с целью автоматического захода в сервис меню и factory reset
протокол у телика был как раз класический NEC
там ATtiny24A

НО управление чисто софтовыми задержками . без таймеров
а значит пойдет любой АVR c тактовой от 8мГц (возможно и 4 но тогда на пару процентов уйдут тайминги относительно стандартных)
всего то нужно изменить дефайны
#define LED_ON PORTB.0 =1; /// Пин куда подключен светодиод
#define LED_OFF PORTB.0 =0;

Для наглядности в ходе тестов можно брать белый изи красный светодиод
вблизи будет срабатывать .В конце поставить инфракрасный
Адрес девайса можно узнать сторонними программами типа RCExplorer
имея родной пульт
в моем случае адрес 0x40 (одно из шасси Vestel)

Программа вне зависимости от состояния ТВ его вкключает ждет загрузку входит в сервис меню и делает фатори ресет


Код: Выделить всё

/*******************************************************
This program was created by the
CodeWizardAVR V3.10 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date : 20.03.2016
Author : 
Company : 
Comments: 


Chip type : ATtiny24A
AVR Core Clock frequency: 8,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*******************************************************/

#include 
#include 

// Declare your global variables here
unsigned int k;
#define LED_ON PORTB.0 =1;
#define LED_OFF PORTB.0 =0; 

void IR_4Byte_OUT (unsigned char adr_in,unsigned char cmd_in ) ; 
void ReP_OUT () ;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{



// Reinitialize Timer 0 value
TCNT0=0x29;
// Place your code here

}


void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1< 
// delay_ms(38); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(96); 
// ReP_OUT () ; 
// delay_ms(12000); 
// IR_4Byte_OUT(0x40,0x12); // on/off
// IR_4Byte_OUT(0x40,0x43); // exit
// IR_4Byte_OUT(0x40,0x14); // sourse

delay_ms(8000); 
IR_4Byte_OUT(0x40,0x01); // 1 
delay_ms(38); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 

delay_ms(600); 
IR_4Byte_OUT(0x40,0x43); // exit
delay_ms(600); 
IR_4Byte_OUT(0x40,0x43); // exit


delay_ms(17000); 
IR_4Byte_OUT(0x40,0x5b); //menu
delay_ms(40); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(96); 
ReP_OUT () ; 
delay_ms(900); 

IR_4Byte_OUT(0x40,0x04); 
delay_ms(400); 
IR_4Byte_OUT(0x40,0x07);
delay_ms(400);
IR_4Byte_OUT(0x40,0x02); 
delay_ms(400);
IR_4Byte_OUT(0x40,0x05); 
delay_ms(900);

IR_4Byte_OUT(0x40,0x40); //--> 
delay_ms(600); 
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600); 
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600); 
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600); 
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600);
IR_4Byte_OUT(0x40,0x1d);
delay_ms(600); 
IR_4Byte_OUT(0x40,0x21); //ok
delay_ms(600); 

IR_4Byte_OUT(0x40,0x43); // exit 
delay_ms(600); 
IR_4Byte_OUT(0x40,0x43); // exit 
delay_ms(2000); 


IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x14); // sourse
delay_ms(600); 
IR_4Byte_OUT(0x40,0x21); //ok 

// IR_4Byte_OUT(0x40,0x40); //--> 
// delay_ms(60000);
// IR_4Byte_OUT(0x40,0x42); //<-- 
// delay_ms(1000);
// delay_ms(40); 
// ReP_OUT () ;
// PORTB.2=0;


}


}

//
void IR_4Byte_OUT (unsigned char adr_in,unsigned char cmd_in ) 
{

unsigned char bitcnt; 
unsigned char adr_store; 
unsigned char cmd_store;
unsigned char counter; 
adr_store=adr_in;cmd_store=cmd_in; 
for (counter=0;counter<255;counter++) //9000 uSec block len ((255+78)* (7+19))
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 
for (counter=0;counter<78;counter++) 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 
delay_us(1000); delay_us(1000); delay_us(1000); delay_us(1000); delay_us(490); //4500u Sec pause 

// adress transmitt 
for (bitcnt=0; bitcnt<8; bitcnt++)
{ for (counter=0;counter<21;counter++) //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 560uSec; carier 38kHz ; Duty cycle 1/3. 
if ((adr_in & 0x01)==0x01) {delay_us(1689);} //1 pause 1690 uS
else {delay_us(559);} // 0 pause 560 uS
adr_in=adr_in>>1; 
} 
adr_in= adr_store; 
for (bitcnt=0; bitcnt<8; bitcnt++)
{ for (counter=0;counter<21;counter++) //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 560uSec; carier 38kHz ; Duty cycle 1/3. 
if ((adr_in & 0x01)==0x01) {delay_us(559);} //invert pause
else {delay_us(1689);} 
adr_in=adr_in>>1; 
} 
// command transmitt 
for (bitcnt=0; bitcnt<8; bitcnt++)
{ for (counter=0;counter<21;counter++) //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 560uSec; carier 38kHz ; Duty cycle 1/3. 
if ((cmd_in & 0x01)==0x01) {delay_us(1689);} //1 pause 1690 uS
else {delay_us(559);} // 0 pause 560 uS
cmd_in=cmd_in>>1; 
} 
cmd_in= cmd_store; 
for (bitcnt=0; bitcnt<8; bitcnt++)
{ for (counter=0;counter<21;counter++) //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 560uSec; carier 38kHz ; Duty cycle 1/3. 
if ((cmd_in & 0x01)==0x01) {delay_us(559);} //invert pause
else {delay_us(1689);} 
cmd_in=cmd_in>>1; 
}
// final 562.5µs pulse burst to signify the end of message transmission.
for (counter=0;counter<21;counter++) // //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 
}
void ReP_OUT () 
{ 
unsigned char counter; 
for (counter=0;counter<255;counter++) //9000 uSec block len ((255+80)* (7+19))
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 
for (counter=0;counter<78;counter++) 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 

delay_us(1000); delay_us(1000); delay_us(230); //2250u Sec pause 

// final 562.5µs pulse burst to signify the end of message transmission.
for (counter=0;counter<21;counter++) // //26 uSec =T 38kHz //560 uSec block len /21 pulse 
{ LED_ON; delay_us(7); LED_OFF; delay_us(19); } //led blink 38kHz ; Duty cycle 1/3.5 


}
ух ты.... показывает
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Re: IR-пуль по NEC протоколу на мк attiny13

Сообщение 12val12 »

Пригодилось телевизор на чилдлок и не было пульта а команда входа в подменю специфическая/
нашел пербором в цикле
если есть пульт хоть что-то делающий с аппаратом то можно узнать адрес с помощью RCexplorer

на порт обычный красный светик через 68 Ом . рядом работает
Вложения
2017-02-21 00-14-25 RCExplorer v2.2.0.1.png
(62.94 КБ) 535 скачиваний
ух ты.... показывает
Ответить

Вернуться в «Разные вопросы по МК»