Технический форум по робототехнике.
ALHIMIK » 23 дек 2009, 18:52
можно таймер Т0 в режим CTC
нужно только подсчитать значение OCR0 и делителя для таймера
CiSi » 23 дек 2009, 19:31
Сначало сделал так:
- Код: Выделить всё • Развернуть
#include <mega8.h>
#include <delay.h>
void main()
{
DDRC = 0xff;
DDRD = 0x02;
DDRB = 0xff;
PORTB = 0x00;
while(1){ // цикл
PORTD.1 = 1; // зажигаем ИК диод
delay_us(13); // половинка периода
PORTD.1 = 0; // гасим
delay_us(13);
if (PIND.0 == 0){ // пришел "0"
PORTC.5 = 1; // зажигаем индикацию
delay_ms(100); // чтобы успеть заметить
}
PORTC.5 = 0; // гасим
}}// конец цикла
Вместо 13 перепробовал и 14, 15, 15, 16, 17, 18, но нечего неподошло
потом взял старый пульт из которого выдернул свой ИК и припаял его обратно, а питание зацепил на МК. то есть с помощью мк включаем питание пульта и светодиод загарается с тужной нам частотой, тсоп теперь стал на него реагировать. Но он реагирует не зависимо от того есть препятствие или его нет.
- Код: Выделить всё • Развернуть
while(1){ // бесконечный цикл
PORTD.1 = 1; // зажигаем ИК диод
delay_ms(50);
PORTD.1 = 0;
if (PIND.0 == 0){ // пришел "0"
PORTC.5 = 1; // зажигаем индикацию
delay_ms(100); // чтобы успеть заметить
}
PORTC.5 = 0; // гасим
}}// конец цикла
тсоп и ик стоят рядом друг с другом, межту ними поставил перекрытие.
yak-40 » 23 дек 2009, 20:03
100% Рабочий код для зажигания ИК диодов.
СтоИт на базе для зазыва пылесоса на зарядку, работает без проблемм
Выдаёт по 10 пачек импульсов частотой 36кГц, затем пауза 60ms и т. д.
(Atmega8, кварц 11,059200 MHz. Хотя это не принципиально)
- Код: Выделить всё • Развернуть
/////////////////////////////////////////////////////////////////////
void flash_l()
{
unsigned int i,j;
for (j=0;j<10;j++)
{
for(i=0; i<12; i++)
{
PORTB.2=1;
delay_us(13);
PORTB.2=0 ;
delay_us(13);
}
delay_us(600); // 0,6 ms
};
}
//////////////////////////////////////////////////////////////////////////
void main(void)
{
init();
while (1)
{
flash_l();
delay_ms(60); // 60 ms
};
}
Малёк ошибся в комментариях, поправил...
CiSi » 23 дек 2009, 21:03
Вставил код, ик диод мигает, а тсоп не реагирует, теперь даже на пульт. Что опять с кодом не так? -
- Код: Выделить всё • Развернуть
#include <mega8.h>
#include <delay.h>
void flash_l()
{
unsigned int i,j;
for (j=0;j<10;j++)
{
for(i=0; i<12; i++)
{
PORTD.1=1;
delay_us(13);
PORTD.1=0 ;
delay_us(13);
}
delay_us(600); // 0,6 ms
};
}
void main()
{
DDRC = 0xff;
DDRD = 0x02;
DDRB = 0xff;
PORTB = 0x00;
while (1)
{
flash_l();
delay_ms(60); // 15 ms
if (PIND.0 == 0){ // пришел "0"
PORTC.5 = 1; // зажигаем индикацию
delay_ms(100); // чтобы успеть заметить
}
PORTC.5 = 0; // гасим
}
}
yak-40 » 23 дек 2009, 21:16
Убери после flash_l(); задержку delay_ms(60); В твоей программе она не нужна.
Тоесть, мигнул светодиодом, сразу проверил приходящий сигнал.
Ещё в функции void flash_l() попробуй уменьшить задержку 0,6 ms
Добавлено спустя 2 минуты 31 секунду:
Частота кварца в проекте правильно прописана?
Добавлено спустя 2 минуты 18 секунд:
Осцилографа нет? Посмотреть бы сигнал...
CiSi » 23 дек 2009, 21:22
задержку delay_ms(60); - убрал, тсоп стал реагировать на пульт, но не на ик диод.
уменьшил задержку 0,6 ms - все попрежнему.
что еще может быть?
частоту кварца установил в конфигурациях проекта.
yak-40 » 23 дек 2009, 21:30
Посмотри через камеру телефона или через фотоаппарат на светодиод. Может он не работает?
А какой у тебя ТСОП, может он не на 36кГц?
Добавлено спустя 2 минуты 45 секунд:Ещё попробуй измени функцию мигания вот так:
- Код: Выделить всё • Развернуть
/////////////////////////////////////////////////////////////////////
void flash_l()
{
unsigned int i,j;
for (j=0;j<10;j++)
{
delay_us(600); // 0,6 ms
for(i=0; i<12; i++)
{
PORTB.2=1;
delay_us(13);
PORTB.2=0 ;
delay_us(13);
}
};
}
CiSi » 23 дек 2009, 21:40
Ик диод светит. А тсоп похож на 2136
Добавлено спустя 4 минуты 29 секунд:
Хотя может и не 36, жаль что на них не пашут рабочую частоту.
Я так понимаю частоту можно изменить изменяя:
PORTB.2=1;
delay_us(13);
PORTB.2=0 ;
delay_us(13);
Только вот как расчитать эти значения?
Последний раз редактировалось
CiSi 23 дек 2009, 21:42, всего редактировалось 1 раз.
yak-40 » 23 дек 2009, 21:41
Похоже что частота не попадает. Хорошо-бы посмотреть осцилографом та ли частота, а так даже не знаю что ещё предложить сделать
CiSi » 23 дек 2009, 21:47
осцилографа к сожалению нет. ИК и ТСОП взял из старого видика.
yak-40 » 23 дек 2009, 22:14
Тогда остаётся только метод "научного тыка"
тупо меняй значение "13" на, допустим 5, 7, 9, ну и т. д.пока не заработает
CiSi » 23 дек 2009, 22:32
Изменил значение этой строки delay_us(170); // 0,6 ms - было 600
ИК диод мерцает очень быстро, индикаторный светодиод то же загарается, то есть тсоп принимает сигнал.
yak-40 » 23 дек 2009, 22:45
Я так понял что всё заработало?
CiSi » 23 дек 2009, 23:01
не совсем так. Индикаторный светодиод то же загорается и негаснит независимо от того есть препятствие или его нет перед тсоп-ом.
Добавлено спустя 3 минуты 22 секунды:
надеваю на ик непрозрачный колпачок - закрываю ик диод вообще, а индикаторный диод все равно горит, вообще нечего не понимаю.
yak-40 » 23 дек 2009, 23:03
Ну, дык, подключи ИК диод через тумблер или кнопку. А потом включай/выключай, и смотри как работает.
Если всё заработает, то дело в прграмме или расположении ИК диода и ТСОП.
Добавлено спустя 1 минуту:
Выложи последнюю версию проги.