Перейти к содержанию

Программа Пульта И Датчика Препятствий


Programma-robot

Рекомендуемые сообщения

Здравствуйте, написал программу по которой выполняются следующие действия: при включении выбираем одну из двух кнопок и бесконечно выполняется действие:

1.На первой - прокладывание карты с пульта и ее запоминания;

Проблема: карта записывается в ОЗУ, а не в ПЗУ, не знаю как решить данную проблему.

2. А на второй датчик препятствий - он вообще не включается.

Данная программа компилируется, плата PIC16F887.

Пожалуйста помогите решить данную проблему.

Вот сама программа если у вас есть (если у вас высвечиваются смайлики, то это "; )") :

#include "motor.c"
#define MEM_SIZE 40
#define TMR_DX 50
#include <Motor.h>
int Adc;
char Dist;
char Txt[6];
void Read_Adc()
{
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
// Данные с ИК пульта ДУ
unsigned char ir_data=0;

// Данные о пройденном пути
unsigned int mem[MEM_SIZE];
unsigned char mem_cmd[MEM_SIZE];
// Размер массива данных пройденного пути
unsigned char mem_size=0;

// Декодирование данных с пульта
void decode()
{
if(ir_data=='a' || ir_data=='A') ir_data=1;
else if(ir_data=='b' || ir_data=='B') ir_data=2;
else if(ir_data=='c' || ir_data=='C') ir_data=3;
else if(ir_data=='d' || ir_data=='D') ir_data=4;
else ir_data=0;
}

// Приём данных с пульта
void interrupt()
{
char i;

// Проверка флага прерывания
if(INTCON.INTF)
{
Delay_us(416);
for(i=0;i<8;i++)
{
Delay_us(833);
// Сдвиг данных на 1 бит вправо
ir_data = ir_data>>1;
// Если на входе RB0 1, то в конец ir_cmd добавить 1
if((PORTB & 0x01)==1) ir_data = ir_data | 0x80;
}
Delay_us(833);
decode(); // Декодировать даннные
// Сбросить флаг прерывания
INTCON.INTF = 0;
}
}

// Очистка памяти
void mem_clear()
{
unsigned int i;
for(i=0;i<MEM_SIZE;i++)
{
mem[i]=0;
mem_cmd[i]=0;
}
}

void _go()
{
unsigned int i,j;
unsigned char cmd;
unsigned int tmr;

for(i=0;i<=mem_size;i++)
{
cmd = mem_cmd[i];
tmr = mem[i];

if(cmd==1)
{
m_left_bwd();
m_right_bwd();
}
else if(cmd==2)
{
m_left_bwd();
m_right_fwd();
}
else if(cmd==3)
{
m_left_fwd();
m_right_bwd();
}
else if(cmd==4)
{
m_left_fwd();
m_right_fwd();
}
for(j=0;j<tmr;j++) Delay_ms(TMR_DX+10);
}
m_left_stop();
m_right_stop();
}
void main()
{
TRISA = 0b00010000;
TRISB = 0b00000001;
PORTA = 0b00000000;
PORTB = 0b00000000;
ANSEL=0xFF;
ANSELH=0x00;
for(; 
{
if (!PORTA.F4)
{
unsigned char key;

// RB0 в цифровой вход
ANSELH.F4 = 0;
TRISA.F4=1;
// Прерывание происходит по спаду уровня сигнала
OPTION_REG.INTEDG = 0;
// Разрешить прерывания по изменению уровня сигнала INT/PB0
INTCON.INTE = 1;
// Разрешить прерывания
INTCON.GIE = 1;

// Инициализируем двигатели
m_init();

// Настроить вывод светодиода и мигнуть им когда очиститься память
TRISB.F3=0;

PORTB.F3=1;
mem_clear();
Delay_ms(200);
PORTB.F3=0;

for(; 
{
Delay_ms(TMR_DX);
if(!PORTA.F4) _go(); // Запускаем движение по карте

if(ir_data!=0)
{
//Загружаем данные из временной переменной ir_data
key = ir_data;
ir_data = 0;

// Если команда отличается от предыдущей
if(mem_cmd[mem_size]!=key)
{
 // Выбираем следующую ячейку памяти
 mem_size++;
 if(mem_size==MEM_SIZE)
 {
 PORTB.F3=1; // Зажигаем светодиод
 while(1) if(!PORTA.F4) _go(); // Запускаем движение по карте
 }
 // Сохраняем команду для её последующего сравнения
 mem_cmd[mem_size]=key;
 // Увеличиваем время простоя команды
 mem[mem_size]++;
}
else
{
 // Увеличиваем время простоя команды
 mem[mem_size]++;
}

if(key==1)
{
m_left_bwd();
m_right_bwd();
}
else if(key==2)
{
m_left_bwd();
m_right_fwd();
}
else if(key==3)
{
m_left_fwd();
m_right_bwd();
}
else if(key==4)
{
m_left_fwd();
m_right_fwd();
}

while(!PORTA.F4);
}

if (!PORTB.F0)
{
for(; 
{
Delay_ms(1000);
ANSELH.F4=0;
ANSEL=0xFF;
TRISA=0xFF;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
Lcd_Out(1,1,"Raw Data=");
Lcd_Out(2,1,"In CM=");
while(1)
{
Read_Adc();
WordToStr(Adc,Txt);
Lcd_Out(1,10,Txt);
if(Adc<90)
{
Lcd_Out(2,10,"Out");
}
else
{
Dist=(2914/(Adc+5))-1;
WordToStr(Dist,Txt);
Lcd_Out(2,10,Txt);
}
if(Adc>300)
{
Backward(255);
Delay_ms(500);
S_Left(255);
Delay_ms(400);
}
else
{
Forward(255);
}
while(!PORTB.F0);
}
}
}
}
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуйте, удалось исправить некоторые ошибки в программе, но проблема №1 остается, не знаю как вписать запоминание карты в ПЗУ.

Компилятор: micro c. Микроконтроллер: pic16f887.

Вот сама программа:

#include "motor.c"
#define MEM_SIZE 40
#define TMR_DX 50
#include <Motor.h>
int Adc;
char Dist;
char Txt[6];
// Äàííûå ñ ÈÊ ïóëüòà ÄÓ
unsigned char ir_data=0;
// Äàííûå î ïðîéäåííîì ïóòè
unsigned int mem[MEM_SIZE];
unsigned char mem_cmd[MEM_SIZE];
// Ðàçìåð ìàññèâà äàííûõ ïðîéäåííîãî ïóòè
unsigned char mem_size=0;
void Read_Adc()
{
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
// Äåêîäèðîâàíèå äàííûõ ñ ïóëüòà
void decode()
{
if(ir_data=='a' || ir_data=='A') ir_data=1;
else if(ir_data=='b' || ir_data=='B') ir_data=2;
else if(ir_data=='c' || ir_data=='C') ir_data=3;
else if(ir_data=='d' || ir_data=='D') ir_data=4;
else ir_data=0;
}
// Ïðè¸ì äàííûõ ñ ïóëüòà
void interrupt()
{
char i;
// Ïðîâåðêà ôëàãà ïðåðûâàíèÿ
if(INTCON.INTF)
{
 Delay_us(416);
 for(i=0;i<8;i++)
 {
  Delay_us(833);
  // Ñäâèã äàííûõ íà 1 áèò âïðàâî
  ir_data = ir_data>>1;
  // Åñëè íà âõîäå RB0 1, òî â êîíåö ir_cmd äîáàâèòü 1
  if((PORTB & 0x01)==1) ir_data = ir_data | 0x80;
 }
 Delay_us(833);
 decode(); // Äåêîäèðîâàòü äàíííûå
 // Ñáðîñèòü ôëàã ïðåðûâàíèÿ
 INTCON.INTF = 0;
}
}
// Î÷èñòêà ïàìÿòè
void mem_clear()
{
unsigned int i;
for(i=0;i<MEM_SIZE;i++)
{
 mem[i]=0;
 mem_cmd[i]=0;
}
}
void _go()
{
unsigned int i,j;
unsigned char cmd;
unsigned int tmr;
for(i=0;i<=mem_size;i++)
{
 cmd = mem_cmd[i];
 tmr = mem[i];
 if(cmd==1)
 {
  m_left_bwd();
  m_right_bwd();
 }
 else if(cmd==2)
 {
  m_left_bwd();
  m_right_fwd();
 }
 else if(cmd==3)
 {
  m_left_fwd();
  m_right_bwd();
 }
 else if(cmd==4)
 {
  m_left_fwd();
  m_right_fwd();
 }
 for(j=0;j<tmr;j++) Delay_ms(TMR_DX+10);
}
m_left_stop();
m_right_stop();
}
void main()
{
TRISA = 0b00010000;
TRISB = 0b00000001;
PORTA = 0b00000000;
PORTB = 0b00000000;
ANSEL=0xFF;
ANSELH=0x00;
Delay_ms(100);
TRISA=0xFF;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Out(1,1,"Raw Data=");
Lcd_Out(2,1,"In CM=");
for(; 
{
 if (!PORTA.F4)
 {
  for(; 
  {
  unsigned char key;
// RB0 â öèôðîâîé âõîä
ANSELH.F4 = 0;
TRISA.F4=1;
// Ïðåðûâàíèå ïðîèñõîäèò ïî ñïàäó óðîâíÿ ñèãíàëà
OPTION_REG.INTEDG = 0;
// Ðàçðåøèòü ïðåðûâàíèÿ ïî èçìåíåíèþ óðîâíÿ ñèãíàëà INT/PB0
INTCON.INTE = 1;
// Ðàçðåøèòü ïðåðûâàíèÿ
INTCON.GIE = 1;
// Èíèöèàëèçèðóåì äâèãàòåëè
m_init();
// Íàñòðîèòü âûâîä ñâåòîäèîäà è ìèãíóòü èì êîãäà î÷èñòèòüñÿ ïàìÿòü
TRISB.F3=0;
PORTB.F3=1;
mem_clear();
Delay_ms(200);
PORTB.F3=0;
for(; 
{
 Delay_ms(TMR_DX);
 if(!PORTA.F4) _go(); // Çàïóñêàåì äâèæåíèå ïî êàðòå
  if(ir_data!=0)
  {
//Çàãðóæàåì äàííûå èç âðåìåííîé ïåðåìåííîé ir_data
key = ir_data;
ir_data = 0;
// Åñëè êîìàíäà îòëè÷àåòñÿ îò ïðåäûäóùåé
if(mem_cmd[mem_size]!=key)
{
 // Âûáèðàåì ñëåäóþùóþ ÿ÷åéêó ïàìÿòè
 mem_size++;
 if(mem_size==MEM_SIZE)
 {
  PORTB.F3=1; // Çàæèãàåì ñâåòîäèîä
  while(1) if(!PORTA.F4) _go(); // Çàïóñêàåì äâèæåíèå ïî êàðòå
 }
 // Ñîõðàíÿåì êîìàíäó äëÿ å¸ ïîñëåäóþùåãî ñðàâíåíèÿ
 mem_cmd[mem_size]=key;
 // Óâåëè÷èâàåì âðåìÿ ïðîñòîÿ êîìàíäû
 mem[mem_size]++;
}
else
{
 // Óâåëè÷èâàåì âðåìÿ ïðîñòîÿ êîìàíäû
 mem[mem_size]++;
}
  if(key==1)
  {
m_left_bwd();
m_right_bwd();
  }
  else if(key==2)
  {
m_left_bwd();
m_right_fwd();
  }
  else if(key==3)
  {
m_left_fwd();
m_right_bwd();
  }
  else if(key==4)
  {
m_left_fwd();
m_right_fwd();
  }

 }
 else
 {
  m_left_stop();
  m_right_stop();
 }
}
 }
 }
 if (!PORTB.F0)
 {
 for(; 
 {
 Lcd_Out(1,1,"Raw Data=");
 Lcd_Out(2,1,"In CM=");
 Read_Adc();
WordToStr(Adc,Txt);
Lcd_Out(1,10,Txt);
if(Adc<90)
{
Lcd_Out(2,10,"Out");
}
else
{
Dist=(2914/(Adc+5))-1;
WordToStr(Dist,Txt);
Lcd_Out(2,10,Txt);
}
if(Adc>300)
{
Backward(255);
Delay_ms(500);
S_Left(255);
Delay_ms(400);
}
else
{
Forward(255);
}
 }
 }
}
}

Ссылка на комментарий
Поделиться на другие сайты

Programma-robot , а даташит на МК читал???

Изменено пользователем Vovka

На форумах принято общаться на "ты", что не является оскорбительным и подразумевает равноправие

Ссылка на комментарий
Поделиться на другие сайты

Читал, но не понимаю как именно прописать его в данной функции.

Если можете объяснить по простому, буду очень благодарен.

Вот сам даташит:

pic16f887-i_p.pdf

Ссылка на комментарий
Поделиться на другие сайты

Есть два варианта:

1. Сделать ассемблеровскую вставку как в примере в даташите

2. Воспользоваться микро-сишной функцией

А вообще поиск по форуму: http://forum.cxem.ne...howtopic=149637

А еще есть официальный сайт микро си, где есть пример: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/eeprom_library.htm

Изменено пользователем Vovka

На форумах принято общаться на "ты", что не является оскорбительным и подразумевает равноправие

Ссылка на комментарий
Поделиться на другие сайты

не знаю как вписать запоминание карты в ПЗУ.

тут возник вопрос : а что подразумевается под ПЗУ ?

априори ПЗУ в контексте для МК означает память программы , а не память данных...

и в компиле вряд ли есть функция записи в память программы, тк эта возможность для старых пиков есть только в серии 88Х и 87Х....

и надо же такому случится у ТС именно такая серия 887 :unknw:

Так куда надо писать данные в память программ или память данных?

Ссылка на комментарий
Поделиться на другие сайты

Вот настроил запоминание в пзу по умолчанию, как мне кажется:

#include "motor.c"

#define MEM_SIZE 40
#define TMR_DX 50

// Данные с ИК пульта ДУ
unsigned char ir_data=0;

// Данные о пройденном пути
unsigned int mem[MEM_SIZE];
eeprom unsigned char Var;
temp= Var;
// Размер массива данных пройденного пути
unsigned char mem_size=0;

// Декодирование данных с пульта
void decode()
{
if(ir_data=='a' || ir_data=='A') ir_data=1;
else if(ir_data=='b' || ir_data=='B') ir_data=2;
else if(ir_data=='c' || ir_data=='C') ir_data=3;
else if(ir_data=='d' || ir_data=='D') ir_data=4;
else ir_data=0;
}

// Приём данных с пульта
void interrupt()
{
char i;

// Проверка флага прерывания
if(INTCON.INTF)
{
Delay_us(416);
for(i=0;i<8;i++)
{
Delay_us(833);
// Сдвиг данных на 1 бит вправо
ir_data = ir_data>>1;
// Если на входе RB0 1, то в конец ir_cmd добавить 1
if((PORTB & 0x01)==1) ir_data = ir_data | 0x80;
}
Delay_us(833);
decode(); // Декодировать даннные
// Сбросить флаг прерывания
INTCON.INTF = 0;
}
}

// Очистка памяти
void mem_clear()
{
unsigned int i;
for(i=0;i<MEM_SIZE;i++)
{
mem[i]=0;
mem_cmd[i]=0;
}
}

void _go()
{
unsigned int i,j;
unsigned char cmd;
unsigned int tmr;

for(i=0;i<=mem_size;i++)
{
cmd = mem_cmd[i];
tmr = mem[i];

if(cmd==1)
{
m_left_bwd();
m_right_bwd();
}
else if(cmd==2)
{
m_left_bwd();
m_right_fwd();
}
else if(cmd==3)
{
m_left_fwd();
m_right_bwd();
}
else if(cmd==4)
{
m_left_fwd();
m_right_fwd();
}
for(j=0;j<tmr;j++) Delay_ms(TMR_DX+10);
}
m_left_stop();
m_right_stop();
}

void main()
{
unsigned char key;

// RB0 в цифровой вход
ANSELH.F4 = 0;
TRISA.F4=1;
// Прерывание происходит по спаду уровня сигнала
OPTION_REG.INTEDG = 0;
// Разрешить прерывания по изменению уровня сигнала INT/PB0
INTCON.INTE = 1;
// Разрешить прерывания
INTCON.GIE = 1;

// Инициализируем двигатели
m_init();

// Настроить вывод светодиода и мигнуть им когда очиститься память
TRISB.F3=0;

PORTB.F3=1;
mem_clear();
Delay_ms(200);
PORTB.F3=0;

for(; 
{
Delay_ms(TMR_DX);
if(!PORTA.F4) _go(); // Запускаем движение по карте

if(ir_data!=0)
{
//Загружаем данные из временной переменной ir_data
key = ir_data;
ir_data = 0;

// Если команда отличается от предыдущей
if(mem_cmd[mem_size]!=key)
{
 // Выбираем следующую ячейку памяти
 mem_size++;
 if(mem_size==MEM_SIZE)
 {
 PORTB.F3=1; // Зажигаем светодиод
 while(1) if(!PORTA.F4) _go(); // Запускаем движение по карте
 }
 // Сохраняем команду для её последующего сравнения
 mem_cmd[mem_size]=key;
 // Увеличиваем время простоя команды
 mem[mem_size]++;
}
else
{
 // Увеличиваем время простоя команды
 mem[mem_size]++;
}

if(key==1)
{
m_left_bwd();
m_right_bwd();
}
else if(key==2)
{
m_left_bwd();
m_right_fwd();
}
else if(key==3)
{
m_left_fwd();
m_right_bwd();
}
else if(key==4)
{
m_left_fwd();
m_right_fwd();
}

}
else
{
m_left_stop();
m_right_stop();
}

}
}

вставляете код пользуйтесь тегами [CОDE] [/CОDE] кнопка <> редактора сообщений!!!

Ссылка на комментарий
Поделиться на другие сайты

ну даже не знаю чем и помочь...

вас носом ткнули на оф.сайт - результат ноль...

вас спрашивают :что в вашем понимании ПЗУ - реакции ноль...

можете дальше продолжать выкладывать код, не читая ответов и не отвечая на вопросы...

Ссылка на комментарий
Поделиться на другие сайты

В моем случае ПЗУ - это память для сохранения направления движений и их времени.

И пожалуйста разъясните на примере с оф.сайта где здесь написание и считывание данных, и как это происходит.

Буду очень благодарен.

Ссылка на комментарий
Поделиться на другие сайты

void EEPROM_Write(unsigned short address, unsigned short data);
unsigned short EEPROM_Read(unsigned short address);

запись в память данных:

EEPROM_Write(0x02,0xAA);			 // Write some data at address 2
EEPROM_Write(0x50,0x55);			 // Write some data at address 0150

чтение из памяти данных:

PORTB = EEPROM_Read(0x02);			 // Read data from address 2 and display it on PORTB
PORTC = EEPROM_Read(0x50);			 // Read data from address 0x50 and display it on PORTC

Ссылка на комментарий
Поделиться на другие сайты

Я немного переделал программу, как думаете лучше в ней прописать eeprom

#include <motor.h>
char *text = "ER-4 Remote"; // определить сообщение
unsigned char ir_cmd=0; // получить значение нажатой кнопки для ПДУ ER-4
//---------- сервисная подпрограмма прерывания INT ---------//
void interrupt()
{
unsigned char i; // хранение значения счетчика
if(INTCON.INTF) // проверяет значение флага прерывания RB0 (спад импульса)
{
Delay_us(416); //задержка на время 1/2 или 1 бита (скорость 1200 бод)
for(i=0;i<8;i++) // цикл на 8 шагов для сохранения данных от ПДУ
{
Delay_us(833); // задержка на время 1 бита (скорость 1200 бод)
ir_cmd = ir_cmd>>1; //сдвиг на 1 бит вправо
if((PORTB & 0x01)==1) //выполнить логическое и RB0 = '1'?
ir_cmd = ir_cmd | 0x80; // вставить бит, если RB0= '1'
}
Delay_us(833); // задержка на время 1 бита (скорость 1200 бод)
INTCON.INTF =0; //очистка флага прерывания
//------------------ функция получения символа от ПДУ---------//
unsigned char get_remote()
{
unsigned char _key=ir_cmd; // записать символ в буфер
ir_cmd=0; // стереть старые данные
return(_key); // вернуть символ от ПДУ
}
//------------------ Основная программа----------------------------//
void main()
{
unsigned char key; // хранит значение нажатой кнопки от ПДУ
ANSELH.F4=0; // RB0 ==> цифровой ввод/вывод
OPTION_REG.INTEDG = 0; // полярность сигнала прерывания
INTCON.INTE =1; // разрешить INT/PB0
INTCON.GIE =1; // разрешить глобальные прерывания
Lcd_Init(&PORTD); //инициализировать ЖКИ, присоединенный к порту PORTD
Lcd_Cmd(Lcd_CLEAR); // очистить дисплей
Lcd_Cmd(Lcd_CURSOR_OFF); // запретить курсор ЖКИ
Lcd_Out(1, 1, text); // вывести текст на ЖКИ
while(1) //
{
if (ir_cmd==0)
{
Motor_Stop();
}
else
{
key = get_remote(); // прочитать данные с датчика ДУ
if(key=='a' || key=='A') // нажата ли кнопка А?
{
Lcd_Out(2, 1, "Button A Press"); // показать сообщение
// нажата кнопка A
Backward(255);Delay_ms(50);
}
else if(key=='b' || key=='B')
{
Lcd_Out(2, 1, "Button B Press");
S_Right(255);Delay_ms(50);
}
else if(key=='c' || key=='C')
{
Lcd_Out(2, 1, "Button C Press");
S_Left(255);Delay_ms(50);
}
else if(key=='d' || key=='D')
{
Lcd_Out(2, 1, "Button D Press");
Forward(255);Delay_ms(50);
}
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

это вы должны думать...

это память для сохранения направления движений и их времени.
это понятно, одно не понятно, где в вашем коде эти переменные??? где то что вы собственно сохранять собрались?....

а по поводу самого кода возникает уверенность, что вы нахватали кусков кода с разных прог и пытаетесь скрестить бульдога с носорогом....

какой воспаленный моск изобрел код для прерывания ? вы понимаете что ваше прерывание выполняется более 8мс, и любой чих на линии ИНТ будет вводить МК в ступор вне зависимости от того принимает он код или нет....

Ссылка на комментарий
Поделиться на другие сайты

Не удержался: закрывающая фигурная скобка для void interrupt()

На форумах принято общаться на "ты", что не является оскорбительным и подразумевает равноправие

Ссылка на комментарий
Поделиться на другие сайты

Подскажите тогда, как объявить переменную как переменную ПЗУ.

:wall: , ручник сними... не объявляются переменные как переменные ППЗУ ... значение переменной через функцию передается в ППЗУ с указанием адреса ячейки ППЗУ , при чтении в функции указывается адрес ячейки , функция возвращает значение ячейки....
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Здравствуйте, совсем недавно начал заниматься программированием PIC-микроконтроллеров. Написал программу двух датчиков препятствий, алгоритм следующий: первый датчик препятствий видит препятствие и едет назад ДО ТОГО ПОКА второй датчик не заметит препятствие и тогда переходит на другую полосу. Но дело в том, что машина едет назад только пару секунд и снова едет вперед. Второй датчик работает нормально.

Что можете посоветовать?

#include <Motor.h>
int Sensor0,Sensor1;
int Adc,Adc1;
char Txt[6];
void Read_Adc()
{
ADCON0=0b11010001;
ADCON0.GO=1;
while(ADCON0.GO);
Adc1=(ADRESH*4)+(ADRESL/64);
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
void main()
{
Delay_ms(1000);
ANSELH.F4=0;
ANSEL=0xFF;
TRISA=0xFF;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(1)
{
Read_Adc();
WordToStr(Adc,Txt);
Lcd_Out(1,1,Txt);
WordToStr(Adc1,Txt);
Lcd_Out(2,1,Txt);

if ((Adc<350) & (Adc1<350) )
Forward (255);
if (Adc>350)
{
Backward(255);
 }
 if(Adc1>350)
{
Motor_stop();
Delay_ms(200);
S_Right(255);
Delay_ms(800);
Motor_stop();
Delay_ms(200);
Forward(255);
Delay_ms(300);
S_Left(255);
Delay_ms(800);
Motor_stop();
Delay_ms(200);
Forward(255);
Delay_ms(300);
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...