|
Atmega128 никак не включится, Прошу помочь найти ошибку |
|
|
|
Aug 7 2015, 06:12
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Приветствую форумчане!! Замонался я со своим контроллером 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. Что я делаю неправильно???
---- Ошибка в коде???? ---- Ошибка в включении контроллера??? ---- Или нужно цеплять кварц и настраивать фьюзы? ---- Возможно дело в фьюзах?
Подскажите куда копать?????
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 7 2015, 06:29
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата 5. Что я делаю неправильно??? 1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay 2) Вчитайтесь в опечатку в своём коде. 3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ? ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться?
Сообщение отредактировал Genadi Zawidowski - Aug 7 2015, 06:34
|
|
|
|
|
Aug 7 2015, 06:42
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(Genadi Zawidowski @ Aug 7 2015, 09:29)  1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay 2) Вчитайтесь в опечатку в своём коде. 3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ?
ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться? 1. Попроваил поставил -О1 и предупреждение ушло. 2. Опечатку нашел и поправил 3. Поставил задержку 100 4. Я это делаю в учебных целях.... нужно разобраться со всем....чтобы потом к этой платке подцепить переферию - индикаторы и т.п. Вообще хотел 16 МГц, но тут оказалось множество подводных камней, которые я не учел.....разберусь...потом можно и побольше Буду пробовать с новым значением оптимизации....отпишусь. Спасибо!
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 7 2015, 06:58
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(Lmx2315 @ Aug 7 2015, 09:49)  снимите во фьюзах верхнюю галку - режим совместимости с М103C ( ATmega103), при работе с этой галкой вроде как ряд ног и чё-то ещё не работают у атмеги128. Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге. К моему порту А вроде как это не имеет отношение
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 7 2015, 07:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(Dmitriyspb @ Aug 7 2015, 09:12)  2. Пишу простейший код для моргания лампочкой в порт "А": Код while(1) { PORTA = 0x00; _delay_ms(1000); PORTA = 0xFF; _delay_ms(1000); } } Код компилируется без ошибок, я его без проблем прошиваю -----> результата нет вообще. Лампочка не мигает никакая из порта А. Думаю если вы запишите сначала PORTA = 0xFF - лампочка будет всегда гореть. Вероятно у вас функция _delay_ms написана с использованием какого-то таймера, который вы не инициализируете. Напишите свою с кучей "nop" или "for (i=0;i<65530;i++);"
|
|
|
|
|
Aug 7 2015, 08:17
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(Lmx2315 @ Aug 7 2015, 10:49)  ..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт. попробуйте, вдруг поможет. Я сделаю. Просто это меньше всего похоже на источник ошибок. У меня последний контроллер остался  Я с фузами предельно аккуратно. К ним еще придется вернуться....но чуть позже Спасибо большое за совет!! Цитата(_4afc_ @ Aug 7 2015, 10:51)  Думаю если вы запишите сначала 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 и у меня на диодиках появился меандр. Т.е. проц. застревает в функциях задержек?????
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 7 2015, 08:54
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(smalcom @ Aug 7 2015, 11:46)  попробуйте другие уровни оптимизации O2, Os Поставил уровень оптимизации O2 и все заиграло. А как выбирать этот уровень оптимизации по уму? Подскажите где почитать.... Спасибо за помощь!
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 7 2015, 09:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Dmitriyspb @ Aug 7 2015, 11:54)  А как выбирать этот уровень оптимизации по уму? Совсем по уму это потом разберетесь в ходе дела, для КАЖДОГО конкретного обекта компиляции, а для начала, в общем случае, ВСЕГДА максимальный уровень оптимизации, скорее всего по по скорости.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 7 2015, 10:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Dmitriyspb @ Aug 7 2015, 12:49)  А то "потом" уже настало  Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты. Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать, так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги, читайте документацию на КОНКРЕТНЫЙ компилятор, которым пользуетесь. А "что оптимизирует" видно даже на одном из Ваших скриншотов в виде набора чекбоксов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 7 2015, 10:18
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(zltigo @ Aug 7 2015, 13:02)  Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты. Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать, так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги, читайте документацию на КОНКРЕТНЫЙ компилятор, которым пользуетесь. А "что оптимизирует" видно даже на одном из Ваших скриншотов в виде набора чекбоксов. мда
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 9 2015, 05:10
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(smalcom @ Aug 8 2015, 17:08)  это, как и сказали в доке на компилятор.
а с delay там всё просто: описано в доке на avrlib, ну или исходник посмотрите. и, на будущее, рекомендую просматривать ассемблерный листинг. Или используйте смекалку)) - поставили бы delay(0) или delay(1). Спасибо, учту
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 10 2015, 05:05
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(Сергей Борщ @ Aug 9 2015, 09:39)  Вы фуз совместимости с M103 выключили? Он не только на порты влияет. У 103 и 128 ОЗУ находится по разным адресам. Поэтому, если вы заливаете слинкованную под 128 программу в кристалл с активным фузом совместимости с 103, стек оказывается за пределами ОЗУ. И ваша программа работает до тех пор, пока ей не понадобится стек - для сохранения адреса возврата из функции/прерывания или для какой-либо временной/локалной переменной Я выключу. Моя программка заработала. Т.е. процессор бегает по всем описанным мной функциям. И это прекрасно Теперья пытаюсь настроить I2C (TWI) и пока ничего не выходит. Возможно это как-то связано с этим фьюзом. Отключу...напишу Спасибо, большое!!!!
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 10 2015, 08:57
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Прошу помочь мне выбрать фьюзы для внешнего кварца 4 МГц Вот те фьюзы, которые сейчас установлены:
А вот список "SUT_CKSEL":
Из увиденного мне нужно EXT XTAL вот только не ясно какой из увиденных нужен. Подскажите..
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 10 2015, 12:13
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(Jury093 @ Aug 10 2015, 13:54)  а вы не пробовали полистать документацию на чип, допустим в разделе "System Clock and Clock Options" параграф "Clock sources"? В общем-то сложность в том, что atmel studio предлагает гиганский список, а не код из Datasheet. Вот я и запутался А вы документацию читали, допустим в разделе "System Clock and Clock Options" параграф "Clock sources"?
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
|
Aug 10 2015, 14:54
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
А что там читать? Страница 36 в PDF-версии мануала на 128-й кристалл. XDIV = 0; - чтобы не делил тактовую CKSEL[3:0] = 1010~1111. Страница 38 - рекомендуется для 3-8МГц кристалла, использовать Fuse биты 111x Последний означает плавный запуск. Значит, в случае хорошего источника питания (крутой фронт) - можно использовать 1111. Иначе - 1110. Биты SUT[1:0] можете вообще не трогать. Сразу переходим на страницу 287. Программируете 0xFF в EFUSE, 0x99 - HFUSE, 0xEF - LFUSE. Все биты я выбрал за Вас. Дальше - пробуете писать код.
|
|
|
|
|
Aug 11 2015, 06:39
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 21-11-12
Из: Россия г. Санкт-Петербург
Пользователь №: 74 498

|
Цитата(AlanDrakes @ Aug 10 2015, 17:54)  А что там читать? Страница 36 в PDF-версии мануала на 128-й кристалл. XDIV = 0; - чтобы не делил тактовую CKSEL[3:0] = 1010~1111. Страница 38 - рекомендуется для 3-8МГц кристалла, использовать Fuse биты 111x Последний означает плавный запуск. Значит, в случае хорошего источника питания (крутой фронт) - можно использовать 1111. Иначе - 1110. Биты SUT[1:0] можете вообще не трогать. Сразу переходим на страницу 287. Программируете 0xFF в EFUSE, 0x99 - HFUSE, 0xEF - LFUSE. Все биты я выбрал за Вас. Дальше - пробуете писать код. Мир не без добрых людей. Как же вы умны и сообразительны. Великолепно. Я в восторге. Спасибо Вам большое.
--------------------
Победа - это когда N раз упал и N+1 раз встал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|