roboforum.ru

Технический форум по робототехнике.
Текущее время: 03 дек 2024, 20:19

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: робот на Atmega8 и L293D
СообщениеДобавлено: 03 дек 2012, 22:05 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Не судите строго и не обходите стороной.Выслушайте мою историю.
Я не сомневаюсь, что данная тема является плагиатом, но искал что-то подобное и находил какие-то куски, но все равно не то. Давно жажду собрать робота, но в этом деле не чайник а полная кастрюля. Надыбал, наверное уже многими из вас истоптанную статейку, http://www.myrobot.ru/stepbystep/r_firstbot2.php. Целенаправленно и решительно настроился создать сие чудо, хотел понять азы самой структуры, т.е.
1)Написать программу( я так понял там на Ассемблере)-с разных форумах всасывал знания, качал книги, но в голове одна каша.
(http://radiokot.ru/start/mcu_fpga/avr/01/ http://www.avr123.nm.ru/ http://cxem.net/beginner/beginner10.php и т.д.) короче учил все что мог, но увы не разобрался толком.
2)По схеме собрать, с ней меньше сложностей возникало.
Войдите в положение, не покидайте меня на произвол судьбы.
Хочу сделать робота реагирующего на линию, как в примере 3, но чтобы он работал как этот http://www.youtube.com/watch?v=HKXxqXy1 ... e=youtu.be и еще 1 нюанс, если линии не будет(закончится, спец. уберу) поворачивал на определенный угол и ехал пару сек, повторял это действие некоторое время и если не находил линию останавливался\отключался.. Буду благодарен всем, кто откликнется на мою просьбу. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 08:29 
Не в сети
Аватара пользователя

Зарегистрирован: 10 ноя 2011, 12:02
Сообщения: 5691
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья
Слегка туманно. В чем просьба-то заключается?
Кашу из головы выхлебать? увы, мы не в силах.
Робот-то собран?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 17:53 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Хочется разобраться в этой всей канителе,чтобы смог самостоятельно написать такую программу, говорят, что она легкая, но для меня хуже темного леса. Хочу понять алгоритм составления программы, какое начало, что писать в центре и в конце. Какие команды использовать и как ими оперировать в зависимости от требований. Не прошу прочитать мне курс лекций с истории основания и заканчивая новейшими введениями. Если взять ту программу, то как дополнить ее теми функциями о которых я писал в предыдущем посте, нужно создать массив или цикл? Напишу, как я понял ее, если не прав то поправте пожалуйста.
#include <avr/io.h>-это вызов файла именно для определенного мк
int main(void)- для определения целочисленных констант(есть вариации этой строки? и зачем?)
//Почему мы не обозначали регистры на ввод? типа R16=Then1; ldi Then1 0b11111111
DDRC = 0xff-вводиться побитовое 16-ное число. Почему ff а не в двоичной?
DDRD = 0x00; аналогично
PORTD = 0xff;порт на ввод? т .е все D0 D1 и т.д. на вводе или только D
далее идет цикл и выход из него, но в что в нем с этими знаками не понять.
while (1)-что означ (1)
if (!(PIND & (1<<PIND1))) что знач эти символы и какие они бывают?
Если не лень кому-то описать, то вы мне очень сильно поможете или хотя бы наводку на информацию, для разъяснения.
На счет сборки, на днях еду за деталями, буду паять. Есть программатор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 18:15 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
не, эт пустая трата. :) у вас в одно ухо влетит, в другое вылетит. берёте самоучители как по по, так и по си по для микроконтроллеров и начинаете изучать. паять можете не спешить, от этого потом шишки на лбу вырастают от вопросов "почему?", "как?",... :pardon: изучая галопом почти все азы пропустите.


Последний раз редактировалось Angel71 04 дек 2012, 18:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 18:30 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Получается, Ассемблер это Си?
А на счет программы, того, что я хочу добавить, хотя бы как это будет выглядеть,если можно-словами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 18:32 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
да, си. словами - забудьте. сначала язык и устройство контроллеров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 04 дек 2012, 18:36 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Хорошо,начну изучать :) . Если будут вопросы, то напишу сюда. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 06 дек 2012, 03:29 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Я начал постепенно осваиваться, вот вопросики возникли. Можно ли вместо if использовать switch, а case вместо else соответственно, и будет это разумнее, если добавить изменения в программе тем, что я описывал выше? Какой командой можно реализовать поворот на данный угол? Задержку можно сделать через прерывание и вынести при помощи метки или обязательно она должна быть в теле цикла ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 06 дек 2012, 05:28 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
http://fsweb.info/programming/c/structures.html
Цитата:
Код:
int a = 2, b = 5;
  ...
  for (i = 0; i <= 5; i++) {
    switch (i) {
      case 0  : c = a + b; break;
      case 1  : c = a - b; break;
      case 2  : c = a * b; break;
      case 3  : c = (float) a / b; break;
      default : c = 0; break;
    }
    printf("Результат: i = %i, c = %f\n", i, c);
  }


Оператор switch может быть заменен вложеным условным оператором. Следующий пример показывает аналогичную рассмотренной конструкцию, но основанную на условных операторах:
Код:
  for (i = 0; i <= 5; i++) {
    if ( i == 0 )
      c = a + b;
    else
    if ( i == 1 )
      c = a - b;
    else
      if ( i == 2 )
        c = a * b;
      else
        if ( i == 3 )
          c = (float) a / b;
        else
          c = 0;
    printf("Результат: i = %i, c = %f\n", i, c);

менять это условие
Код:
if (!(PIND & (1<<PIND1)))
на switch не лучшая затея.
поворот на определённый угол нельзя никакой командой. нужно ставить энкодеры и по ним уже можно будет определять на сколько колесо провернулось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 12 дек 2012, 04:37 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
с языком С немного разобрался, решил перейти на Ассемблер. Саму суть понял, но портами не очень подружися
http://www.myrobot.ru/stepbystep/r_firstbot2.php пример 3 видно, что порты D на ввод, а порты С на вывод.
Начал писать:
.def temp=r16
.def temp1=r17
;======Начало программы=========
.cseg
.org 0
rjmp Start
;==============================
Start:
ldi temp,0b11111111 ;определяем порты на ввод\вывод
ldi temp1,0b00000000
out DDRC, temp
out DDRD, temp1

Init: ldi temp,0b0000000 ;записываем значение
cpi temp,0b00000000;сравнение, если есть свет, то переход по метке
rcall Rew ;если да-переход к метке Rew
rjmp Sew ; иначе переход к Sew
;========назначение портов(едем вперед)======
Rew:
sbi DDRC, PC1 ; устанавливаем 1
cbi DDRC, PC2 ;устанавливаем 0
sbi DDRC, PC3
cbi DDRC, PC4
ret
;==========едем назад==========
Sew:
cbi DDRC, PC1
sbi DDRC, PC2
cbi DDRC, PC3
sbi DDRC, PC4
Проверьте правильность, пожалуйста :) .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 12 дек 2012, 11:55 
Не в сети
Аватара пользователя

Зарегистрирован: 05 окт 2005, 12:03
Сообщения: 3340
Откуда: Литва
прог. языки: asm
Ошибки:
1. ассемблер язык машинозависимый, значит нужно писать под конкретный МК и под конкретный компилятор.
т.е. отсутствуют инклюды
2. нет подтяжки на входах порта D, ведь именно он на вход настроен.
3. начало программы лишено смысла: загружаем в регистр число и тут же чего то от него хотим. А там ничего кроме нашей записи нет... Опрашивать очевидно в данном случае нужно не регистр, а датчики (sbis\cbic) судя по комменту.
4. rcall и rjmp в данном случае применены некорректно, если rcall - то это не переход, а вызов без перехода, а rjmp - переход куда либо, где можно и rcall применить.
5. Старт и инит - очевидно нужно местами поменять...
6. не встречал такого компилятора который бы понял это: sbi DDRC, PC1 - ? правильно - sbi DDRC,1 - т.к. уже один раз указано что порт С, осталось указать какой именно, т.е. 1. Тока и это не правильно см. пункт 6а.
6а. как правильно записать единицу в портС1, например?
7. причем тут ret ?
Рекомендации:
1. пользоваться тегом code.
2. при инициализации портов легче читать когда написано: загружаем число в регистр, а содержимое регистра выводим в портС; загружаем число в регистр, а содержимое регистра выводим в портD; и т.д. по всем портам.
3. скачать книжку Мортона.
4. переходить на си и не возвращаться к асм (раз уж АВР-ки).
Вывод: ошибки - исправить, рекомендации - по желанию естесно :wink:

_________________
_________
Sincerely,
Vovan


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 13 дек 2012, 02:15 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
За разбор ошибок отдельное спасибо, рекомендации учту :roll: Учу ночью, так что отнеситесь с пониманием :) Раз на С так на С, будем пробовать и разбирать :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 15 дек 2012, 06:09 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
Вот очередная моя проба. Кратко изложу словами, чем я там хотел дополнить и что получить.
Подается питание, светодиод загорается, установил фототранзистр. на вывод с рабоч. задержкой при помощи "for". Потом проверяется условие, да- одно действие, не-другое. Поставил метку для перехода командой goto, потом конец выполнение процесса по переходу. Не уверен, что правильно. После проверок условий, поворачиаеться моторы в одну сторону - переходят по метке- едут вперед, конец перехода. После поворачивают в другую сторону, аналогично едут в перед переходя по метке. Это то, что хотел получить и старался написать. Прог прилепил в дополнении. Рассчитываю на профессиональную помощь :)


Вложения:
test_1.txt [1.53 КиБ]
Скачиваний: 243
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 15 дек 2012, 19:40 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
плни, это звездец какой-то, а не код. поставьте хотя бы авр студию. она хоть и через опу в вижуал студию интегрирована ( :evil: vassistx настроили, что бы в комментариях орфографию проверял + куча других пакостей), но по крайней мере более-менее отступы делает
для кода есть специальный тег "code"
Код:
#include <avr/io.h>
#include <util/delay.h>

int main(void) // начало основной программы
{
   DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
   DDRD = 0x00; // все выводы порта D сконфигурировать как входы
   PORTD = 0xff; // установить "1" на всех выводах порта D,
   // включаем подтягивающие резисторы
   
   unsigned char i = 0;
   while (1)
   {
      for(i=0; i<200;i++) //задержка
      if (!(PIND & (1<<PIND1)))  //проверка условия
      {         
         // ---------- вращаем моторы вперед ----------
         start:  //метка для перехода подпрограмм
         PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
         PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
         PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
         PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

         _delay_ms(200); // задержка 0,2сек.

         end start //окончание с перехода на метку
      }
      else
      {
         for(i=0;i<100;i+) //задержка
         {
            // ---------- вращаем моторы назад ----------
            PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
            PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
            PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
            PORTC |= _BV(PC4); // установить "1" на линии 4 порта C

            _delay_ms(200);
         }
      }
      // поворачиваем в одну сторону
      {
         for(i=0;i<200;i++)
         PORTC &= ~_BV(PC3)
         POTRC |= _BV(PC4)

         _delay_ms(200)

         goto start
      }
      //поворачиваем в другу сторону
      for(i=0;i<200;i++)
      {
         PORTC &= ~_BV(PC4)
         PORTC |= _BV(PC3)

         _delay_us(200)
         goto start
      }
   }
}

:) не зря goto повыкидывали в различных языках.
Цитата:
//метка для перехода подпрограмм

так сделайте подпрограмму ака функцию, а не этот жутко пристроенный goto. не то, что бы сам по себе goto это вселенское зло, а просто лучше сразу на всегда про него задудьте или хотя бы на первое время и начните использовать только когда он действительно понадобится.
:) и кста код в принципе не должен компилироваться. вы вообще хотя бы пытались вникнуть в сообщения компилятора после того, как решили на самоучитель по си забить? это вы в обычном тексте можете творить всё что угодно. :pardon: хоть без знаков припинания, хоть всё слитно пишите. а в программе такие финты не проходят.
точки с запятыми расставьте. вот это
Код:
      // поворачиваем в одну сторону
      {
         for(i=0;i<200;i++)

вроде должно быть так
Код:
      // поворачиваем в одну сторону
      for(i=0;i<200;i++)
      {

я конечно не всё из си помню, но это
Код:
end start //окончание с перехода на метку

ещё что за отсебятина?
а тут
Код:
for(i=0;i<100;i+)

кто второй + съёл?
а тут
Код:
      for(i=0;i<200;i++)
      {
         PORTC &= ~_BV(PC3);
         POTRC |= _BV(PC4);

что за POTRC?
и вообще выделите отдельные ф-и и их вызывайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: робот на Atmega8 и L293D
СообщениеДобавлено: 17 дек 2012, 00:20 
Не в сети

Зарегистрирован: 03 дек 2012, 21:29
Сообщения: 11
получается необходимо поставить ; где надо и изменить goto, а в целом лог. построение правильно? сейчас стараюсь довести до ума в CodAVR, я правильно написал(или сделал вид :) ) программу для предыдущего моего поста?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO