Перейти к содержанию
    

Atmega128 никак не включится

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

 

Замонался я со своим контроллером Atmega128. Явно знаний недостаточно..

 

1. Моя задача: Довести аппаратную платформу (Atmega128 + резонатор 4МГц+источник питания) до рабочего (программируемого) состояния. Т.е. нужно сделать макетную платку на которой можно отлаживать всевозможный код.

Схема Э3 на эту платку прилагается:

post-74498-1438925700_thumb.jpg

 

Зачеркнул я те элементы схемы, которые не установил.

 

Платку спаял и включил. Подключился к ней используя программатор AVRISP(фирмовый). Подключается четко и без проблем. Посмотрел фьюзы:

post-74498-1438925910_thumb.jpg

 

Т.е. контроллер жив и как-то работает! Проверяю дальше.

 

Отмечу, что из фьюзов видно, что по умолчанию контроллер тактируется от встроенного 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

post-74498-1438926633_thumb.jpg

 

 

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. Что я делаю неправильно???

 

---- Ошибка в коде????

---- Ошибка в включении контроллера???

---- Или нужно цеплять кварц и настраивать фьюзы?

---- Возможно дело в фьюзах?

 

Подскажите куда копать?????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5. Что я делаю неправильно???

1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay

2) Вчитайтесь в опечатку в своём коде.

3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ?

 

ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay

2) Вчитайтесь в опечатку в своём коде.

3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ?

 

ps: лирика. А почему 4 МГц? Почему не 8? Или уже сейчас за потребленире начаи бороться?

 

1. Попроваил поставил -О1 и предупреждение ушло.

 

2. Опечатку нашел и поправил

 

3. Поставил задержку 100

 

4. Я это делаю в учебных целях.... нужно разобраться со всем....чтобы потом к этой платке подцепить переферию - индикаторы и т.п. Вообще хотел 16 МГц, но тут оказалось множество подводных камней, которые я не учел.....разберусь...потом можно и побольше

 

 

 

Буду пробовать с новым значением оптимизации....отпишусь. Спасибо!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ещё фьюз JTAG - позволяет освобождать от оного часть ног на атмеге.

К моему порту А вроде как это не имеет отношение

post-74498-1438930671_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К моему порту А вроде как это не имеет отношение

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

попробуйте, вдруг поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Пишу простейший код для моргания лампочкой в порт "А":

while(1)
    {
        PORTA = 0x00;
        _delay_ms(1000);
        PORTA = 0xFF;
        _delay_ms(1000);
    }
}

 

 

Код компилируется без ошибок, я его без проблем прошиваю -----> результата нет вообще. Лампочка не мигает никакая из порта А.

 

Думаю если вы запишите сначала PORTA = 0xFF - лампочка будет всегда гореть.

Вероятно у вас функция _delay_ms написана с использованием какого-то таймера, который вы не инициализируете.

Напишите свою с кучей "nop" или "for (i=0;i<65530;i++);"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

попробуйте, вдруг поможет.

 

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

Спасибо большое за совет!!

 

Думаю если вы запишите сначала 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);
}

 

После компиляции этого кода компилятор не выдает не предупреждения, ни ошибки. Все ОК. А диодик не мигает.

 

Что я тут снова не так сделал?

 

Оптимизатор:

post-74498-1438935446_thumb.jpg

Я поставил первой функцию odin и у меня постоянно светятся диод, т.е. он подвисает в первой функции и не выходит из нее.

Это из-за чего может быть?

________________________________________________________________________________

_______________________________

Я убрал из функции _delay и у меня на диодиках появился меандр. Т.е. проц. застревает в функциях задержек?????

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуйте другие уровни оптимизации O2, Os

 

Поставил уровень оптимизации O2 и все заиграло.

А как выбирать этот уровень оптимизации по уму?

Подскажите где почитать....

Спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как выбирать этот уровень оптимизации по уму?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А то "потом" уже настало :smile3046: :biggrin:

Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты.

Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать,

так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги,

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы еще очень далеки от "потом". То, на что Вы неступили это есть использование некой совершенно левой неведомой задержки требующей определенного уровня оптимизации и, очевидно, где-то еще и задания тактовой частоты.

Пока Вы еще в нескольких строчках сишного источника себя нетвердо чувствуете, что Вам дадут нюансы трансляции в ассеблер??? Ну если хотите узнать,

так что Вам мешает начать изучать сей вопрос самостоятельно хоть на тех-же Ваших строчках? Включайте разные уровни оптимизации, смотрите листинги,

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

 

мда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...