Сделал плату ИК-бампера для своего робота с двумя TSOP4836 датчиками и 4 светодиодами на tiny2313
Поскольку хочу на этом проекте понять основные принципы МК, то делаю все по порядку:
запустить диоды на 36кГц -> сформировать их в пачки и разделить на 2 передатчика (левый и правый) -> заставить TSOP получать данные с правильных передатчиков и выставлять в "1" нужный порт для передачи на МК робота.
Сейчас застрял на первом шаге и пытаюсь настроить таймер на частоту 36кГц, но не совсем пойму как правильно подсчитать.
- Код: Выделить всё • Развернуть
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define T_POLL 145
ISR(TIMER0_OVF_vect) // По прерыванию включаются или отключаются светодиоды
{
TCNT0 = T_POLL;
switch(PORTD & (1<<PD0))
{
case 1: PORTD &= ~(1<<PD0|1<<PD1); break;
case 0: PORTD |=1 <<PD0 | 1<<PD1; break;
default: break;
}
}
ISR(INT0_vect)
{
PORTD |= 1<<PD5 | 1<<PD6;
}
int main(void)
{
// Конфигурация портов
// На вывод (ИК-диоды, выходные сигналы с модуля)
DDRD |=1 <<PD0; // правый передатчик
PORTD &= ~(1<<PD0);
DDRD |=1 <<PD1; // левый передатчик
PORTD &= ~(1<<PD1);
DDRD |=1 <<PD4; // выход на робота - препятствие справа
PORTD &= ~(1<<PD4);
DDRD |=1 <<PD5; // выход на робота - препятствие слева
PORTD &= ~(1<<PD5);
// На ввод (TSOP4836 датчики)
DDRD &= ~(1<<PD2); // правый датчик
PORTD &= ~(1<<PD2);
DDRD &= ~(1<<PD3); // левый датчик
PORTD &= ~(1<<PD3);
// Инициализация таймера
TCCR0A = 0x00;
TCCR0B |= 0b00000010; // деление частоты на 8
TCNT0 = T_POLL;
TIFR |= 1<<TOV0;
TIMSK |= 1<<TOIE0;
sei();
// Цикл программы
while(1);
return 0;
}
Таймер подсчитал так из статьи на chipenable.ru (ссылка)
Надеюсь, код будет понятен, постоянно пытаюсь приучить себя комментировать.
По этой программе такт длится около 18мс (осциллографа нет, поэтому пробовал симулировать в протеусе), хотя должен длиться около 27мкс. Что у меня может быть неправильно?