Технический форум по робототехнике.
space » 15 июн 2008, 11:46
Вообщем есть 2 программы. 1 - это свободное блуждание и движение на свет. Вообщем проект Congeror. 2 - это программа для следования по линии. Вы спросите а что за третья тогда, а 3 - это должна быть основная, то есть управлением теми двумя программами. То есть есть 4 кнопки старт, стоп, mobile и line tracer. С помощью этих кнопок буду всем этим рулить, а как рулить описал ниже в самом куске программы. Только как это сделать ума не приложу. Пробовал совместить сам по примеру. Но что - то совсем не то получилось.
Что касается совмещения(подпрограммы). Каждая из программ должна быть в своём текстовом документе. Вот как должна выглядить управляющая программа:
- Код: Выделить всё • Развернуть
#include "tracer.h"
#include "mobile.h"
#define IN PINB
#define LIGHT_Start PB0 //старт
#define LIGHT_Stop PB1 // стоп
#define LIGHT_Line Tracer PB2 // Line Tracer
#define LIGHT_mobile PB3 // R1-b1 (mobile)
/**
* Главная функция
*/
int main( void )
{
/**
* Сдесь должен быть режим ожидания нажатия 2 кнупок.
* О которых ниже. До тех пор пока не будет ни чего
* нажато, робот должен стоять на месте.
*/
/**
* Нажатие кнопки Mobile, за тем start и если нужно остановить,
* то нажимаем кнопку stop. После кнопки stop переходим сново в
* режим ожидания.
*/
/**
* Нажатие кнопки Line Tracer, за тем start и если нужно остановить,
* то нажимаем кнопку stop. После кнопки stop переходим сново в
* режим ожидания.
*/
sei();
while(1);
return 0;
}
- Вложения
-
WinRAR.rar
- Сдесь все программы. Ну то есть как пробовал совместить.
- (13.37 КиБ) Скачиваний: 27
Кирилл » 15 июн 2008, 15:41
А какой МК используешь? флеша то хватит?
space » 15 июн 2008, 16:11
Ах. да. про это забыл упомянуть. Atmega16 я использую. А памяти хватит
space » 17 июн 2008, 10:42
Подскажите хотя бы как вообще делаются подпрограммы. Ну или где про это почитать?
EdGull » 17 июн 2008, 11:26
может все таки на васике попробуешь?

space » 17 июн 2008, 14:07
извини, но привык к си.
Myp » 17 июн 2008, 14:25
space писал(а):извини, но привык к си.
извини, но ты ваАаще ни к чему не привык пока что ещё

EdGull » 17 июн 2008, 14:30
извини, но МУР прав...
а если по теме, то аналогичная прога выложена и разжевана в МиниБотовской вике в уроках, но там тока на васике, так что можешь туда даже не ходить...

space » 17 июн 2008, 14:50
Мур, а не чего смеяться. Если мне на васике писать всё это, то значит заново во всё разбираться

придётся, а на си я хоть что-то понимаю.
не можете помочь так и скажите

Кирилл » 17 июн 2008, 17:58
с Бейсиком разобраться получиться очень быстро, тем более если есть опыт написания прог на си. А подпрограммы в бейсике осуществляются сказочно просто.
AlexCH » 17 июн 2008, 18:24
space писал(а):Нажатие кнопки Mobile, за тем start и если нужно остановить,
* то нажимаем кнопку stop. После кнопки stop переходим сново в
* режим ожидания.
*/
* Нажатие кнопки Line Tracer, за тем start и если нужно остановить,
* то нажимаем кнопку stop. После кнопки stop переходим сново в
* режим ожидания.
А не проще сделать три кнопки - Mobile, LineTracer и Стоп?
Нажимаешь кнопку - запускается нужный режим.
Нажимаешь Стоп - режим ожидания.
- Код: Выделить всё • Развернуть
void select_mode(void); // опережающее описание select_mode(void)
char button; // переменная кода кнопки
void scanbutton(void){
// тут сканирование кнопок. результат в переменную button
}
void prog1(void){
// тут подпрограмма 1
if (button = exit){
select_mode();
};
}
void prog2(void){
// тут подпрограмма 2
if (button = exit){
select_mode();
};
}
void select_mode(void){
button = 0; // обнуление переменной
while(Button == 0){ // ожидание нажатия кнопки
PORTD^=(1<<6); // изменить состояние светодиода подключенного к PORTD.6
delay_ms(100); // светодиод будет мигать с этой задержкой пока не нажата ни одна кнопка
scanbutton(); // проверить состояние кнопок
};
switch (button){
case 1:
prog1(); // запуск prog1
break;
case 2:
prog2(); // запуск prog1
break;
};
}
void main(void)
{
while()1{
select mode();
};
}
Вот примерно так

space » 17 июн 2008, 18:51
Можно и без кнопки старт. Завтра и попробую после сдачи экзамена.
Добавлено спустя 5 минут 53 секунды:А вставлять программу полностью сюда:
- Код: Выделить всё • Развернуть
void prog1(void){
// тут подпрограмма 1
if (button = exit){
select_mode();
};
Вот так?
- Код: Выделить всё • Развернуть
void prog1(void){
#include <avr/io.h>
#define IN PIND
#define LED PD6 // светодиод
//------------------------------------------------------------------------------
// Задержка t х 10ms
//------------------------------------------------------------------------------
#define K_DELAY_10ms F_CPU/600 // для F_CPU=8000000
void Delay_10ms(unsigned char t) {
if (t==0) return;
unsigned int i;
while (t--) for(i=0;i<K_DELAY_10ms; i++);
}
//------------------------------------------------------------------------------
// Главная программа
//------------------------------------------------------------------------------
int main(void)
{
DDRD = 0x40; // назначаем все линии порта D на вход, кроме PD6
PORTD = 0xbf; // подключаем внутренние нагрузочные резисторы, кроме PD6
while(1) { // запускаем бесконечный цикл
cbi(PORTD, LED); // Зажигаем LED
Delay_10ms(100); // пауза
sbi(PORTD, LED); // гасим LED
Delay_10ms(100); // пауза
}
}
if (button = exit){
select_mode();
};
AlexCH » 17 июн 2008, 19:27
Нет, не так. Видимо надо учиться программировать

Тебе нужно разобраться, что значит каждая строка кода.
Иначе написать что-то свое не сможешь.
И компилятор, у меня CVAVR, у тебя видимо другой.
В последнем твоем примере программа мигает светодиодом. Если ее перенести в функцию prog1, это будет примерно так:
- Код: Выделить всё • Развернуть
void prog1(void){
while(1) { // запускаем бесконечный цикл
cbi(PORTD, LED); // Зажигаем LED
Delay_10ms(100); // пауза
sbi(PORTD, LED); // гасим LED
Delay_10ms(100); // пауза
// здесь нужно проверить какая кнопка нажата
if (button = exit){ // если кнопка выход
select_mode(); // переходим в режим выбора
};
}
При этом используемая в подпрограмме "prog1" функция "Delay_10ms" должна быть описана в программе.
space » 21 июн 2008, 17:56
Ну вот. Как делать подпрограммы в WinAVR разобрался. Теперь пробую сделать типо стартовой кнопки чтоб разобраться как это дело работать будет.
Но пока как то не очень получается. Прога получилась из 3 файлов. R1-B1.c - главный файл, R1-B1.h - заголовочный файл и Button.c - файл в котором прога для стартовой кнопки. Помучаюсь пока ещё сам, если ни чего не получится надеюсь поможите. А вот собственно результат:
- Вложения
-
.rar
- (22.32 КиБ) Скачиваний: 28
space » 24 июн 2008, 15:20
Слушайте, а можите хотя бы примерно показать как сделать запуск программы (всей) по нажатию кнопки(В WinAVR)? Пожалуйста
