Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IR NEC protocol для ATmega88
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
VAHOO
Всем привет! помогите пожалуйста, вот написал протокол для пульта NEC,
но непонятно работает, оригинал пульт у меня есть, сначало TSOP1736
подключил к саунд карту и на sound forge 7.0 считал импулси и написал
протокол, но когда на mega88 припаю инфракрас. диод и счытиваю на
sound forge 7.0, незнаю что получается, вот код, но очень строго не судите

/*****************************************************
Chip type : ATmega88
Clock frequency : 1,000000 MHz
*****************************************************/

#include <mega88.h>

unsigned int count=0,k=0;
unsigned char ac = 0x00, address = 0x00;
signed int i=0;
/* commands */
unsigned char playkey = 0x42;
/*
PORTB.0 OUT impuls
PORTB.1 button
address = 0b00000000
invers address = 0b11111111
commands play = 0b01000010
invers commands play = 0b10111101
*/

void one();
void zero();
void header();
void paket();
void play();

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xBA; // 560 mks ïðåðûâàíèå
count++;

}
void one() // visoki uroven

{

TIMSK0=0x01;
count = 0;
PORTB.0 = 0;
TCNT0=0xBA;

while (1) // 560mks

{ if(count == 1) break; };

PORTB.0 = 1;
count = 0;
TCNT0=0xBA;
while (1){ if(count == 3) break; }; // 2250 - 560 = 1690mks

TIMSK0=0x00;

}

void zero() // nizki uroven

{

TIMSK0=0x01;
count = 0;
PORTB.0 = 0;
TCNT0=0xBA;
while (1) { if(count == 1) break; }; // 560mks

PORTB.0 = 1;
count = 0;
TCNT0=0xBA;
while (1) { if(count == 1) break; }; // 560mks
TIMSK0=0x00;
}

void header()

{

count = 0;
PORTB.0 = 1;
TIMSK0=0x01;
TCNT0=0xBA;

while (1) { if (count == 16) break; }; // 9000 mks = 16 X 560

PORTB.0 = 0;
count = 0;
TCNT0=0xBA;

while (1) { if (count == 8) break; }; // 4500 mks = 8 X 560

TIMSK0=0x00;

}

void paket()

{

for (i = 7; i>-1; i--) // ðàçðàáîòàåò 8 áèò

{
k = (ac >> i) & 1;

if (k == 1)
{

one();

}

if (k == 0)
{

zero();

}
}
}


void play()

{ header();
ac = address;
paket();
ac = ~address;
paket();
ac = playkey;
paket();
ac = ~playkey;
paket(); }

void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB=0x00;
DDRB=0x01;

TCCR0A=0x00;
TCCR0B=0x02; // cpu div 8
TCNT0=0xBA;

ACSR=0x80;
ADCSRB=0x00;

#asm("sei")

PORTB.0 = 0;
PORTB.1 = 1;

while (1)
{

PINB.1 = 1;

if (PINB.1 == 0 )

{ play(); }

};
}
GDI
unsigned volatile int count=0 для начала. Хотя... таймер у вас используется только для формирования задержек, может лучше воспользоваться встроенными в компилятор функциями задержки? или хотя бы попробовать их.
VAHOO
Цитата(GDI @ Mar 28 2008, 15:43) *
unsigned volatile int count=0 для начала. Хотя... таймер у вас используется только для формирования задержек, может лучше воспользоваться встроенными в компилятор функциями задержки? или хотя бы попробовать их.


unsigned int count = 0 не помогло sad.gif , а задержки компилятора CODEVISION delay()
по моему не совсем точны
AST
Цитата(VAHOO @ Mar 28 2008, 14:15) *
Всем привет! помогите пожалуйста, вот написал протокол для пульта NEC,
но непонятно работает, оригинал пульт у меня есть, сначало TSOP1736
подключил к саунд карту и на sound forge 7.0 считал импулси и написал
протокол, но когда на mega88 припаю инфракрас. диод и счытиваю на
sound forge 7.0, незнаю что получается, вот код, но очень строго не судите

Если Вы хотите сделать свой пульт, то знайте, при передаче по ИК-каналу 0 и 1 передаются не просто выключенным или включенным ИК-диодом, а модулируется этими самими 0 и 1 несущая частота 30 - 40 кГц. То что Вы видете на выходе TSOP1736 это уже демодулированный сигнал. Посмотрите в сети информацию по работе пультов ИК.
UserM
Если вы хотите сделать пульт , то нужно смотреть что происходит на выходе чипа в пульте. А по поводу протокола посмотрите здесь:
http://www.sbprojects.com/knowledge/ir/nec.htm
VAHOO
а как задать частоту 38кгц?
поделитесь с примером если есть, на языке С,
AST
Цитата(VAHOO @ Mar 29 2008, 13:02) *
а как задать частоту 38кгц?
поделитесь с примером если есть, на языке С,

IMHO проще всего с помощью таймера. Во всех таймерах в вашем МК есть т.н. Output Compare Unit, с помощью которого можно сформировать нужные вам 38 кГц. А далее либо включать работу таймера для передачи 0, либо выключать для передачи 1.
VAHOO
Цитата(AST @ Mar 30 2008, 09:54) *
IMHO проще всего с помощью таймера. Во всех таймерах в вашем МК есть т.н. Output Compare Unit, с помощью которого можно сформировать нужные вам 38 кГц. А далее либо включать работу таймера для передачи 0, либо выключать для передачи 1.

за ответ спасибо! я могу настроить МК Output Compare Unit на 38кГц,
но я принцип не понимаю sad.gif, если можно кусочек кода
singlskv
Цитата(VAHOO @ Mar 30 2008, 20:45) *
за ответ спасибо! я могу настроить МК Output Compare Unit на 38кГц,
но я принцип не понимаю sad.gif, если можно кусочек кода
Принцип очень простой, если нужно 1 - передаем 38кГц нужное время,
если нужно 0 молчим нужное время...,
ну или наоборот(в смысле передачи 0 и 1)

кода не дам, патамушта выдергивать его из проектов долго, и у меня очень спецефическое
применение и на асм...
VAHOO
Цитата(singlskv @ Mar 30 2008, 22:38) *
Принцип очень простой, если нужно 1 - передаем 38кГц нужное время,
если нужно 0 молчим нужное время...,
ну или наоборот(в смысле передачи 0 и 1)

кода не дам, патамушта выдергивать его из проектов долго, и у меня очень спецефическое
применение и на асм...


ну вот здесь , если надо PORTB.0 = 1; место этого дать 38кГц?
а место PORTB.0 = 0; тоесть для логически 1 , 560мкс порту В.0 дать 38кГц и 1690мкс молчим,
для логически 0, 560мкс порту В.0 дать 38кГц и 560мкс молчим?

Нажмите для просмотра прикрепленного файла
singlskv
Цитата(VAHOO @ Mar 31 2008, 00:29) *
ну вот здесь , если надо PORTB.0 = 1; место этого дать 38кГц?
да, тока не зная как у Вас подключен диод, не могу говорить о том где логическая
единица а где физическая, разберитесь в этом сами...,
те когда нужно слать 38кГц (0 или 1) а когда не нужно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.