роботы робототехника микроконтроллеры


 Страниц (2): [1] 2 »   

> Без описания
Авиапрограммист Post Id



Рядовой


Сообщений всего: 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



Вот схема:
Прикреплено изображение
Безымянный~1.jpg

(Отредактировано автором: 10 Июня, 2011 - 13:45:25)

 
 Top
СКАЗОЧНИК Post Id



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


Сообщений всего: 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 штуки. =) Богатые. на них есть программа управления? Это не просто фототранзисторы. Они только импульсы понимают, еще и определенной частоты.

В программе не разбирался.
Гы... Нашел бесконечный цикл. Ухмылка

Видно, что большая работа проделана большая.
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



Надо cоздать Makefile - в нем определяются параметры компиляции файлов проекта и делаются настройки.
Процесс создания Makefile автоматизирован утилитой MFile - запустите её.
(Добавление)
понапридумают же...

(Отредактировано автором: 10 Июня, 2011 - 14:11:18)

 
 Top
СКАЗОЧНИК Post Id



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


Сообщений всего: 377
Дата рег-ции: Нояб. 2009  



killgur пишет:
Надо cоздать Makefile

Да, и про это я забыл. =))
Вот по этой ссылке есть, как его правильно настраивать.
http://myrobot.ru/stepbystep/mc_makefile.php
 
 Top
Авиапрограммист Post Id



Рядовой


Сообщений всего: 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)

 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



ошибка в makefile

создать то создали только не убрали то что насоздавали раньше или создали куда то не туда.

проверяйте, чудес не бывает
 
 Top
Авиапрограммист Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Июнь 2011  



ИК локатор я нашёл здесь
 
 Top
СКАЗОЧНИК Post Id



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


Сообщений всего: 377
Дата рег-ции: Нояб. 2009  



Компилятор выдает ту же ошибку?
Чем прошиваете?
Сейчас попробуем программу разгрести.
И (я точно не знаю) в ВинАВРе на Си по моему нету процедур, только функции. Это, так просто... =))))
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



СКАЗОЧНИК пишет:
Компилятор выдает ту же ошибку?
Чем прошиваете?
Сейчас попробуем программу разгрести.
И (я точно не знаю) в ВинАВРе на Си по моему нету процедур, только функции. Это, так просто... =))))




Он не может найти откуда взять отладочный файл для протеуса 1.elf (проект видимо называется "1" )

т.е. болванка этого файла просто не создана автоматически (или путь поиска неверный) при создании makefile

Make Clean вобще делалось или как?



Это вообще цветочки по сравнению с приведением в рабочее состояние какой нибудь VC6++

А в языке С++ вообще процедур нет и не было это не паскаль ... взамен есть пустышки void

BASCOM вот еще есть с IDE написанном видимо на дельфе Подмигивающий

(Отредактировано автором: 10 Июня, 2011 - 16:39:46)

 
 Top
СКАЗОЧНИК Post Id



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


Сообщений всего: 377
Дата рег-ции: Нояб. 2009  



Да, а куда установлен ВинАВР?, Какой путь у проекта? Мэйкфайл лежит в папке с проектом, там же где исходник на Си?
 
 Top
Авиапрограммист Post Id



Рядовой


Сообщений всего: 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
 
 Top
СКАЗОЧНИК Post Id



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


Сообщений всего: 377
Дата рег-ции: Нояб. 2009  



Авиапрограммист пишет:
А може быть это из-за того, что у меня семёрка?

У меня тоже семерка. =)))
А проект лучше положить тоже на диск С. И без русских букв и пробелов в названии.

Делай пишется без пробелов...
CODE:

_delay_ms(0.5)

И поставьте там нормальное ЦЕЛОЕ число.
(Добавление)
CODE:

if (4<p) itog = 1; //если пришло обратно больше 4 сигналов, препятствие близко; итог = 1
else itog = 0; //иначе препятствие далеко, итог=0
return itog; //возвращаем итог

зачем это? Не нашел где используется....
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



_delay_ms(1); /* задержка 0.001 c. */
_delay_us(1); /* задержка 0.000001 c. */

(Отредактировано автором: 10 Июня, 2011 - 19:53:47)

 
 Top
Авиапрограммист Post Id



Рядовой


Сообщений всего: 18
Дата рег-ции: Июнь 2011  



СКАЗОЧНИК пишет:
зачем это? Не нашел где используется....

У меня микросхема-фотоэлемент TSOP1736 внутри стоит усилитель и фильтр частоты который пропускает 36КгЦ. если он принял сигнал, то он подаёт на Меге8 1.
Если он принимает более 4 импульсов, то значит впереди преграда и Выдаём значение функции 1 иначе 0.
(Добавление)
mihail пишет:
_delay_us(1); /* задержка 0.000001 c. */


УРРРААААААААААА!!!! высший восторг высший восторг высший восторг
Я поменял и у меня всё скомпилировалось Голливудская улыбка



> "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 'foto':
123.c:106: warning: control reaches end of non-void function

Linking: 123.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8800000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=123.o -std=gnu99 -MMD -MP -MF .dep/123.elf.d 123.o --output 123.elf -Wl,-Map=123.map,--cref -lm

Creating load file for Flash: 123.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock 123.elf 123.hex

Creating load file for EEPROM: 123.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 123.elf 123.eep || exit 0

Creating Extended Listing: 123.lss
avr-objdump -h -S -z 123.elf > 123.lss

Creating Symbol Table: 123.sym
avr-nm -n 123.elf > 123.sym

Size after:
AVR Memory Usage
----------------
Device: atmega8

Program: 430 bytes (5.2% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:04

(Добавление)
Когда я всё сделаю я напишу или если будут ещё вопросы.
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



Цитата:

Как нет процедур?!
В дев-с++ и в визиоле когда я программировал они были.
А как без них?


CODE:

void foo() // типа процедура
{
return;
}


Для вас это и есть аналог процедуры , те существуют :-)



Visual => Вижел ... (а не визиоле ) еле понял о чем речь.

(Отредактировано автором: 10 Июня, 2011 - 21:51:01)

 
 Top
Страниц (2): [1] 2 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru