Полковник
Сообщений всего: 76
Дата рег-ции: Апр. 2014
|
Всем привет!
Недавно захотелось мне на робота поставить ИК датчики препятствий, подумал....
Купил ТСОП на 36 кГц, обвеску к нему, купил пару ИК светодиодов и микроконтроллер ATtiny13, чтобы управлять этим всем. Предполагалось, что микроконтроллер будет генерировать ШИМ (канал А, ножка PB0) с частотой 36 кГц и через транзисторный ключ включать/выключать светодиоды. К другой ножке будет подключён ТСОП и будем в бесконечном цикле опрашивать его, на наличие логической единицы и если таковая имеется, то выставляем на другую ножку микроконтроллера логическую 1.
Всё до смешного просто! тем более, что я уже делал такое в более ранних проектах, только там микроконтроллер был другой (мега 8).
По правде у меня всегда были сложности с аппаратной ШИМ в микроконтроллерах: то даташит криво прочту, то не те регистры сконфигурирую, то ещё какая-нибудь халера, но в конечном итоге всё получалось.
Так вот, купил, спаял, ТСОП ловит сигналы с телевизионного пульта, микроконтроллер весело дрыгает ножкой , все счастливы... и только ШИМ не работает ну казалось бы где ошибка(внизу код программы на си)!? я уже все режимы перепробывал-нет результата, я подумал, что, может быть, порт сгорел? я в бесконечном цикле дрыгаю ножкой программно и всё хорошо!
Люди добрые, посмотрите код, может я где-то накасячил:
CODE:#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h> // подключаем библиотеку АВР
#include <util/delay.h> // подключаем библиотеку задержек
int main (void) {
TCCR0A |=(1<<COM0A1)|(1<<COM0A0)|(1<<COM0B1)|(1<<COM0B0)|(1<<WGM01)|(1<<WGM00);
TCCR0B |=(0<<FOC0A)|(0<<FOC0B)|(1<<WGM02)|(0<<CS02)|(1<<CS01)|(1<<CS00);
DDRB = (1<<PB4)|(0<<PB3)|(1<<PB0);
PORTB |=(1<<PB3);
OCR0A = 0xFF;
while(1==1) {
PORTB &=(~(1<<PB0));
if(!(PINB&(1<<PB3))) {
PORTB |=(1<<PB4);
_delay_ms(1000);
}
else {
PORTB &=(~(1<<PB4));
}
}
} |