Страница 1 из 1

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

Добавлено: Чт окт 06, 2016 15:38:56
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);
}

}

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

Добавлено: Чт окт 06, 2016 21:42:23
ptr128
Rhonstin писал(а):под arduino код без бибилотек и под ним он работает, а вот под attiny переделать
А кто запрещает ATiny13 на 16МГц запустить?
А если очень хочется на более низкой частоте, то да, все задержки надо скурпулезно пересчитывать, выведя, предварительно, ассемблерыный листинг, чтобы учесть время на выполнение команд.

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

Добавлено: Чт окт 06, 2016 23:11:06
Mishany

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

Добавлено: Пт окт 07, 2016 06:29:23
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);

};
}

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

Добавлено: Пт окт 07, 2016 07:25:45
ARV
ptr128 писал(а):А кто запрещает ATiny13 на 16МГц запустить?
даташит?

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

Добавлено: Пт окт 07, 2016 07:36:59
ptr128
ARV писал(а):
ptr128 писал(а):А кто запрещает ATiny13 на 16МГц запустить?
даташит?
Да нет. Если ATiny13V ограничен 10МГц, то ATiny13, при напряжении питания от 4.5 до 5.5 вольт, допускает до 20МГц.
http://www.atmel.com/images/doc2535.pdf

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

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

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

Добавлено: Пт окт 07, 2016 11:36:05
Rhonstin
У меня возникает проблема только в том что во всех реализациях, код кнопки из 2 значных составляющих, в то время как у меня 6 знаков, в коде я могу разобраться
Так же имеется tiny2313

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

Добавлено: Пт окт 07, 2016 18:08:45
Novice user
я вам дал код,рабочий,он как раз для вашего случая
у вас EF30CF
первый байт EF -адрес устройства
второй байт 30 -команда устройства(00110000)
третий бай CF -команда устройства в инверсии(11001111)

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

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

Теория.

Чем вы вообще считали эти байты?

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

Добавлено: Пт окт 07, 2016 20:21:37
Rhonstin
Считывал с помощью Arduino и vs1838b

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

Добавлено: Сб окт 08, 2016 07:05:20
Mishany
Есть успехи запуска на тини13?

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

Добавлено: Пт ноя 04, 2016 22:13:13
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 


}

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

Добавлено: Вт фев 21, 2017 00:12:15
12val12
Пригодилось телевизор на чилдлок и не было пульта а команда входа в подменю специфическая/
нашел пербором в цикле
если есть пульт хоть что-то делающий с аппаратом то можно узнать адрес с помощью RCexplorer

на порт обычный красный светик через 68 Ом . рядом работает