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

ИК-пульт на Attiny13

22.04.2014, 15:00. Просмотров 19972. Ответов 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
Ответы с готовыми решениями:

Не шьется attiny13
сделал устройство на attiny13, risit пин не использован - подтянут к плюсу 4.7к...

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

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

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

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

34
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 15:53 2
Гы... помоему я в программе свой почерк узнаю :).....
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 15:56 3
Я код на радыокоте нашел, там в архиве еще были файлы для протеуса. Может и ваше )))
Может вы в курсе где я туплю?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 15:58 4
А в чем конкретно проблема? (если пока не трогать режим сна)...
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 16:03 5
На коте код был под мегу8, подправил регистры и запустил удачно на меге 16 (на пинборде). Вроде подправил регистры и OCR0A-на совпадение на частоту 36кГц под тиньку 13. Светодиод светит импульсами, но принимающий девайс не реагирует. Хотя на меге 16 все работало.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 16:04 6
Цитата Сообщение от Tyom11t
На коте код был под мегу8, подправил регистры и запустил удачно на меге 16 (на пинборде). Вроде подправил регистры и OCR0A-на совпадение на частоту 36кГц под тиньку 13. Светодиод светит импульсами, но принимающий девайс не реагирует. Хотя на меге 16 все работало.
Через пол часа гляну...
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
22.04.2014, 16:09 7
Наверное, только я догадался, что ИЧ = инфра-червоний = Инфра Красный = ИК ???
8-)
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 16:14 8
О, спасибо ))
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 18:03 9
Цитата Сообщение от kytikot
Наверное, только я догадался, что ИЧ = инфра-червоний = Инфра Красный = ИК ???
8-)
:)...
А я как только ни косился на заголовок... максимум до чго додумался - "инфра-частотный"... но чет никогда не слышал чтоб так называли... в общем списал на свою некомпетентность :).....
(хоча, українську мову розумію...)

PS
Я все в один файл запихал, так что глянь что поменялось, и у себя поправь.....

[4.55 Кб]
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 20:25 10
Залил проект без каких либо изминений, уже лучше. В настройках регистров что то.
Дал это все скушать лог.анализатору через ик-приемник. Время поплило, теперь стартовый бит имеет 55мс, вместо 9мс ну и все остальное поплило.

И еще один тупой вопрос. Светодиод теперь все время включен, хотя на порту PB0-тот что идет на транзисторный ключ, 30мВольт.
Транзистор вроде как должен открываться при подаче на базу напряжения?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 20:26 11
Цитата Сообщение от Tyom11t
Залил проект без каких либо изминений, уже лучше. В настройках регистров что то.
Дал это все скушать лог.анализатору через ик-приемник. Время поплило, теперь стартовый бит имеет 55мс, вместо 9мс ну и все остальное поплило.
Делитель на 8 в тиньке выключил?
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 20:33 12
Тина фюз-бит CKDIV8- отключить?? Потому что фюзы заводские.

П.С.
Отключил CKDIV8, все заработало!! Щаслив как слон.
Но осталась проблемка из свичением диоди при простое пульта. Так батарейка сядет за день.
Перед базой транзистором нужно установить резистор, чтоб убрать ненужное напряжения???
И как правильно настроить засипания контролера после выполнения задачи??
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 20:37 13
Цитата Сообщение от Tyom11t
Тина фюз-бит CKDIV8- отключить?? Потому что фюзы заводские.
По умолчанию у тиньки делитель включен, и тактовая получается 1,2 МГц, его надо выключить...

И еще я на схеме не вижу резистора в базе транзистора... там надо какой нить поставить где то в пределах 1к - 4к7...
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
22.04.2014, 20:46 14
Так и думал что все таки нужен резистор. Как на счет режима сна?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
22.04.2014, 20:51 15
А вообще... заработала?

Насчет режима сна, не помогу... ни разу не делал... мне тоже интересно, как это реализовать....
Наверное надо на помощь призывать oxytt... он тут у нас чудеса творит с энергосбережением :)...

Кста... и в цепи ИК светика, тоже наверное низкоомный резюк не помешал бы...
Хотя 3в может и нормально... не знаю...
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
23.04.2014, 08:44 16
а прерывания от пинов и повер даун не помогут?
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
23.04.2014, 11:38 17
Я кнопки обрабативал не на прериваниях. Но нужно попробовать. Надо разобраться из PCINT-оны есть на каждой ноге где кнопка стоит.
Или сделать все чисто схематически, чтоб питания на контролер подавалось при нажатии кнопки, так батарейка будет физически отрезана от контролера.
0
Tiom11t
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 225
23.04.2014, 11:39 18
Чуть не забыл!! Тов. ShodS БОЛЬШОЕ СПАСИБО за помощь.
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
23.04.2014, 12:04 19
Проще повердаун ИМХО. У меня сейчас мега88ра в поведауне жрет 30 микроампер. Раз в две секунды просыпается от ватчдога, проводит измерение АЦП и опять спит. Это с BOD и питанием от AAA батареек.

Тини13А будет с выключенным ватчдогом потреблять 0.5uA. Вообще чудесно. Только не забудьте принудительно выключить аналоговый компаратор :)
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
24.04.2014, 10:42 20
Чуть не забыл. Параллельно батарее надо добавить танталовый конденсатор порядка сотни микрофарад. Это хоть и добавит потребления около 1-2 uA, но позволит сильно продлить срок жизни батареи.
0
24.04.2014, 10:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 10:42

ws2801 + attiny13
Всем привет. Помогите, пож-та, уже совсем голову сломал, не понимаю почему не...

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

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


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

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

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