А что, в МК код выполняется как то по особому? [Си]

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

На Си я программирую не долго, около двух лет, но все же, не на столько глуп, чтобы не правильно понять такую программу:

Код: Выделить всё

/*
* ledblinking.c
*
* Created: 3/30/2011 9:36:30 AM
*  Author: sfg
*/
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRB=0xFF; //all pins of PORTB declared as output
	PORTB=0x00;
	while(1)
	{
		//TODO:: Please write your application code
		PORTB=0xFF;  //High State
		_delay_ms(2000); //delay
		PORTB=0x00; //low state
		_delay_ms(2000); //delay
	}
}
Собственно, вроде все ясно. Устанавливаем порт Б как порт вывода. Зануляем. В БЕСКОНЕЧНОМ цикле мигаем светодиодом, подымая и опуская напряжение.

Скомпилировал для (ATmega32A), залил (Только flash, да?), на отладочной плате помигало две лампочки из порта Б и потухло. Все.

Ну, где я накосячил? :))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Искать между залил (включая) и на отладочной плате.
Docendo discimus
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

pyzhman писал(а):Искать между залил (включая) и на отладочной плате.
Чего то я не понимаю. Пробовал залить флеш, eeprom, elf. Все точно так же, помигает и перестанет.
Скрин прикрепил.
Вложения
Безымянный.jpg
(96.25 КБ) 415 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

А что за Failed там бултыхается внизу?
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

pyzhman писал(а):А что за Failed там бултыхается внизу?
Хм, хз. Вот попробовал прошить только флеш:

Код: Выделить всё

Getting isp parameter.. SD=0x06 .. OKOK
Reading FLASH input file.. OK
Setting mode and device parameters.. OK!
Entering programming mode.. OK!
Erasing device.. OK!
Programming FLASH ..      OK!
Reading FLASH ..      OK!
FLASH contents is equal to file.. OK
Leaving programming mode.. OK!
А вот эльф:

Код: Выделить всё


Getting isp parameter.. SD=0x06 .. OK
Validating ELF input file.. OK!
Reading FLASH input..OK!
No EEPROM contents in ELF file.
No FUSE contents in ELF file.
No LOCKBITS contents in ELF file.
No SIGNATURE contents in ELF file.
Setting mode and device parameters.. OK!
Entering programming mode.. OK!
Erasing device.. OK!
Programming FLASH ..      OK!
Reading FLASH ..      OK!
FLASH contents is equal to file.. OK
Leaving programming mode.. OK!
Вроде нет ни каких фейлов...
Реклама
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

Кот Серко писал(а):Ну, где я накосячил? :))
Прверяем фьюзы:
- не включен ли режим bootloader'а при его отсутствии?
- проверяем настройку генератора: а припаян-ли кварц и выставлен ли фьюзами на нужную частоту? Или выставлены ли фьюзы на RC-генератор?

Далее: _delay_ms(2000); //delay - а сколько тактов этот цикл выполняется?
Обычно, в проекте есть #define с тактовой частотой - от неё и вычисляется сколько тактов надо ждать, чтобы прошло время Ы.
Если F_CPU не определено - компилятор мало того, что возьмёт её равно 1 МГц, так ещё и warning должен выбросить...
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

mas123 писал(а):
Кот Серко писал(а):Ну, где я накосячил? :))
Прверяем фьюзы:
- не включен ли режим bootloader'а при его отсутствии?
Я слышал с ними легко сломать МК, по этому, трогать не стал, сфоткал как есть, первый файл в прикреплении.
mas123 писал(а): - проверяем настройку генератора: а припаян-ли кварц и выставлен ли фьюзами на нужную частоту? Или выставлены ли фьюзы на RC-генератор?
Кварц есть внешний, на программаторе. Маркировка "4,000", видимо 4 мегагерца.
mas123 писал(а): Далее: _delay_ms(2000); //delay - а сколько тактов этот цикл выполняется?
Обычно, в проекте есть #define с тактовой частотой - от неё и вычисляется сколько тактов надо ждать, чтобы прошло время Ы.
Если F_CPU не определено - компилятор мало того, что возьмёт её равно 1 МГц, так ещё и warning должен выбросить...
Нет, дефайна нет и нет ни каких ворнингов. Странно...
Вложения
Безымянный.jpg
(88.99 КБ) 360 скачиваний
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

Кот Серко писал(а):Я слышал с ними легко сломать МК, по этому, трогать не стал, сфоткал как есть, первый файл в прикреплении.
Шикарно. Это что получается: "я не знаю как настроен камень, но я считаю, что компилятор С работает неправильно". :))
Мой совет - отложи компилятор в сторону, открой даташит на камень и изучи.

Легко сломать можно и компутер, а от электричества вообще можно удар током получить - тебя же это не останавливает? :)
Кот Серко писал(а):Кварц есть внешний, на программаторе. Маркировка "4,000", видимо 4 мегагерца.
ВИДИМО? :shock:
Т.е. ты даже не знаешь как включен контроллер и какие номиналы элементов?

Контроллер плевал на твой кварц - фьюзы чётко говорят: RC-генератор, 1 МГц. И проверь-ка фьюзы BOOTRST и BOOTSZx
Кот Серко писал(а):Нет, дефайна нет и нет ни каких ворнингов. Странно...
Вот же кусок кода:

Код: Выделить всё

#ifndef F_CPU
/* prevent compiler error by supplying a default */
# warning "F_CPU not defined for <util/delay.h>"
# define F_CPU 1000000UL
#endif
Если варнинг не вылетает - то какое значение у F_CPU?

ЗЫ: а неужели даже не возник вопрос - как работает функция delay_ms(), ежели у контроллера может быть частота генератора от 1 до 16 МГц?
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

А у Атмеги 32 по уполчанию на каком порту ДЖИТАГ весит? Нашел, на Д.

И настроена на на РС цепочку внутреннюю на 1 МГц. Внешний кварц не использует.

Исходя из Ворнинга, надо просто найти и подключить библиотеку с Делаями. )))

:))) Ответили уже...

А мигали они видимо, когда программирование шло... ))))
Последний раз редактировалось СКАЗОЧНИК Пн окт 13, 2014 20:07:18, всего редактировалось 1 раз.
Станислав
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

СКАЗОЧНИК писал(а):А у Атмеги 32 по уполчанию на каком порту ДЖИТАГ весит?
PORT C, PC2...PC5
СКАЗОЧНИК писал(а):Исходя из Ворнинга, надо просто найти и подключить библиотеку с Делаями. )))
Варнинга якобы нет, хотя должен быть. А сама либа подключена в #include.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

mas123 писал(а):PORT C, PC2...PC5
Блин, я лошара. :))) А на Д - Юарт?

Тьфу, бля. Пошел я спать...
Станислав
Встал на лапы
Аватара пользователя
Сообщения: 112
Зарегистрирован: Сб янв 05, 2013 07:03:09
Откуда: в #опе изумруды?

Сообщение mail_robot »

альтернативные функции порта B надо смотреть и в каких случаях они активируются по умолчанию. Почти все они работают в режиме оверрайд в приоритете над регистром данных порта.
Мануал атмеловский конеш просто шедеврален..... :facepalm:
Нужно делать то, что нужно. А то что не нужно, делать не нужно (с) Винни Пух
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Про фьюзы я уже писал специально для таких случаев.

Чтобы использовать _delay_ms(), надо, как уже говорили, корректно задать макрос F_CPU - его значение должно соответствовать реальной рабочей частоте МК в Герцах. Обычно это делается в настройках IDE, а не прямо дефайном в коде, а IDE уже подставляет его как параметр в командную строку компилятора.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

Спасибо за ссылки, почитал на неделе, но разобраться так и не смог. У меня в программаторе ко всем портам подтянуты светодиоды, чтобы они отображали логический 0/1. Следующая программа должна активировать все ножки порта "Б":

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRB=0xFF; //all pins of PORTB declared as output
	PORTB=0x00;
	while(1)
	{
		//TODO:: Please write your application code
		PORTB=0xFF;  //High State
		_delay_ms(200); //delay
		PORTB=0x00; //low state
		_delay_ms(200); //delay
	}
}
Частота - 1 МГц, atmega32, в настройках все это проставил. Кварц внутренний. Фьюзы - OCDEN, SPIEN. BOOTSZ 2048 at $3800 (может не по тому адресу прошивает?). Подскажите, в чем проблема? Ну ни как не выходит прошить, все правильно вроде же...
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Светодиоды, надеюсь, через резисторы?
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

Кот Серко писал(а):BOOTSZ 2048 at $3800 (может не по тому адресу прошивает?)
Вот насчет бута - надо смотреть подробнее.
Толку тебе от BOOTSZ? Ты же не пишешь загрузчик!
Фьюз BOOTRST должен быть в состоянии "незапрограммирован" - т.е. "1" по даташиту (в каком состоянии его выводит программатор - всегда проверяй, вдруг в инверсном).

А по какому адресу прошивает - посмотри в свой HEX файл или в .map.
Более чем уверен, что у тебя собрано как обычная программа - т.е. запуск с адреса 0x0000

А, ну да - и покажи-ка схему своего "устройства".
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

OCDEN еще нафиг нужен? Может он как в десктопных IDE тормозит на первой строке если точки останова не заданы?
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

ks0 писал(а):OCDEN еще нафиг нужен?
Логично. Я бы на месте аффтора выставил бы все фьюзы по дефолтному, из даташита.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб дек 14, 2013 14:09:46

Сообщение Кот Серко »

ks0 писал(а):OCDEN еще нафиг нужен? Может он как в десктопных IDE тормозит на первой строке если точки останова не заданы?
Попробовал выключить, не помогло.
ks0 писал(а):Светодиоды, надеюсь, через резисторы?
Да, на платке они через резисторы подключены. Плату я не паял, брал готовый программатор.
mas123 писал(а):
Кот Серко писал(а):BOOTSZ 2048 at $3800 (может не по тому адресу прошивает?)
Вот насчет бута - надо смотреть подробнее.
Толку тебе от BOOTSZ? Ты же не пишешь загрузчик!
Фьюз BOOTRST должен быть в состоянии "незапрограммирован" - т.е. "1" по даташиту (в каком состоянии его выводит программатор - всегда проверяй, вдруг в инверсном).

А по какому адресу прошивает - посмотри в свой HEX файл или в .map.
Более чем уверен, что у тебя собрано как обычная программа - т.е. запуск с адреса 0x0000

А, ну да - и покажи-ка схему своего "устройства".
Адрес 0, если я все правильно понял. BOOTRST тоже потыкал, все по старому :(
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Че за плата, че за программатор. Откуда питание берется на плате, программатор после прошивки отключен? Китайский usbasp вроде резет постоянно на земле держит.
Ответить

Вернуться в «AVR»