Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Атмега8 не хочет правильно работать.

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

1. ОЛЕГ - 18 Февраля, 2009 - 01:10:03 - перейти к сообщению
Значится так. Улыбка
Собрал я на проводочках схему из статьи ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 1) (чтоб не лазать: http://myrobot.ru/stepbystep/r_firstbot1.php), только вместо моторов светики разноцветные (красный типа вперед, желтый назад) привесил в целях экономии шума. Питание от КРЕНа с кондером, 5В.
Пользуюсь АВР Студио и программатором АВР910. Все нормально делается, компилится, прошивается (спасибо Подмигивающий ), НО:
после записи программы вращения моторами туда-сюда из вышеуказанной статьи, светики один раз перемигивают, а потом продолжают гореть все четыре в пол-накала. Замешательство
Как попробовать устранить? Там программа точно рабочая? Или я балбес?

Кстати, когда мы записываем программу- старая стирается? И еще я ГЕКС файл нечаянно первый раз не в Флэш, а в Еепром память записал- это не страшно? Как ее стереть? Впрочем, там он тоже не работал. гы-гы!

Эээ.. попробовал записать программу поворота на необходимый угол- постоянно горят только красные светики, желтые погасли.


Спасибо.
2. redcat - 18 Февраля, 2009 - 09:02:57 - перейти к сообщению
Попробуй для начала без драйвера моторов собрать, повесь светодиоды через резисторы на порты Меги. Если заработает, значит с МК всё норм. Единственное что светодиод не может "светить в разные стороны" при смене полярности подключения, в смысле что мотор крутит в разные стороны.

При записи во флеш, все знакомые мне программаторы очищают предварительно память. А то что ты залил в еепром никак не должно влиять на работу Меги.
3. ОЛЕГ - 18 Февраля, 2009 - 20:04:03 - перейти к сообщению
С памятью понял, спасибо, redcat. Улыбка

Драйвер стопудово рабочий. К его работе претензий нет. Светики работают именно "в разные стороны"- они встречно-параллельно подключены через резисторы. Вот и получается, что при смене полярности желтый гаснет, красный загорается.

Какие еще мнения?
4. ОЛЕГ - 19 Февраля, 2009 - 00:38:59 - перейти к сообщению
Я попробовал напрямую, без драйвера. Прошил мигалку светодиодом- светодиод горит, не мигает.
Как я догадался- в мигалке, где в программе мы конфигурируем порты С- работают С, все другие выключены, где про двигатели- там D, другие выключены.
Но ничего не мигает.
Пробовал и на внешнем кварце, и на внутреннем генераторе- один фиг.
В чем может быть проблема?
5. Белый Волк - 19 Февраля, 2009 - 07:08:01 - перейти к сообщению
ОЛЕГ
EEPROM - это энергонезависимая Flash-память микроконтроллера.
При использовании AVRProg и AVR910, в "Advanced" есть флаг (Fuse) EESAVE (могу ошибиться в названии). Когда он установлен, при перепрограммировании микроконтроллера, состояние EEPROM сохраняется. Этот Fuse изначально запрограммирован.

Простейшее использование EEPROM, которое может пригодиться Вам для простого робота - для генерации случайного числа.

Относительно Вашей проблемы:
Если Вы как-либо изменяли код с указанной страницы, выложите конечную версию, которую Вы компилируете.
6. бот_м_16 - 19 Февраля, 2009 - 18:04:03 - перейти к сообщению
рёв в три ручья Светики через дд рёв в три ручья
Программу в студию
7. ОЛЕГ - 19 Февраля, 2009 - 19:43:06 - перейти к сообщению
Белый Волк, спасибо. Галочка там не стоит. Значит, все в порядке. Улыбка

бот_м_16, спокойно, без истерик. Улыбка
Я все сделал как в статье для того, чтобы не объяснять как там и чего у меня подключено. Устройство служит чисто образовательным целям, а на оплату света у меня скидка 50%. Голливудская улыбка

Программа вот эта. Вот как тут, так в блокнот и вставляю:


/*******************************************************
ПРИМЕР 1 :: ВРАЩЕНИЕ МОТОРАМИ ВПЕРЕД-НАЗАД :: MYROBOT.RU
********************************************************/

#include <avr/io.h>

/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные

for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/


int main(void) // начало основной программы
{

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы

while (1) { // Бесконечный цикл

// ---------- вращаем моторы вперед 1 сек ----------

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(1000); // ждем 1 сек.
// -------------------------------- ------------------


// ---------- вращаем моторы назад 1 сек ----------

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(1000); // ждем 1 сек.
// -------------------------------- ------------------


} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы
8. бот_м_16 - 19 Февраля, 2009 - 20:31:04 - перейти к сообщению
Во первых такую зпдержку делать не спортивно!!! Ухмылка
Лучше на таймере 0 меге 8 он самый простой-один режим нормал
Для задержки -
прочти DS Голливудская улыбка
посчитай период переполнения таймера - T=M(Nmax-N0)/Fтакт
где
M предделитель
Nmax - максимальное значение таймера +1(=256 для таймера 0)
N0-начальное значение таймера
Fтакт - тактовая частота мк
зная какой флаг устанавливается по переполнению счётного регистра в регистре TIFR (см DS)
от туда же узнаём что пока не произошло переполнение флаг =0
ну и всё - установился флаг переключаем ногу и сбрасываем флаг Подмигивающий
(Добавление)
ЗЫ
Хорошая подпись! Помираю со смеху
9. ОЛЕГ - 19 Февраля, 2009 - 20:48:43 - перейти к сообщению
бот_м_16, вопрос стоит несколько иначе. Пока что я хочу, чтобы у меня просто ЗАРАБОТАЛО. До мастера спорта мне ооочень далеко Улыбка , но, по крайней мере, я буду знать, что аппарат рабочий.

Программа, которую я привел, рабочая? С чем может быть проблема? Что мне проверить?
10. бот_м_16 - 19 Февраля, 2009 - 20:53:15 - перейти к сообщению
это не мастер спорта а граматный подход к решению задачи! Улыбка
Качни лучше кодвижен для начало самое оно!
ЗЫ
На генератор начального кода не надеится а делать всё обдуманно !!
11. redcat - 20 Февраля, 2009 - 09:30:55 - перейти к сообщению
чтобы заработало сделай такую программу -

#include <avr/io.h>
#include <util/delay.h>


int main(void)
{

DDRC = 0xff;

while(1) {

PORTC |= _BV(PC1);

_delay_ms(100);

PORTC &= ~_BV(PC1);

_delay_ms(100);

}

}



Светодиод подключи через резистор ~300оМ к выводу 1 порта С, второй вывод светодиода на массу.
С этой программой он должен быстро мигать, что и будет говорить о работоспособности.
12. бот_м_16 - 20 Февраля, 2009 - 17:12:16 - перейти к сообщению
лучше PORTC^=1<<1;
это понятний и писать меньше Подшучивать, дразнить
13. ОЛЕГ - 20 Февраля, 2009 - 20:03:38 - перейти к сообщению
Ну вот, вроде как ништяк!
Загрузил программу, предложенную redcat, светик зажегся, но боковым зрением увидел, что он мигает. Навскидку частота около 50Гц (как люминисцентная лампа). Увеличил delay до 1000мс, стал вспыхивать раза 4 в секунду.

У меня реальные сомнения по поводу тактовой частоты! Или все верно?
14. бот_м_16 - 20 Февраля, 2009 - 23:29:23 - перейти к сообщению
FUSE точно не трогал ? Подмигивающий
15. ОЛЕГ - 21 Февраля, 2009 - 01:55:27 - перейти к сообщению
Да нет, не трогал. Замешательство

Выбрал только в настройках источник тактового сигнала- внешний кварц средней частоты. Ну и Атмега8, соответственно.
Если выставить источником сигнала внутренний генератор 1МГц и прописать задержку 1000 мс, диодик начинает зажигаться чуть дольше (заметно), чем на секунду, ну и гаснуть, соответственно, тоже.

У меня паленый кварц? Грустный