Пока для гусеничного робота изготавливаются детали,я решил потренироваться и вот мой уродец
Из датчиков использовал tsopЫ, собираюсь ещё повесить назад tsop. Т.к закладка учебника по C находится на 63 странице, робот пока умеет только отворачивать от препятствий.
Прога
- Код: Выделить всё • Развернуть
#include <tiny2313.h>
#include <delay.h>
#define IR1_ON TCCR0A=0b01000010;
#define IR2_ON TCCR0A=0b00010010;
#define IR12_ON TCCR0A=0b01010010;
#define IR12_OFF TCCR0A=0b00000010;
#define START_M1 PORTB.0 = 1
#define START_M2 PORTB.1 = 1
#define STOP_M1 PORTB.0 = 0
#define STOP_M2 PORTB.1 = 0
#define FOWARD_M1 PORTA.0 = 0
#define FOWARD_M2 PORTA.1 = 0
#define BACK_M1 PORTA.0 = 1
#define BACK_M2 PORTA.1 = 1
#define IR3_ON TCCR1A=0b01000000;
#define IR4_ON TCCR1A=0b00010000;
#define IR34_OFF TCCR1A=0b00000000;
char tsop1 = 0; // Счётчик импульсов
char tsop2 = 0; // Счётчик импульсов
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0b00000011;
PORTB=0x00;
DDRB=0b00011111;
PORTD=0x00;
DDRD=0b00100000;
TCCR0A=0b00000010;
TCCR0B=0b11000001;
OCR0A=0x37;
OCR0B=0x37;
TCCR1A=0b00000000;
TCCR1B=0b00001001;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x37;
OCR1BH=0x00;
OCR1BL=0x37;
DIDR=0x00;
STOP_M1;
STOP_M2;
FOWARD_M1;
FOWARD_M2;
// Global enable interrupts
while (1)
{
delay_ms(100);
IR1_ON; // 1 Пачка импульсов на Tsop1
delay_us(600);
IR12_OFF;
if (PIND.6 == 0) {tsop1++;} // TSOP1
if (PIND.6 == 1) {START_M2;} // Если нет препятствия GO
delay_ms(10);
IR2_ON; // 1 Пачка импульсов на Tsop2
delay_us(600);
IR12_OFF;
if (PIND.4 == 0) {tsop2++;} // TSOP2
if (PIND.4 == 1) {START_M1;} // Если нет препятствия GO
delay_ms(10);
{
unsigned int i; // 9 пачек импульсов на Tsop1
for(i=0; i<9; i++
{
delay_us(700);
IR1_ON;
delay_us(600);
IR12_OFF;
if (PIND.6 == 0) {tsop1++;}
}
}
delay_ms(5);
{
unsigned int j; // 9 пачек импульсов на Tsop2
for(j=0; j<9; j++)
{
delay_us(700);
IR2_ON;
delay_us(600);
IR12_OFF;
if (PIND.4 == 0) {tsop2++;}
}
}
delay_ms(5);
if ((tsop1 < 7)&&(tsop2 < 7))
{
START_M1;
START_M2;
}
if ((tsop1 > 7)&&(tsop2 < 7))
{
START_M1;
STOP_M2;
}
if ((tsop1 < 7)&&(tsop2 > 7))
{
STOP_M1;
START_M2;
}
if ((tsop1 > 7)&&(tsop2 > 7))
{
START_M1; // Тормозим контрвключением
START_M2;
BACK_M1;
BACK_M2;
delay_ms(250);
STOP_M1;
STOP_M2;
delay_ms(2500);
START_M1;
START_M2;
BACK_M1; // Задний ход
BACK_M2;
delay_ms(900);
STOP_M1;
FOWARD_M1;
START_M1;
delay_ms(50);
STOP_M1;
delay_ms(900);
STOP_M2;
FOWARD_M1;
FOWARD_M2;
delay_ms(2000);
}
tsop1 = 0; // Сброс счётчиков в 0
tsop2 = 0;
}
}