Mistryk
|
|
1 | |
PIC16F887 новичок12.11.2011, 21:40. Показов 10082. Ответов 16
Метки нет (Все метки)
*бесконтактное обнаружение объектов*
И так, я хочу чтобы мой робот обходил любое препятствие слева, если же расстояние сократилось, перейти на цикл обхождения препятствий справа, и так далее все время. Помогите сделать это =) Вот собственно моя программа: Код
#include<motor.h> int Adc; char txt[6]; void Read_Adc() { ADCON0=0b11011101; ADCON0.GO=1; while(ADCON0.GO); Adc=(ADRESH*4)+(ADRESL/64); } void main() { Delay_ms(1000); while(PORTA.F4); Delay_ms(1000); { while(1) { Read_Adc(); if(Adc>100) { S_left(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } if(Adc>130) { while(2) { Read_Adc(); if(Adc>100) { S_Right(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } } } } } } |
12.11.2011, 21:40 | |
Ответы с готовыми решениями:
16
Вольтметр на PIC16F887 Проблема с АЦП PIC16F887 PIC16F887. Разъясните пожалуйста Работа кода (PIC16F887) PIC16F887 настройка таймера |
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|
12.11.2011, 21:43 | 2 |
От того что вы пронумеровали условия циклов , чередоваться они не будут .
В вашем случае из while(2) выхода нет. В С - все что отлично от 0 , истинно . Да, и используйте тег code , исходник совершенно не читается ....
0
|
Mistryk
|
|
12.11.2011, 22:49 | 3 |
Я так и не понял что именно нужно сделать, если не трудно опишите по подробней, спасибо.
|
prosto_kot
|
|
13.11.2011, 17:32 | 4 |
Какой смысл несут числа в условиях циклов while() ?
Т.е. почему написано while(1) и while(2) ? Если эти числа - желаемый порядок выполнения циклов, то это неверно, т.к. цикл while рассматривает аргумент как логическое условие (trui / false). Любое число отличное от нуля рассматривается как trui, в итоге показанный код сваливается во внутренний цикл и никогда оттуда не выйдет |
Mistryk
|
|
13.11.2011, 21:30 | 5 |
Ну это я уже понял, но задача все еще остается не решенной.
Хелп! |
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|
13.11.2011, 22:04 | 6 |
Сообщение от Mistryk
Вам ошибку нашли , хоть какие то действия произведите... Или и этот код кто то за вас написал ?
0
|
Mistryk
|
|
14.11.2011, 01:24 | 7 |
Я исправил ошибку! переименовал цикл на while(1), робот выполняет те же действия, что собственно и так понятно.Я прошу помочь мне в решении данной задачи!
|
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
|
|
14.11.2011, 13:34 | 8 |
код в студию, что вы там исправили)
0
|
Mistryk
|
|
14.11.2011, 19:14 | 9 |
#include<motor.h>
int Adc; char txt[6]; void Read_Adc() { ADCON0=0b11011101; ADCON0.GO=1; while(ADCON0.GO); Adc=(ADRESH*4)+(ADRESL/64); } void main() { Delay_ms(1000); while(PORTA.F4); Delay_ms(1000); { while(1) { Read_Adc(); if(Adc>100) { S_left(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } if(Adc>130) { while(1) { Read_Adc(); if(Adc>100) { S_Right(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } } } } } } |
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 69
|
|
14.11.2011, 23:15 | 10 |
Код
void main() { Delay_ms(1000); while(PORTA.F4); Delay_ms(1000); { <---------------------- что это за скобка? while(1) { Read_Adc(); if(Adc>100) { S_left(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } if(Adc>130) { while(1) { Read_Adc(); if(Adc>100) { S_Right(255);Delay_ms(50); } else { Forward(255);Delay_ms(50); } } } } } } А вообще рекомендую вначале нарисовать схему алгоритма работы и блок-схему алгоритма программы, тогда Вам самому будет проще разобраться. С уважением, Dykk.
0
|
Mistryk
|
|
15.11.2011, 00:27 | 11 |
Да, вы совершенно верно поняли, что делает мой робот.Но моя задача написать программу так, чтобы мой робот при adc>130 уже во втором цикле опять же начал поворачивать налево, и так далее поочередно.Естественно я могу написать огромную программу из кучи подобных циклов, но вить это же не рационально, по этому я обращаюсь к вам за помощью.
Спасибо. З.Ы. Почему я не могу использовать несколько циклов, Dykk? |
Mistryk
|
|
15.11.2011, 00:30 | 12 |
Так же я пытался построить программу несколько иначе с помощью двух подпрограмм, но здесь же просто неправильно построена программа.
#include<motor.h> int Adc; char txt[6]; void Read_Adc() { ADCON0=0b11011101; ADCON0.GO=1; while(ADCON0.GO); Adc=(ADRESH*4)+(ADRESL/64); } void Read_Right() { S_right(255);Delay_ms(800); while(1) { Read_Adc(); if(100<Adc<300) { S_Right(255);Delay_ms(400); } else { Forward(255); } if(Adc>300) { Read_Left(); } } } void Read_Left() { S_left(255);Delay_ms(800); while(1) { Read_Adc(); if(100<Adc<300) { S_Left(255);Delay_ms(400); } else { Forward(255); } if(Adc>300) { Read_Right(); } } } void main() { Delay_ms(1000); while(PORTA.F4); Delay_ms(1000); Read_Left(); } |
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|
15.11.2011, 00:34 | 13 |
Сообщение от Mistryk
Суть уловили ?????
0
|
Mistryk
|
|
15.11.2011, 00:58 | 14 |
Хорошо, поставлю вопрос иначе: какую команду мне использовать, чтобы во втором цикле при adc>130 я мог перейти на 1-й цикл?
|
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
|
|
15.11.2011, 01:06 | 15 |
Если через задницу то
if(adc>130)briok; А по нормальному надо структуру программы переделывать. О чем вам уже и намекали .
0
|
Mistryk
|
|
15.11.2011, 10:36 | 16 |
благодарю =)
я прислушаюсь к вашим советам. |
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 69
|
|
16.11.2011, 01:13 | 17 |
Ну, я бы сделал так
Код
while(1) { Read_Adc(); if (ADC>130) { вправо; } else if (ADC>100) { влево; } else вперед; } ./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18 [166.92 Кб]
0
|
16.11.2011, 01:13 | |
16.11.2011, 01:13 | |
Помогаю со студенческими работами здесь
17
uart pic16f887 проблема Ошибки с переменными, Код на Си (pic16f887) ШИМ для PIC16f887 на ASM Не работает прерывание по порту B в PIC16F887 (MikroC) Опрос кнопки и запись в EEPROM (Си, PIC16F887) Нужна помощь со схемой вольтмерта на PIC16F887 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |