Виртуальную стену, чтоб дверь не закрывать в соседнюю комнату.
Код получился небольшой и влез в Attiny13 (даже не с буквой А)
найденную в загашнике.
CODE:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define GENA 0
#define LED_PORT PORTB
#define LED_PIN 4
// F_CPU 9600000UL задано в MAKEFILE
// clkdiv8 = off отключен в фузах
// ATtiny13
volatile unsigned char comm[8]={'1','0','1','0','0','0','1','0'}; // 0xA2 - код команды
int pos = 0;
volatile unsigned char sb [1];
int main(void)
{
DDRB|=(1<<LED_PIN); //включаем пин 4 модуляция светодиода (нога 3)
DDRB|=(1<<GENA); //включаем пин 0 (oc0а) меандр 40кHz на светодиод (нога 5)
//Установка таймеров
TCCR0A|=(1<<COM0A0)|(1<<WGM01); // !!! MODE 2 (CTC) нога 5 переключает состояние по совпадению
TCCR0B|=(1<<CS00); //PRESCALER=1
// в регистр сравнения заносим значение 119 -> fген=40кHz).
OCR0A = 119;
sei();
while(1)
{
while(pos<=7)
{
sb [1] = comm[pos];
switch (sb [1])
{
case '1' : { LED_PORT |= 1 << LED_PIN; //зажечь
_delay_ms(3);
LED_PORT &= ~(1 << LED_PIN); //погасить
_delay_ms(1);break;
}
case '0' : { LED_PORT |= 1 << LED_PIN; //зажечь
_delay_ms(1);
LED_PORT &= ~(1 << LED_PIN); //погасить
_delay_ms(3);break;
}
default: break;
}
pos=pos+1;
}
if (pos>7) pos=0;
LED_PORT &= ~(1 << LED_PIN); // пауза 16 мс
_delay_ms(16);
}
}
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define GENA 0
#define LED_PORT PORTB
#define LED_PIN 4
// F_CPU 9600000UL задано в MAKEFILE
// clkdiv8 = off отключен в фузах
// ATtiny13
volatile unsigned char comm[8]={'1','0','1','0','0','0','1','0'}; // 0xA2 - код команды
int pos = 0;
volatile unsigned char sb [1];
int main(void)
{
DDRB|=(1<<LED_PIN); //включаем пин 4 модуляция светодиода (нога 3)
DDRB|=(1<<GENA); //включаем пин 0 (oc0а) меандр 40кHz на светодиод (нога 5)
//Установка таймеров
TCCR0A|=(1<<COM0A0)|(1<<WGM01); // !!! MODE 2 (CTC) нога 5 переключает состояние по совпадению
TCCR0B|=(1<<CS00); //PRESCALER=1
// в регистр сравнения заносим значение 119 -> fген=40кHz).
OCR0A = 119;
sei();
while(1)
{
while(pos<=7)
{
sb [1] = comm[pos];
switch (sb [1])
{
case '1' : { LED_PORT |= 1 << LED_PIN; //зажечь
_delay_ms(3);
LED_PORT &= ~(1 << LED_PIN); //погасить
_delay_ms(1);break;
}
case '0' : { LED_PORT |= 1 << LED_PIN; //зажечь
_delay_ms(1);
LED_PORT &= ~(1 << LED_PIN); //погасить
_delay_ms(3);break;
}
default: break;
}
pos=pos+1;
}
if (pos>7) pos=0;
LED_PORT &= ~(1 << LED_PIN); // пауза 16 мс
_delay_ms(16);
}
}
Напряжение питания от 4х аккумуляторов "AA" - 4,8В (больше 5,5В нельзя)
Устройство собрано и работает, пылесос заворачивает от луча и едет назад.
Источники вдохновения здесь и здесь
Первый источник самый правильный и лучший (на PIC), там все и нашел, из второго только паузу добавил в конец каждой посылки.
Архив с исходниками, скомпилированной прошивкой,
протеусами и прочим можно скачать по ссылке https://yadi.sk/d/IseVtlzDkPdLB