Без описания |
Поиск в теме | Версия для печати |
Авиапрограммист |
Отправлено: 10 Июня, 2011 - 12:54:36
|

Рядовой

Сообщений всего: 18
Дата рег-ции: Июнь 2011
|
Написал программу для управления игрушечным джипом.
Задние колёса находятся на одной оси, а передние, рулевые, в рулевой машинке.
программа для АТМеги8
CODE:
#define F_CPU 8800000
#include <util/delay.h>#include <avr/io.h>
#include <inttypes.h>
#include <sig-avr.h>
#include <interrupt.h>
#include <stdlib.h>
#define OUT PORTB
#define MOTOR0 PB0
#define MOTOR1 PB1
#define MOTOR2 PB2
#define MOTOR3 PB3
#define SV0 PB4
#define SV1 PB5
#define SV2 PB6
#define SV3 PB7
#define pish PC3
#define IN PIND
#define SF0 PD0
#define SF1 PD1
#define SF2 PD2
#define SF3 PD3
void dvig (int napr)
{
switch (napr) {
case 0:
cbi(OUT, MOTOR0);
cbi(OUT, MOTOR1);
cbi(OUT, MOTOR2);
cbi(OUT, MOTOR3);
break;
case 1:
sbi(OUT, MOTOR0);
cbi(OUT, MOTOR1);
cbi(OUT, MOTOR2);
cbi(OUT, MOTOR3);
break;
case 2:
cbi(OUT, MOTOR0);
sbi(OUT, MOTOR1);
cbi(OUT, MOTOR2);
cbi(OUT, MOTOR3);
break;
case 3:
sbi(OUT, MOTOR0);
cbi(OUT, MOTOR1);
sbi(OUT, MOTOR2);
cbi(OUT, MOTOR3);
break;
case 4:
sbi(OUT, MOTOR0);
cbi(OUT, MOTOR1);
cbi(OUT, MOTOR2);
sbi(OUT, MOTOR3);
break;
case 5:
cbi(OUT, MOTOR0);
sbi(OUT, MOTOR1);
sbi(OUT, MOTOR2);
cbi(OUT, MOTOR3);
break;
case 6:
cbi(OUT, MOTOR0);
sbi(OUT, MOTOR1);
cbi(OUT, MOTOR2);
sbi(OUT, MOTOR3);
break;
}}
int foto (int nom)
{
int i, p, itog;
switch (nom) {
case 0 : for (i=1; i=7; i++) {
sbi(OUT, SV0); _delay_ms(0.0277); if (1==bit_is_set(IN, SF0)) p++;
cbi(OUT, SV0); _delay_ms(0,0277); } break;
case 1 : for (i=1; i=7; i++) {
sbi(OUT, SV1);
_delay_ms(0.0277);
if (1==bit_is_set(IN, SF1)) p++;
cbi(OUT, SV1);
_delay_ms(0,0277); }
break;
case 2 : for (i=1; i=7; i++) {
sbi(OUT, SV2); _delay_ms(0.0277); if (1==bit_is_set(IN, SF2)) p++;
cbi(OUT, SV2); _delay_ms(0,0277); } break;
case 3 : for (i=1; i=7; i++) {
sbi(OUT, SV3); _delay_ms(0.0277); if (1==bit_is_set(IN, SF3)) p++;
cbi(OUT, SV3); _delay_ms(0,0277); } break; }
if (4<p) itog = 1;
else itog = 0;
return itog;
}
int main ()
{
DDRB = 0xff;
PORTB = 0x00;
DDRC = 0xff;
PORTC = 0x00;
DDRD = 0x00;
PORTD = 0xff;
if ( foto(0) == 0) dvig (1);
else { if ( foto(2) == 0) dvig(2);
else {if ( foto(1) == 0) dvig(3);
else {if ( foto(2) == 0) dvig(5);
else { while(1)
{ sbi(OUT, pish); _delay_ ms(0.5); cbi(OUT, pish); _delay_ ms(0.5); }}}}}}
не компилируется пишет:
> "make.exe" all
-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
make.exe: *** No rule to make target `1.elf', needed by `elf'. Stop.
> Process Exit Code: 2
> Time Taken: 00:01
Вот схема: Прикреплено изображение
(Отредактировано автором: 10 Июня, 2011 - 13:45:25) |
|
|
СКАЗОЧНИК |
Отправлено: 10 Июня, 2011 - 13:39:07
|

Главнокомандующий

Сообщений всего: 377
Дата рег-ции: Нояб. 2009
|
Как-то все дико сложно... ни одного комментария, код не упорядочен... Вот попробуй разберись... Куски на ассемблере, куски на С... Зачем так то??
Куда столько библиотек подключенных?
CODE:
sbi(OUT, SV3); _delay_ms(0.0277); if (1==bit_is_set(IN, SF3)) p++;
cbi(OUT, SV3); _delay_ms(0,0277); } break; }
не совсем понятно, но временные задержки... Задаются константами да, но не знаю вещественными ли? И еще одна с точной, а другая с запятой???...
И вообще, где бесконечный цикл???
ИМХО, тут проще все сделано, для двух датчиков и рулевой машинки спереди.
http://myrobot.ru/forum/topic.ph...p;v=l#1307690569
Правда, для КодеВижнАВР, но поправить не сложно. И лишние комментарии, которые КВАВР сам ставит можно вырезать. Все очень просто.
(Добавление)
Как-то все дико сложно... ни одного комментария, код не упорядочен... Вот попробуй разберись... Куски на ассемблере, куски на С... Зачем так то??
Куда столько библиотек подключенных?
сейчас еще не вспомню, работает ли АТМега8 на 8,8 МГц...
CODE:
sbi(OUT, SV3); _delay_ms(0.0277); if (1==bit_is_set(IN, SF3)) p++;
cbi(OUT, SV3); _delay_ms(0,0277); } break; }
не совсем понятно, но временные задержки... Задаются константами да, но не знаю вещественными ли? И еще одна с точкой, а другая с запятой???... Да и если нужны микросекунды, можно написать проще.. И к тому же пропущена скобка ({)...
CODE:
sbi(OUT, SV3); _delay_us(27); if (1==bit_is_set(IN, SF3)) p++;
cbi(OUT, SV3); _delay_us(27); } break; }
И вообще, где бесконечный цикл???
ИМХО, тут проще все сделано, для двух датчиков и рулевой машинки спереди.
http://myrobot.ru/forum/topic.ph...p;v=l#1307690569
Правда, для КодеВижнАВР, но поправить не сложно. И лишние комментарии, которые КВАВР сам ставит можно вырезать. Все очень просто.
(Добавление)
ТСОПы, аж 4 штуки. =) Богатые. на них есть программа управления? Это не просто фототранзисторы. Они только импульсы понимают, еще и определенной частоты.
В программе не разбирался.
Гы... Нашел бесконечный цикл.
Видно, что большая работа проделана большая. |
|
|
Авиапрограммист |
Отправлено: 10 Июня, 2011 - 15:38:23
|

Рядовой

Сообщений всего: 18
Дата рег-ции: Июнь 2011
|
Извините что без комментариев
Вот полностью переделанный код.
исходники первой программы я брал от сюда . Ассемблеровский код я не знаю поэтому подумал, что это СИ
Программу я переписал, но ВИНАВР всё равно выдаёт туже ошибку.
(Добавление)
CODE://------------------------------------------------------------------------
// Программа для управления игрушечной машинкой
//------------------------------------------------------------------------
#define F_CPU 8800000UL // частотa 8800000 герц
#include <avr/io.h>
#include <util/delay.h>
void dvig (int napr) //Процедура для езды
{
switch (napr) {
case 0: //Стоп
PORTB &=~(1<<0);
PORTB &=~(1<<1);
PORTB &=~(1<<2);
PORTB &=~(1<<3);
break;
case 1: //Вперёд
PORTB |=1<<0;
PORTB &=(1<<1);
PORTB &=(1<<2);
PORTB &=(1<<3);
break;
case 2: //Назад
PORTB &=~(1<<0);
PORTB |=1<<1;
PORTB &=~(1<<2);
PORTB &=~(1<<3);
break;
case 3: //Вперёд вправо
PORTB |=1<<0;
PORTB &=~(1<<0);
PORTB |=1<<0;
PORTB &=~(1<<0);
break;
case 4: // Назад вправо
PORTB &=~(1<<0);
PORTB |=1<<0;
PORTB |=1<<0;
PORTB &=~(1<<0);
break;
case 5: // Вперёд влево
PORTB |=1<<0;
PORTB &=~(1<<0);
PORTB &=~(1<<0);
PORTB |=1<<0;
break;
case 6: //Назад влево
PORTB &=~(1<<0);
PORTB |=1<<0;
PORTB &=~(1<<0);
PORTB |=1<<0;
break;
}}
int foto (int nom) // Функция для просмотра расстояния до препядствия
{
int i, p, itog; //Вводим переменные
switch (nom) { //выбор Датчика
case 0 /* Датчик на капоте*/: for (i=1; i=7; i++) { //цикл 7 раз
PORTB |= 1<<4; //Зажигаем светодиод
_delay_ms(0.0277); // Ждём 0.027 мс (один период частоты 36КгЦ)
if (PIND & (1<<PIND0)) p++; //Если сигнал с фототранзистора пришёл р+1
PORTB &=~ (1<<4); // выключаем светодиод
_delay_ms(0.0277); } break;
case 1 /* Датчик Справа*/: for (i=1; i=7; i++) { //цикл 7 раз
PORTB |= 1<<5; //Зажигаем светодиод
_delay_ms(0.0277); // Ждём 0.027 мс (один период частоты 36КгЦ)
if (PIND & (1<<PIND1)) p++; //Если сигнал с фототранзистора пришёл р+1
PORTB &=~ (1<<5); // выключаем светодиод
_delay_ms(0.0277); } break;
case 2 /* Датчик сзади */: for (i=1; i=7; i++) { //цикл 7 раз
PORTB |= 1<<6; //Зажигаем светодиод
_delay_ms(0.0277); // Ждём 0.027 мс (один период частоты 36КгЦ)
if (PIND & (1<<PIND2)) p++; //Если сигнал с фототранзистора пришёл р+1
PORTB &=~ (1<<6); // выключаем светодиод
_delay_ms(0.0277); } break;
case 3 /* Датчик слева*/: for (i=1; i=7; i++) { //цикл 7 раз
PORTB |= 1<<7; //Зажигаем светодиод
_delay_ms(0.0277); // Ждём 0.027 мс (один период частоты 36КгЦ)
if (PIND & (1<<PIND3)) p++; //Если сигнал с фототранзистора пришёл р+1
PORTB &=~ (1<<7); // выключаем светодиод
_delay_ms(0.0277); } break;
if (4<p) itog = 1; //если пришло обратно больше 4 сигналов, препятствие близко; итог = 1
else itog = 0; //иначе препятствие далеко, итог=0
return itog; //возвращаем итог
}}
int main () //
{
DDRB = 0xff; //все порты В как выходы
PORTB = 0x00; //на всех низкий уровень
DDRC = 0xff; //все порты С как выходы
PORTC = 0x00; //на всех низкий уровень
DDRD = 0x00; //Порты D как входы
PORTD = 0xff; //подтягиваем резисторы
while (1) {
if ( foto(0) == 0) dvig (1); //если датчик на капоте не видит препядствие, едь вперёд
else { if ( foto(2) == 0) dvig(2);//иначе если датчик сзади не видит препядствие, едь назад
else {if ( foto(1) == 0) dvig(3);//иначе если датчик справа не видит препядствие, едь вперёд вправо
else {if ( foto(2) == 0) dvig(5);//если датчик слева не видит препядствие, едь вперёд влево
else { while(1)
{ PORTC |= 1<<3; _delay_ ms(0.5); PORTC &= ~ (1<<3); _delay_ ms(0.5); //иначе подавай на пищалку 2КгЦ
}}}}} _delay_ms(1000); }}
(Добавление)
killgur пишет:Надо cоздать Makefile - в нем определяются параметры компиляции файлов проекта и делаются настройки.
Makefile я создал(Отредактировано автором: 10 Июня, 2011 - 15:52:11) |
|
|
killgur |
Отправлено: 10 Июня, 2011 - 16:25:41
|

Гуру

Сообщений всего: 1189
Дата рег-ции: Февр. 2010
|
СКАЗОЧНИК пишет:Компилятор выдает ту же ошибку?
Чем прошиваете?
Сейчас попробуем программу разгрести.
И (я точно не знаю) в ВинАВРе на Си по моему нету процедур, только функции. Это, так просто... =))))
Он не может найти откуда взять отладочный файл для протеуса 1.elf (проект видимо называется "1" )
т.е. болванка этого файла просто не создана автоматически (или путь поиска неверный) при создании makefile
Make Clean вобще делалось или как?

Это вообще цветочки по сравнению с приведением в рабочее состояние какой нибудь VC6++
А в языке С++ вообще процедур нет и не было это не паскаль ... взамен есть пустышки void
BASCOM вот еще есть с IDE написанном видимо на дельфе
(Отредактировано автором: 10 Июня, 2011 - 16:39:46) |
|
|
Авиапрограммист |
Отправлено: 10 Июня, 2011 - 17:34:33
|

Рядовой

Сообщений всего: 18
Дата рег-ции: Июнь 2011
|
СКАЗОЧНИК пишет:И (я точно не знаю) в ВинАВРе на Си по моему нету процедур, только функции. Это, так просто... =))))
killgur пишет:
А в языке С++ вообще процедур нет и не было
Как нет процедур?!
В дев-с++ и в визиоле когда я программировал они были.
А как без них?
Ну ладно. А как void BASCOM пользоваться?
killgur пишет:Он не может найти откуда взять отладочный файл для протеуса 1.elf (проект видимо называется "1" )
т.е. болванка этого файла просто не создана автоматически (или путь поиска неверный) при создании makefile
Make Clean вобще делалось или как?
Make Clean делалось, он всё равно выдаёт это.
я переименовал проект в 123, но компилятор выдаёт теперь тоже самое
make.exe: *** No rule to make target `123.elf', needed by
(Добавление)
СКАЗОЧНИК пишет:Да, а куда установлен ВинАВР?, Какой путь у проекта? Мэйкфайл лежит в папке с проектом, там же где исходник на Си?
Сюда установлен ВИнавр C:\WinAVR-20100110\
Проект находиться здесь C:\Users\Саша\Documents\Схемы\мИКРОКОНТРОЛЛЕРЫ\Проекты\мАШИНА РОБОТ\Конец\
мейкфайл лежит там же где и исходник
А може быть это из-за того, что у меня семёрка?
(Добавление)
Так я переписал мейк файл скомпилировал , но теперь он ругается
> "make.exe" all
-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling C: 123.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8800000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./123.lst -std=gnu99 -MMD -MP -MF .dep/123.o.d 123.c -o 123.o
123.c: In function 'foto':
123.c:74: warning: suggest parentheses around assignment used as truth value
123.c:81: warning: suggest parentheses around assignment used as truth value
123.c:89: warning: suggest parentheses around assignment used as truth value
123.c:96: warning: suggest parentheses around assignment used as truth value
123.c: At top level:
123.c:113: warning: function declaration isn't a prototype
123.c: In function 'main':
123.c:133: error: '_delay_' undeclared (first use in this function)
123.c:133: error: (Each undeclared identifier is reported only once
123.c:133: error: for each function it appears in.)
123.c:133: error: expected ';' before 'ms'
123.c:133: error: expected ';' before 'ms'
make.exe: *** [123.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:01 |
|
|
killgur |
Отправлено: 10 Июня, 2011 - 21:45:25
|

Гуру

Сообщений всего: 1189
Дата рег-ции: Февр. 2010
|
Цитата:
Как нет процедур?!
В дев-с++ и в визиоле когда я программировал они были.
А как без них?
CODE:
void foo() // типа процедура
{
return;
}
Для вас это и есть аналог процедуры , те существуют :-)

Visual => Вижел ... (а не визиоле ) еле понял о чем речь.
(Отредактировано автором: 10 Июня, 2011 - 21:51:01) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
  |
|
|
|