dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба Приветствую форумчане!! Замонался я со своим контроллером Atmega128. Явно знаний недостаточно.. 1. Моя задача: Довести аппаратную платформу (Atmega128 + резонатор 4МГц+источник питания) до рабочего (программируемого) состояния. Т.е. нужно сделать макетную платку на которой можно отлаживать всевозможный код. Схема Э3 на эту платку прилагается: Зачеркнул я те элементы схемы, которые не установил. Платку спаял и включил. Подключился к ней используя программатор AVRISP(фирмовый). Подключается четко и без проблем. Посмотрел фьюзы: Т.е. контроллер жив и как-то работает! Проверяю дальше. Отмечу, что из фьюзов видно, что по умолчанию контроллер тактируется от встроенного RC генератора 1 МГц. Этого достаточно, посчитал я, чтобы убедиться в работоспособности контроллера до конца. 2. Пишу простейший код для моргания лампочкой в порт "А": #define F_CUP 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRA = 0xFF; PORTA = 0x00; while(1) { PORTA = 0x00; _delay_ms(1000); PORTA = 0xFF; _delay_ms(1000); } } Код компилируется без ошибок, я его без проблем прошиваю -----> результата нет вообще. Лампочка не мигает никакая из порта А. Если записываю в порт "А" единицы, тогда лампочка поджигается. Потом записываю в порт "А" нули, диодик гаснет. Т.е. контроллер как-то программируется и воспринимает мой код. #define F_CUP 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRA = 0xFF; PORTA = 0x00; while(1) { PORTA = 0xFF; } } 3. Для компиляции и симуляции использую Atmel Studio6 4. Важный момент, который я заметил: Если я пишу код без функций задержек, тогда на ножке светодиодика вижу меандр с частотой 71 кГц: #define F_CUP 1000000UL #include <avr/io.h> int main(void) { DDRA = 0xFF; PORTA = 0x00; while(1) { PORTA = 0x00; PORTA = 0xFF; } } Т.е. не работает код в котором используется стандартная функция задержек. Пробовал написать и свою простейшую функцию, в результате тоже не работает. #define F_CUP 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRA = 0xFF; PORTA = 0x00; while(1) { test (); PORTA = 0xFF; } } void test (void) { PORTA = 0x00; } Т.е. процессор входит в функцию и там и остается...... 5. Что я делаю неправильно??? ---- Ошибка в коде???? ---- Ошибка в включении контроллера??? ---- Или нужно цеплять кварц и настраивать фьюзы? ---- Возможно дело в фьюзах? Подскажите куда копать????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 августа, 2015 Опубликовано 7 августа, 2015 (изменено) · Жалоба 5. Что я делаю неправильно??? 1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay 2) Вчитайтесь в опечатку в своём коде. 3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ? ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться? Изменено 7 августа, 2015 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба 1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay 2) Вчитайтесь в опечатку в своём коде. 3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ? ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться? 1. Попроваил поставил -О1 и предупреждение ушло. 2. Опечатку нашел и поправил 3. Поставил задержку 100 4. Я это делаю в учебных целях.... нужно разобраться со всем....чтобы потом к этой платке подцепить переферию - индикаторы и т.п. Вообще хотел 16 МГц, но тут оказалось множество подводных камней, которые я не учел.....разберусь...потом можно и побольше Буду пробовать с новым значением оптимизации....отпишусь. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба снимите во фьюзах верхнюю галку - режим совместимости с М103C ( ATmega103), при работе с этой галкой вроде как ряд ног и чё-то ещё не работают у атмеги128. Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба снимите во фьюзах верхнюю галку - режим совместимости с М103C ( ATmega103), при работе с этой галкой вроде как ряд ног и чё-то ещё не работают у атмеги128. Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге. К моему порту А вроде как это не имеет отношение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба К моему порту А вроде как это не имеет отношение ..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт. попробуйте, вдруг поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба 2. Пишу простейший код для моргания лампочкой в порт "А": while(1) { PORTA = 0x00; _delay_ms(1000); PORTA = 0xFF; _delay_ms(1000); } } Код компилируется без ошибок, я его без проблем прошиваю -----> результата нет вообще. Лампочка не мигает никакая из порта А. Думаю если вы запишите сначала PORTA = 0xFF - лампочка будет всегда гореть. Вероятно у вас функция _delay_ms написана с использованием какого-то таймера, который вы не инициализируете. Напишите свою с кучей "nop" или "for (i=0;i<65530;i++);" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба ..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт. попробуйте, вдруг поможет. Я сделаю. Просто это меньше всего похоже на источник ошибок. У меня последний контроллер остался :biggrin: :smile3046: Я с фузами предельно аккуратно. К ним еще придется вернуться....но чуть позже Спасибо большое за совет!! Думаю если вы запишите сначала PORTA = 0xFF - лампочка будет всегда гореть. Вероятно у вас функция _delay_ms написана с использованием какого-то таймера, который вы не инициализируете. Напишите свою с кучей "nop" или "for (i=0;i<65530;i++);" Поменял оптимизацию и уменьшил время задержки...... Этот код начал работать. Т.е. лампочка заморгала.... Ожил После успеха с морганием лампочки, я приступил к функциям....которые тоже не работают #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> void nuli (void); void odin (void); int main(void) { DDRA = 0xFF; PORTA = 0x00; while(1) { nuli (); odin (); } } void nuli (void) { PORTA = 0x00; _delay_ms(100); } void odin (void) { PORTA = 0xFF; _delay_ms(100); } После компиляции этого кода компилятор не выдает не предупреждения, ни ошибки. Все ОК. А диодик не мигает. Что я тут снова не так сделал? Оптимизатор: Я поставил первой функцию odin и у меня постоянно светятся диод, т.е. он подвисает в первой функции и не выходит из нее. Это из-за чего может быть? ________________________________________________________________________________ _______________________________ Я убрал из функции _delay и у меня на диодиках появился меандр. Т.е. проц. застревает в функциях задержек????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба попробуйте другие уровни оптимизации O2, Os Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба попробуйте другие уровни оптимизации O2, Os Поставил уровень оптимизации O2 и все заиграло. А как выбирать этот уровень оптимизации по уму? Подскажите где почитать.... Спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба А как выбирать этот уровень оптимизации по уму? Совсем по уму это потом разберетесь в ходе дела, для КАЖДОГО конкретного обекта компиляции, а для начала, в общем случае, ВСЕГДА максимальный уровень оптимизации, скорее всего по по скорости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба Совсем по уму это потом разберетесь в ходе дела, для КАЖДОГО конкретного обекта компиляции, а для начала, в общем случае, ВСЕГДА максимальный уровень оптимизации, скорее всего по по скорости. Хотелось бы узнать в общих чертах какой уровень оптимизации что оптимизирует в коде. А то "потом" уже настало :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба А то "потом" уже настало :smile3046: Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты. Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать, так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги, читайте документацию на КОНКРЕТНЫЙ компилятор, которым пользуетесь. А "что оптимизирует" видно даже на одном из Ваших скриншотов в виде набора чекбоксов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 7 августа, 2015 Опубликовано 7 августа, 2015 · Жалоба Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты. Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать, так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги, читайте документацию на КОНКРЕТНЫЙ компилятор, которым пользуетесь. А "что оптимизирует" видно даже на одном из Ваших скриншотов в виде набора чекбоксов. мда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 8 августа, 2015 Опубликовано 8 августа, 2015 · Жалоба Хотелось бы узнать в общих чертах какой уровень оптимизации что оптимизирует в коде. это, как и сказали в доке на компилятор. а с delay там всё просто: описано в доке на avrlib, ну или исходник посмотрите. и, на будущее, рекомендую просматривать ассемблерный листинг. Или используйте смекалку)) - поставили бы delay(0) или delay(1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться