roboforum.ru

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

Сломал голову, подскажите пожалуйста

Сломал голову, подскажите пожалуйста

steel_monkey » 15 июл 2007, 00:27

Начинаю свое знакомство с микроконтроллерами. Сваял схему ( мега-8, 7 диодов на порту D, (начиная с 0го по 6й)  и одна кнопка на нулевом пине порта B), написал програмку, в которой от количестка нажатий на кнопку зависит, в какую сторону движется огонек. В одном- слева направо, в другом- справа налево, в третем- одновременно оба предыдущих случая ( 2 огонька). Но вот незадача: при проверке устройства ( реального) движение слева направо происходит примерно секунду, а потом без нажатия начинается движение справа налево. По идее, без нажатия кнопки происходят только прерывания от таймера, которые двигают огонек, а основная программа зациклена. В АВРстудии вроде все работает без проблем ( по крайней мере, насколько это возможно отсимулировать). В принципе, задача учебная, и её можно решать как это сделано у радиокота http://www.radiokot.ru/start/mcu_fpga/avr/13, но я хочу понять, в чем загвоздка в моём решении.
Вложения
randomway.rar
проект из АВРстудии
(6.31 КиБ) Скачиваний: 64

Master » 15 июл 2007, 01:22

Дядька осваивай С для AVR, т. к. найти ошибку в ассемблерном коде довольно тяжеловато. Да и читаемость кода написанного на С намного лучше.

Master » 15 июл 2007, 01:24

Кстати в радиокоте ошибка у них не инициализируется переменная счетчика нажатий на резет поэтому каждый раз запуске контроллера программа начинается с неопределенного массива.

steel_monkey » 15 июл 2007, 02:06

Спасибо за инфу. До С к сожалению я пока еще не дорос :oops: . Надо хотябы минимальный уровень понимания иметь.

avr123.nm.ru » 15 июл 2007, 08:37

steel_monkey писал(а):До С к сожалению я пока еще не дорос :oops: .

Надо хотябы минимальный уровень понимания иметь.


Вот пожалуйста - минимум ИМХО достаточный  - http://www.roboforum.ru/viewtopic.htm?t=1070

Myp » 15 июл 2007, 11:07

steel_monkey писал(а):Спасибо за инфу. До С к сожалению я пока еще не дорос :oops: . Надо хотябы минимальный уровень понимания иметь.

асм не есть минимальный уровень
асм есть альтернативный уровень

если смог на асме чтото написать то начальные понятия о том что такое программирование имеешь
следовательно бери си и вперёд
для микроконтроллеров сишник очень прост содержит минимум операторов но оч удобен

вот то что посоветовал товарищь АВР тебе очень поможет
куча народа уже воспользовалась тем курсом и стала писать на си

steel_monkey » 15 июл 2007, 13:15

Спасибо конечно, но "курс" я не перевариваю (хотя как сборник полезных ресурсов-вещь незаменимая). Вроде была книга "программирование МК на С" кого-то там..... Но все равно, как вижу кракозябры С, типа скобочек и прочего, вгоняет в жуткий ступор. На асме все проще на мой взгляд. В моём случае дело наверное в необходимости хорошего отладчика.

Master » 15 июл 2007, 13:18

Выбор языка программирования дело каждого программера, но на данном форуме в основном работают на С. Я начинал тоже на асме, тоже по статье из радиокота, но потом перешел на С и об этом не жалею.

Vovan » 15 июл 2007, 13:46

Но все равно, как вижу кракозябры С, типа скобочек и прочего, вгоняет в жуткий ступор. На асме все проще на мой взгляд.

Поддерживаю :)
В моём случае дело наверное в необходимости хорошего отладчика.

Можно попробовать Протеус. Там есть и симуляция и отладка - всё можно реально пронаблюдать. К тому же асм.
___________
С уважением
Vovan

Myp » 15 июл 2007, 16:10

да господи
это асм сплошь кракозябры =)


а си это гут
вон какие красивости =)
Код: Выделить всёРазвернуть
if (buffer[0] == 'R') 
       {
       if  ((buffer[1] == '5')|(buffer[1] == '6')|(buffer[1] == '7')|(buffer[1] == '8')|(buffer[1] == '9'))
               {
               PORTD.2 = 1;    //ставим правый бит направления вращения вперёд
               PORTD.3 = 0;    //и сбрасываем правый бит направления вращения назад
               pwm = (buffer[1] - '0')*10 + (buffer[2] - '0');   //пишем в правый шим
               putsf("\r\nПравый мотор вперёд");
               }
       if  ((buffer[1] == '4')|(buffer[1] == '3')|(buffer[1] == '2')|(buffer[1] == '1')|(buffer[1] == '0'))  
               {
               PORTD.2 = 1;    //ставим правый бит направления вращения назад
               PORTD.3 = 0;    //и сбрасываем правый бит направления вращения вперёд
               pwm = (buffer[1] - '0')*10 + (buffer[2] - '0');                 //пишем в правый шим  
               putsf("\r\nПравый мотор назад");
               }
       }




а по теме...
есть отличнейшая большущая книжка
программирование на языке си для микроконтроллеров AVR и PIC
лежит на фтп робофорума в формате дежавю и в пдф
в дежавю 40 метров в пдф граздо меньше

я для себя распечал ту часть которая для авр

Master » 15 июл 2007, 16:34

2 steel_monkey если хочешь можем накидать твою программку на С и ты увидишь что ничего страшного нет.

steel_monkey » 15 июл 2007, 16:38

Можно попробовать Протеус. Там есть и симуляция и отладка - всё можно реально пронаблюдать. К тому же асм.

В том то и дело, что при симуляции в протеусе все работает как на реальном МК ( правда протеус не очень новый: 6.9 сп 5 вроде. Новый на win 98 не идет), а если симулировать работу в АВРстудии, то такого не возникает. Схема 100% рабочая, сделал её давно и писал для неё новые прошивки. Даже логически не понятно, как МК может изменить регистр, который он только читает и сравнивает: отчего собственно и вопрос. А книгу про программирование МК на С недавно удалил.....
Добавлено:
спасибо, но хочу Вас утруждать. За С я не сяду, пока не организую как минимум USART, ШИМ, I2C и разберусь с АЦП.

Master » 15 июл 2007, 16:51

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

Master » 15 июл 2007, 16:52

И кнопка подключена на землю или на +5V ?

steel_monkey » 15 июл 2007, 17:03

У меня включен внутренний RCшник на 1 МГЦ. Возможно, для упрощения симуляции надо увеличить время горения- сделал другую редакцию сразу с проектом протеуса. Теперь оно должно нормально отсимулироваться.
Вложения
randomway_2.rar
(46.52 КиБ) Скачиваний: 51


Rambler\'s Top100 Mail.ru counter