реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Atmega128 никак не включится, Прошу помочь найти ошибку
Dmitriyspb
сообщение Aug 7 2015, 06:12
Сообщение #1


Местный
***

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



Приветствую форумчане!! biggrin.gif

Замонался я со своим контроллером 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 раз встал.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 7 2015, 06:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 06:42
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 раз встал.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Aug 7 2015, 06:49
Сообщение #4


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



снимите во фьюзах верхнюю галку - режим совместимости с М103C ( ATmega103), при работе с этой галкой вроде как ряд ног и чё-то ещё не работают у атмеги128.
Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 06:58
Сообщение #5


Местный
***

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



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

К моему порту А вроде как это не имеет отношение
Прикрепленное изображение


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Aug 7 2015, 07:49
Сообщение #6


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



Цитата(Dmitriyspb @ Aug 7 2015, 10:58) *
К моему порту А вроде как это не имеет отношение

..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт.
попробуйте, вдруг поможет.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Aug 7 2015, 07:51
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 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++);"
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 08:17
Сообщение #8


Местный
***

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



Цитата(Lmx2315 @ Aug 7 2015, 10:49) *
..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт.
попробуйте, вдруг поможет.


Я сделаю. Просто это меньше всего похоже на источник ошибок. У меня последний контроллер остался biggrin.gif biggrin.gif biggrin.gif smile3046.gif Я с фузами предельно аккуратно. К ним еще придется вернуться....но чуть позже biggrin.gif
Спасибо большое за совет!!

Цитата(_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 раз встал.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Aug 7 2015, 08:46
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



попробуйте другие уровни оптимизации O2, Os
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 08:54
Сообщение #10


Местный
***

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



Цитата(smalcom @ Aug 7 2015, 11:46) *
попробуйте другие уровни оптимизации O2, Os


Поставил уровень оптимизации O2 и все заиграло.
А как выбирать этот уровень оптимизации по уму?
Подскажите где почитать....
Спасибо за помощь!


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 7 2015, 09:03
Сообщение #11


Гуру
******

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



QUOTE (Dmitriyspb @ Aug 7 2015, 11:54) *
А как выбирать этот уровень оптимизации по уму?

Совсем по уму это потом разберетесь в ходе дела, для КАЖДОГО конкретного обекта компиляции, а для начала, в общем случае, ВСЕГДА максимальный уровень оптимизации, скорее всего по по скорости.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 09:49
Сообщение #12


Местный
***

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



Цитата(zltigo @ Aug 7 2015, 12:03) *
Совсем по уму это потом разберетесь в ходе дела, для КАЖДОГО конкретного обекта компиляции, а для начала, в общем случае, ВСЕГДА максимальный уровень оптимизации, скорее всего по по скорости.

Хотелось бы узнать в общих чертах какой уровень оптимизации что оптимизирует в коде. А то "потом" уже настало smile3046.gif biggrin.gif


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 7 2015, 10:02
Сообщение #13


Гуру
******

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



QUOTE (Dmitriyspb @ Aug 7 2015, 12:49) *
А то "потом" уже настало smile3046.gif biggrin.gif

Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты.
Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать,
так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги,
читайте документацию на КОНКРЕТНЫЙ компилятор, которым пользуетесь. А "что оптимизирует" видно даже на одном из Ваших скриншотов в виде набора чекбоксов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dmitriyspb
сообщение Aug 7 2015, 10:18
Сообщение #14


Местный
***

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



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


мда


--------------------
Победа - это когда N раз упал и N+1 раз встал.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Aug 8 2015, 13:08
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
Хотелось бы узнать в общих чертах какой уровень оптимизации что оптимизирует в коде.

это, как и сказали в доке на компилятор.

а с delay там всё просто: описано в доке на avrlib, ну или исходник посмотрите. и, на будущее, рекомендую просматривать ассемблерный листинг. Или используйте смекалку)) - поставили бы delay(0) или delay(1).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 16:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016