Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/110: Рейтинг темы: голосов - 110, средняя оценка - 4.78
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
1

ИК-пульт на Attiny13

22.04.2014, 15:00. Просмотров 19980. Ответов 34
Метки нет (Все метки)

Короче делаю ИК-пульт на тиньке 13. Код отлажевал на пинборде атмега16, там все работает, начал портировать в тиньку, а там уже не работает. Даташит уже снится, не могу понять в чем я туплю.
Вот схема пульта. Питается от 3 вольтовой батарейки-таблетки.
http://rodykoty.ru/full/2014/4/23/96...-full.png.html
main.c
Код
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include "Timer.h"
#include "Ports_init.h"

#define Cmd_DEV          128                     //Назва девайса по протоколу NEC
#define Cmd_VOL_Ptus    136                     //Команди
#define Cmd_VOL_Minus     64
#define Cmd_INPUT        32
#define Cmd_Mute         8

//Обявляєм функції
void TransmitCmnd (char, char);
void TransmitByte (char);
void FreqOn  (void);
void FreqOff (void);

int main(void)
{
button_init();                        //Ініт кнопок
IR_dyod_init();                        //Ініт ІЧ-діода
FreqOff();

while(1)
{

if (~Btn_PIN&(Btn_VOL_Ptus))                     //Button VOL+
{
while(Btn_PIN&(Btn_VOL_Ptus)) _delay_ms(20);
_delay_ms(20);
TransmitCmnd(Cmd_DEV, Cmd_VOL_Ptus);

//set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //Вхів в режим сну
//sleep_mode();

}
if (~Btn_PIN&(Btn_VOL_Minus))                     //Button VOL-
{
while(Btn_PIN&(Btn_VOL_Minus)) _delay_ms(20);
_delay_ms(20);
TransmitCmnd(Cmd_DEV, Cmd_VOL_Minus);

//set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //Вхів в режим сну
//sleep_mode();

}
if (~Btn_PIN&(Btn_Input))                     //Button INPUT
{
while(Btn_PIN&(Btn_Input)) _delay_ms(20);
_delay_ms(20);
TransmitCmnd(Cmd_DEV, Cmd_INPUT);

//set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //Вхів в режим сну
//sleep_mode();
}
if (~Btn_PIN&(Btn_Mute))                     //Button MUTE
{
while(Btn_PIN&(Btn_Mute)) _delay_ms(20);
_delay_ms(20);
TransmitCmnd(Cmd_DEV, Cmd_Mute);

//set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //Вхів в режим сну
//sleep_mode();
}

}
}

void TransmitCmnd (char divice, char sommomd)
{

//стартовый импульс
IR_PORT &= ~IR_Line;                     //сбросить прямой вывод
FreqOn ();                              //подать частоту 36000
_delay_us (9000);                        //ждем 9 мс

IR_PORT |= IR_Line;                        //установить прямой вывод
FreqOff ();                              //выключить частоту 36000
_delay_us (4400);                        //ждем 4,4 мс

//передача команды
TransmitByte (divice);                     //прямой адрес устройства
TransmitByte (~divice);                     //инверсный адрес устройства
TransmitByte (sommomd);                     //прямая команда
TransmitByte (~sommomd);                  //инверсная команда

//завершающий импульс
IR_PORT &= ~IR_Line;                     //сбросить прямой вывод
FreqOn ();                              //подать частоту 36000
_delay_us (660);                        //ждем 0,66 мс

IR_PORT |= IR_Line;                        //установить прямой вывод
FreqOff ();                              //выключить частоту 36000

}

//вывод байта по каналу IR
//byte - байт данных
void TransmitByte (char byte)
{
for (char i=0; i<8; i++){

IR_PORT &= ~IR_Line;                  //сбросить прямой вывод
FreqOn ();                           //подать частоту 36000
_delay_us (660);                     //пауза 0,66 мс

IR_PORT |= IR_Line;                     //установить прямой вывод
FreqOff ();                           //выключить частоту 36000
if (byte & 0x80)                     //ждем
_delay_us (1580);                     //если бит = 1 то 1,58 мс
else
_delay_us (460);                     //если бит = 0 то 0,46 мс

byte <<= 1;                           //сдвинуть биты
}
}
Ports_init.h
Код
/*
* Buttons.h
*
* Created: 21.03.2014 23:33:37
*  Author: Taras
*/
//IR Diode port defymitions
#define IR_PORT    PORTB
#define IR_PIN       PINB
#define IR_DDR       DDRB
#define IR_HF_Line    (1<<0)                      //PB0-for freq
#define IR_Line    (1<<0)                      //PB1-for delays

#define Btn_PORT PORTB
#define Btn_PIN PINB
#define Btn_DDR DDRB
#define Btn_VOL_Ptus    (1<<1)
#define Btn_VOL_Minus   (1<<2)
#define Btn_Mute      (1<<3)
#define Btn_Input      (1<<4)

void button_init()
{
Btn_DDR&=~(Btn_VOL_Ptus)&~(Btn_VOL_Minus)&~(Btn_Mute)&~(Btn_Input);               //Вхід на кнопку
PORTB|=(Btn_VOL_Ptus)|(Btn_VOL_Minus)|(Btn_Mute)|(Btn_Input);               //Підтяжка кнопки відсутня, зовнішня підтяжка
}

void IR_dyod_init(void)
{
IR_DDR |= (IR_Line | IR_HF_Line);            //IR_Diod init
IR_PORT |= IR_Line;
}
Timer.c
Код
void FreqOn (void)
{
TCCR0B = (1<<FOC0A)                  //принудительное изменение состояния вывода при совпадении
|(1<<CS00)|(0<<CS01)|(0<<CS02);         //прямое тактирование от генератора
TCCR0A=(1<<COM0A0)|(0<<COM0A1)            //состояние вывода меняется на противоположное
|(0<<WGM00)|(1<<WGM01)|(0<<WGM02);       //режим CTC (сброс при совпадении)

TCNT0 = 0;                         //просто обнулил счетный регистр
OCR0A = 133;                      //при достижении этого значения(133) в счетном регистре будет сброс и переключение ОС2
}

void FreqOff (void)
{
TCCR0B = 0;                        //выключить генератор 36000 Hz
PORTB=(0<<0);                     //высокочастотный вывод сбросить
}
Контролер работает на частоте 9.6 мГц
Таймер настроен на генерацию частоти 36кГц
Еще хочу чтоб после нажатия кнопки, контролер переходил в сон. Но после первого нажатия, он больше не просыпается.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2014, 15:00
Ответы с готовыми решениями:

Пульт 2.4 ГГц трансформировать в пульт управления к ПК
Хочу купить квадрокоптер сразу а не ждать месяц с китая. Поэтому в моделях ограничен каталогом...

USBasp & ATtiny13
Уважаемые форумчане, подскажите где я туплю. Честно пытался разобраться сам три дня, но не...

PWM на Attiny13
Никогда не занимался атмелами, разве что залить прошивку или подправить что-нибуть по мелочам, а...

ATTiny13 - не "выключается"
Всем привет. Подскажите, плз, совсем сломал себе голову Есть такая простая схема ...

Таймер Attiny13
Здравствуйте! Хочу разобраться с таймером. По нажатию кнопки светодиод должен гореть примерно 5...

34
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
24.04.2014, 16:01 21
Ок, спасибо за советы. Про результат отпешусь, как только закончю експеременты.
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
21.08.2014, 14:56 22
Дошли руки снова до моего пульта. Переделал, вроде как думал без ошибок, но теперь вылезли другие грабли.
И так переписал код чтоб обработчик кнопок был внутри прерывания PCINT, что позволяет тиньке глубоко спать. При нажатии на одну из четырех кнопок, срабатывает прерывание, выводит тиньку из сна, ищет какая кнопка была нажата, выполняет условие даной кнопки, продолжает дальше спать.
Корпус нашел от какого то польта на 6 клавиш, подошел очень хорошо. Правда в моем варианте 4 клавиши.
Схема практически та же:

<Изображение удалено>
радикал фото
Добавился кондер на входе питания. Ну и кнопки теперь не обычные тактовые, а под резиновые, родные от пульта. Выкинут порт программирования.
Теперь суть проблемы: Теперь команды пульта начали срабатывать фективно, то есть проведешь пальцем над пультом, сработает ложное прерывания. Типа как оно чует наводки, дребезг контактов. Пробовал поставить на кнопки кондеры на 100нан, вообще перестало реагировать на нажатия чем либо.
Как это победить?
Файлы проекта в студии 6,1

[45.79 Кб]
0
Sthuthu
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
21.08.2014, 17:19 23
Подтянуть входы к питанию попробуйте
Во сне мк может потреблять если порты как входы и не подтянуты - в воздухе
Могут быть ложные срабатывания от наводок, что у Вас и происходит
0
Bomyo
0 / 0 / 0
Регистрация: 16.07.2005
Сообщений: 826
21.08.2014, 17:22 24
Микроконтроллер постоянно включенный, хоть и вглубоком сне - плохая идея. и с прерываниями тоже плохая идея.
Можно отключить пин GND от земли и запитывать микроконтроллер через кнопки паразитным питанием. Тогда пульт вообще не будет потреблять во время лежания и программа станет проще.
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
21.08.2014, 18:46 25
Цитата Сообщение от Sthuthu
Подтянуть входы к питанию попробуйте
Во сне мк может потреблять если порты как входы и не подтянуты - в воздухе
Могут быть ложные срабатывания от наводок, что у Вас и происходит
Подтяжку програмную сделать, или резисторов на питания навесить?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
21.08.2014, 19:13 26
Цитата Сообщение от Tyom11t
Подтяжку програмную сделать, или резисторов на питания навесить?
Сопротивление внутренних резисторов примерно 50 кОм. Уточнить в даташите.
Как-то сделал опыт, подтянул порт внутренними резисторами, коснулся пальцами вывода и МК сработал. С тех пор никогда внутренние резисторы не использую. Вешаю внешние 10-12 кОм.
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
24.08.2014, 00:13 27
И так решил свою проблему из дребезгом контактов. Программная ошибка которую сумел выловить только в симуляторе.
Про...ал два дня просто забыв поставить " | ", из-за этого все и глючело ))
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
24.08.2014, 17:57 28
Интересно, сколько потребление получилось?
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
24.08.2014, 21:07 29
Цитата Сообщение от 45893569365
Интересно, сколько потребление получилось?
Да, кстати самому интересно. Буду дома, проверю.
Расстояния срабативания пульта теперь стала огромной. Стандартный пультик работал метра на два.
У себя на сайте выложил несколько фоток:
http://digiua.com/pult-du-dlya-akustyky-chastyna-2-zotyzo-proshyvka/
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
25.08.2014, 13:22 30
Ну все, сжег свой пульт. Подключил к лабараторнику, через амперметр, чота оно по показывало а потом перестало. И виставил 2.8 Вольт. Хз что случилось (( Обидно.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
25.08.2014, 20:04 31
Вот незадача..... ну ниче, 30 деревянных и все опять закрутится, завертется :)...
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
25.08.2014, 20:13 32
Цитата Сообщение от ShodS
Вот незадача..... ну ниче, 30 деревянных и все опять закрутится, завертется :)...
Да )) Только время жалко.
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
14.11.2014, 14:16 33
И так решил доработать свой пульт, забацать функцию повторения команд. Для того чтоб это сработало нужно зажать клавишу и обработать одинарное нажатия на кнопку и зажатие этой же кнопки. Начал исследовать данный вопрос и вычитал что зажатую кнопку обрабатывают совпадениям по таймеру. А таймер у нас уже занят генерацией частоты в 36кГц для ИК-диода.
Вопрос как обработать "зажатие" и одинарное нажатия на кнопку без таймера?
(Напомню камень Attiny13, единственный таймер занят)
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
14.11.2014, 16:00 34
Таймер нужен только для точных отсчетов... а периодический опрос состояния кнопки можно производить используя обычный delay...
Еще вариант, в уже используемом таймеме организовать программный счетчик, который будет делить частоту прохода например до 100Гц и с этой частотой будет устанавливать флаг опроса кнопки... а в основной проге по этому флагу можно уже обрабатывать клавиатуру...
0
SporF
0 / 0 / 0
Регистрация: 26.03.2013
Сообщений: 79
14.11.2014, 18:19 35
Делал подобную штуку в прошлом году, чтобы над женой подшучивать, когда она пульт забирает и начинает смотреть что-то слезливо-женское/мозгокушающее)) Но у меня все было куда более топорно - тупо снял кодовую последовательность ИК приемником, подключенным к логическому анализатору, а потом воспроизводил ее. Работы - на 1-2 вечера, но штука получилась прикольная, хотя и узко заточенная: https://yody.sk/d/hKPlGjgcDBi5n
0
14.11.2014, 18:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2014, 18:19

Attiny13 + NRF24L01
Ребята,доброго всем времени суток. Сейчас хочу собрать одно устройство, но для этого надо...

ATtiny13 и ADC
Пытаюсь в МК ATtiny13 запустить ADC, считывание показаний с термистора. Напряжение подается на...

Pull-Up Attiny13
В Тини13 есть Pull-Up входов, включаемый програмно. У меня нет возможности втиснуть внешние...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru