Страница 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 Ом . рядом работает