roboforum.ru

Технический форум по робототехнике.


робот на Atmega8 и L293D

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

робот на Atmega8 и L293D

Сообщение LowBit » 03 дек 2012, 22:05

Не судите строго и не обходите стороной.Выслушайте мою историю.
Я не сомневаюсь, что данная тема является плагиатом, но искал что-то подобное и находил какие-то куски, но все равно не то. Давно жажду собрать робота, но в этом деле не чайник а полная кастрюля. Надыбал, наверное уже многими из вас истоптанную статейку, 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 нюанс, если линии не будет(закончится, спец. уберу) поворачивал на определенный угол и ехал пару сек, повторял это действие некоторое время и если не находил линию останавливался\отключался.. Буду благодарен всем, кто откликнется на мою просьбу. :)
LowBit
 
Сообщения: 11
Зарегистрирован: 03 дек 2012, 21:29

Re: робот на Atmega8 и L293D

Сообщение elmot » 04 дек 2012, 08:29

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

Re: робот на Atmega8 и L293D

Сообщение LowBit » 04 дек 2012, 17:53

Хочется разобраться в этой всей канителе,чтобы смог самостоятельно написать такую программу, говорят, что она легкая, но для меня хуже темного леса. Хочу понять алгоритм составления программы, какое начало, что писать в центре и в конце. Какие команды использовать и как ими оперировать в зависимости от требований. Не прошу прочитать мне курс лекций с истории основания и заканчивая новейшими введениями. Если взять ту программу, то как дополнить ее теми функциями о которых я писал в предыдущем посте, нужно создать массив или цикл? Напишу, как я понял ее, если не прав то поправте пожалуйста.
#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))) что знач эти символы и какие они бывают?
Если не лень кому-то описать, то вы мне очень сильно поможете или хотя бы наводку на информацию, для разъяснения.
На счет сборки, на днях еду за деталями, буду паять. Есть программатор.
LowBit
 
Сообщения: 11
Зарегистрирован: 03 дек 2012, 21:29

Re: робот на Atmega8 и L293D

Сообщение Angel71 » 04 дек 2012, 18:15

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

Re: робот на Atmega8 и L293D

Сообщение LowBit » 04 дек 2012, 18:30

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

Re: робот на Atmega8 и L293D

Сообщение Angel71 » 04 дек 2012, 18:32

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

Re: робот на Atmega8 и L293D

Сообщение LowBit » 04 дек 2012, 18:36

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

Re: робот на Atmega8 и L293D

Сообщение LowBit » 06 дек 2012, 03:29

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

Re: робот на Atmega8 и L293D

Сообщение Angel71 » 06 дек 2012, 05:28

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 не лучшая затея.
поворот на определённый угол нельзя никакой командой. нужно ставить энкодеры и по ним уже можно будет определять на сколько колесо провернулось.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: робот на Atmega8 и L293D

Сообщение LowBit » 12 дек 2012, 04:37

с языком С немного разобрался, решил перейти на Ассемблер. Саму суть понял, но портами не очень подружися
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
Проверьте правильность, пожалуйста :) .
LowBit
 
Сообщения: 11
Зарегистрирован: 03 дек 2012, 21:29

Re: робот на Atmega8 и L293D

Сообщение Vovan » 12 дек 2012, 11:55

Ошибки:
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
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: робот на Atmega8 и L293D

Сообщение LowBit » 13 дек 2012, 02:15

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

Re: робот на Atmega8 и L293D

Сообщение LowBit » 15 дек 2012, 06:09

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

Re: робот на Atmega8 и L293D

Сообщение Angel71 » 15 дек 2012, 19:40

плни, это звездец какой-то, а не код. поставьте хотя бы авр студию. она хоть и через опу в вижуал студию интегрирована ( :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?
и вообще выделите отдельные ф-и и их вызывайте.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: робот на Atmega8 и L293D

Сообщение LowBit » 17 дек 2012, 00:20

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

След.

Вернуться в Новичкам или основы основ роботостроения.

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

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