Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega128 никак не включится
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Dmitriyspb
Приветствую форумчане!! 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. Что я делаю неправильно???

---- Ошибка в коде????
---- Ошибка в включении контроллера???
---- Или нужно цеплять кварц и настраивать фьюзы?
---- Возможно дело в фьюзах?

Подскажите куда копать?????
Genadi Zawidowski
Цитата
5. Что я делаю неправильно???

1) Не читаете предупреждения компилятора, на каком уровне опитмизации (требует) работает фцнкция delay
2) Вчитайтесь в опечатку в своём коде.
3 (не уверен) - а 1000 это допустимый параметр для _delay_ms() ?

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

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


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

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

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

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



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

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

К моему порту А вроде как это не имеет отношение
Нажмите для просмотра прикрепленного файла
Lmx2315
Цитата(Dmitriyspb @ Aug 7 2015, 10:58) *
К моему порту А вроде как это не имеет отношение

..вам тяжело снять галку с фьюза совместимости? это ваш микроконтроллер не убьёт.
попробуйте, вдруг поможет.
_4afc_
Цитата(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++);"
Dmitriyspb
Цитата(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 и у меня на диодиках появился меандр. Т.е. проц. застревает в функциях задержек?????
smalcom
попробуйте другие уровни оптимизации O2, Os
Dmitriyspb
Цитата(smalcom @ Aug 7 2015, 11:46) *
попробуйте другие уровни оптимизации O2, Os


Поставил уровень оптимизации O2 и все заиграло.
А как выбирать этот уровень оптимизации по уму?
Подскажите где почитать....
Спасибо за помощь!
zltigo
QUOTE (Dmitriyspb @ Aug 7 2015, 11:54) *
А как выбирать этот уровень оптимизации по уму?

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

Хотелось бы узнать в общих чертах какой уровень оптимизации что оптимизирует в коде. А то "потом" уже настало smile3046.gif biggrin.gif
zltigo
QUOTE (Dmitriyspb @ Aug 7 2015, 12:49) *
А то "потом" уже настало smile3046.gif biggrin.gif

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


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

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

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

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

Спасибо, учту
Сергей Борщ
Вы фуз совместимости с M103 выключили? Он не только на порты влияет. У 103 и 128 ОЗУ находится по разным адресам. Поэтому, если вы заливаете слинкованную под 128 программу в кристалл с активным фузом совместимости с 103, стек оказывается за пределами ОЗУ. И ваша программа работает до тех пор, пока ей не понадобится стек - для сохранения адреса возврата из функции/прерывания или для какой-либо временной/локалной переменной
Dmitriyspb
Цитата(Сергей Борщ @ Aug 9 2015, 09:39) *
Вы фуз совместимости с M103 выключили? Он не только на порты влияет. У 103 и 128 ОЗУ находится по разным адресам. Поэтому, если вы заливаете слинкованную под 128 программу в кристалл с активным фузом совместимости с 103, стек оказывается за пределами ОЗУ. И ваша программа работает до тех пор, пока ей не понадобится стек - для сохранения адреса возврата из функции/прерывания или для какой-либо временной/локалной переменной


Я выключу.
Моя программка заработала. Т.е. процессор бегает по всем описанным мной функциям. И это прекрасно biggrin.gif
Теперья пытаюсь настроить I2C (TWI) и пока ничего не выходит. Возможно это как-то связано с этим фьюзом. Отключу...напишу
Спасибо, большое!!!!
Dmitriyspb
Прошу помочь мне выбрать фьюзы для внешнего кварца 4 МГц
Вот те фьюзы, которые сейчас установлены:
Нажмите для просмотра прикрепленного файла

А вот список "SUT_CKSEL":
Нажмите для просмотра прикрепленного файла

Из увиденного мне нужно EXT XTAL вот только не ясно какой из увиденных нужен. Подскажите..
Jury093
Цитата(Dmitriyspb @ Aug 10 2015, 11:57) *
Прошу помочь мне выбрать фьюзы для внешнего кварца 4 МГц

а вы не пробовали полистать документацию на чип, допустим в разделе "System Clock and Clock Options" параграф "Clock sources"?
Dmitriyspb
Цитата(Jury093 @ Aug 10 2015, 13:54) *
а вы не пробовали полистать документацию на чип, допустим в разделе "System Clock and Clock Options" параграф "Clock sources"?

В общем-то сложность в том, что atmel studio предлагает гиганский список, а не код из Datasheet. Вот я и запутался

А вы документацию читали, допустим в разделе "System Clock and Clock Options" параграф "Clock sources"? biggrin.gif
AlanDrakes
А что там читать?
Страница 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.
Все биты я выбрал за Вас.
Дальше - пробуете писать код.
Dmitriyspb
Цитата(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.
Все биты я выбрал за Вас.
Дальше - пробуете писать код.


Мир не без добрых людей. Как же вы умны и сообразительны. Великолепно. Я в восторге.
Спасибо Вам большое.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.