Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATtiny48 - проблемы с тактированием
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Паша_З
Захотел получить на выходе квадратный импульсный сигнал. Сделал бесконечный цикл с двумя одинаковыми паузами и выводом 1 и 0 после каждой из них. Но вместо ровного импульса на выходе получается огромное преобладание по времени либо 0, либо 1 - в зависимости от задержки.
Задержки делал с помощью _delay_ms() и _delay_us().
Не могу разобраться, в чём проблема.
V_N
Код в студию
Паша_З
Код
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
int main() {
  DDRD = 0x0F;
  PORTD = 0x0F;
  while(1) {
    _delay_ms(20);
    PORTD = 0x0;
    _delay_ms(20);
    PORTD = 0x0F;
  }
}

Хотя в свойствах частота тоже проставлена. И тип контроллера, конечно, тоже.
V_N
да вроде все верно а как обстоят дела с Watchdog не вклечен ли?
DpInRock
Выключите вочдог при прошивке. Если он программируется фузами.
Паша_З
Watchdog не включён. Проверял.
nk@
Судя по коду у Вас GCC ?
Оптимизацию в опциях компилятора поставьте -Os
hd44780
Используйте CvAVR.
Насколько я сталкивался с WinAVR, прекрасный компилятор, но функции _delay_xxxx у него чрезвычайно глюкавые ...

Даже один и тот же код, написанный на CvAVRе и работающий абсолютно без проблем, при простой перекомпиляции в WinAVRе (с мин. требуемыми изменениями) начинает дико глючить. При прочих равных условиях (плата, схема, частоты, ...).

Я это так и не поборол sad.gif .
Мне даже приходилось использовать для организации этих задержек таймер. На таймере все чисто работает.

Поэтому WinAvr стараюсь не применять. По факту, я использую его только для ObDev USB - деваться некуда.
Все остальное делаю на CvAvr. Глючки тоже встречаются, но они все вместе взятые не такие мерзопакостные, как _delay в WinAVR.
nk@
Цитата(hd44780 @ Mar 25 2011, 10:41) *
Мне даже приходилось использовать для организации этих задержек таймер. На таймере все чисто работает.

Это самый правильный и точный метод, КМК, если имеется незадействованный таймер.

Цитата(hd44780 @ Mar 25 2011, 10:41) *
Поэтому WinAvr стараюсь не применять. По факту, я использую его только для ObDev USB - деваться некуда.
Все остальное делаю на CvAvr. Глючки тоже встречаются, но они все вместе взятые не такие мерзопакостные, как _delay в WinAVR.


Я использую GCC (WinAVR) уже достаточно давно, имею опыт. И с _delay* нет никаких глюков, скорее проблема в некорректном использовании ;-)
Лично я не встретил еще идеального компилятора sm.gif
_Pasha
Цитата(hd44780 @ Mar 25 2011, 11:41) *
Все остальное делаю на CvAvr. Глючки тоже встречаются, но они все вместе взятые не такие мерзопакостные, как _delay в WinAVR.

cranky.gif мир сошел с ума мир сошел с ума
Stepan_L
_delay_ms(20);
PORTD = 0x0;
_delay_ms(20);
PORTD = 0x0F;



PSSSSSSSSSSSSSSSSSSSSSSSSSSSSS



while(666)
{
_delay_ms(20);
PORTD ^= 0x0f;
}
Сергей Борщ
QUOTE (nk@ @ Mar 25 2011, 11:18) *
И с _delay* нет никаких глюков
Ради истины: есть (был). В версии, которую допиливает и распространяет Атмел был глюк - задержки там формируются в 4 раза короче. Вроде бы в libc он уже устранен, внес ли эти исправления к себе Атмел - не знаю. До сих пор сижу на WinAVR 20100110.
nk@
Цитата(Сергей Борщ @ Mar 25 2011, 12:48) *
Ради истины: есть (был). В версии, которую допиливает и распространяет Атмел был глюк - задержки там формируются в 4 раза короче.

Возможно... Я никогда не пользовал Atmel-овский toolchain, всегда брал WinAVR, как говорится, нативный. Может в какойто версии и был баг, но я его, похоже, перешагнул sm.gif

Теперь по теме. Так как там дела, Паша_3? Не молчи, рассказывай, где грабли лежали sm.gif
demiurg_spb
Цитата(Сергей Борщ @ Mar 25 2011, 13:48) *
Ради истины: есть (был). В версии, которую допиливает и распространяет Атмел был глюк - задержки там формируются в 4 раза короче. Вроде бы в libc он уже устранен, внес ли эти исправления к себе Атмел - не знаю. До сих пор сижу на WinAVR 20100110.

Ради истины в любой версии WinAVR (за последние лет 5) были небольшие трудно понимаемые косячки с задержками. Я об этом около года назад или даже больше писал в гнутой ветке. По моему опыту всё решается использованием delay_cycles из bultin'ов.
А что касается пропаганды CV - это ИМХО зря. CV - недоделок тот ещё. Тут всего два прямых пути: IAR или avr-gcc.
Я на avr-gcc множество проектов реализовал - только приятные впечатления как от процесса так и от результата.
И про компилятор из атмеловкого тулчейна - он работоспособен на все 100!
SysRq
Цитата(demiurg_spb @ Mar 27 2011, 13:35) *
...небольшие трудно понимаемые косячки с задержками
Старается же GCC по регистрам все константы распихать, а потом уже алгоритм крутить. Вроде бы, перестановки кода при оптимизации и дают такой эффект: задержка произвольно разваливается на загрузку констант и сам цикл.

Цитата(demiurg_spb @ Mar 27 2011, 13:35) *
По моему опыту всё решается использованием delay_cycles из bultin'ов.
Определенно да rolleyes.gif
nk@
Цитата(demiurg_spb @ Mar 27 2011, 12:35) *
Ради истины в любой версии WinAVR (за последние лет 5) были небольшие трудно понимаемые косячки с задержками.

Не могли бы Вы код предоставить в студию, который компилится с "косячком". Мне просто для себя интересно, где могут грабли лежать. Для чистоты эксперимента, укажите какой чип, версию компилятора, и приложите мэйкфайл. Я вот уже лет 5 использую для AVR GCC и, именно на такие грабли, ни разу не наступал smile3046.gif Я не хочу сказать, что у GCC все идеально, но вот в сравнении с некоторыми другими, купленными за деньги, правда под ARM... cranky.gif я GCC сильно зауважал sm.gif
Паша_З
Проверил ещё раз Watchdog: выключен (hfuse = 0xdf).

Код писал в AvrStudio при установленном WinAVR - 20100110 (c avr-gcc).
Прошиваю ATtiny48 через avrdude:

Запись программы:
Код
avrdude -p t48 -c stk200 -e -U flash:w:test.hex

Чтение фьюзов:
Код
avrdude -p t48 -c stk200 -U hfuse:r:"./ high.txt":h -U lfuse:r:"./ low.txt":h
(В результате выполнения этой команды в файле high.txt лежит число 0xdf)

Запись фьюзов (записать в lfuse 0xee - установить в 1 фьюз SKDIV8):
Код
avrdude -p t48 -c stk200 -U lfuse:w:0xee:m

Пробовал уже на 2-х Тинях - результат тот же.

Что не так!??

Прилагаю картинку с осциллографа (сигнал действительно такой - проверено на LED'ах с увеличенной задержкой): Нажмите для просмотра прикрепленного файла

Цитата
while(666)
{
_delay_ms(20);
PORTD ^= 0x0f;
}
А корректно ли считывать с пина PORTD (не PIND)? Ведь PORTD ^= 0x0f эквивалентно PORTD = PORTD ^ 0x0f.

Прилагаю HEX: Нажмите для просмотра прикрепленного файла
Паша_З
Обнаружил, что проблема заключается в периодической перезагрузке контроллера после однократного выполнения цикла.
Почему так происходит, пока не понял. Watchdog выключен фьюзами, плюс всё равно выключаю его программно - не помогает.
smk
Дело в питании. У Вас когда устанавливается 1 на выводах порта ничего не подкорачивает эти выводы или наоборот при нуле не подкорачивают питание? Ресет подтянут через 10к к питанию? Емкости на ресете и питании есть? Аналоговые питание и земля подключены? Чудес не бывает.
nk@
Цитата(smk @ Mar 31 2011, 19:53) *
Дело в питании. У Вас когда устанавливается 1 на выводах порта ничего не подкорачивает эти выводы или наоборот при нуле не подкорачивают питание? Ресет подтянут через 10к к питанию? Емкости на ресете и питании есть? Аналоговые питание и земля подключены? Чудес не бывает.

Поддерживаю. Проблема аппаратная. Я посмотрел ваш .hex дизассемблером - код на 100% без ошибок. Я также покрутил его на симуляторе, все работает. Так что собака точно не в компиляторе зарыта.
demiurg_spb
Цитата(nk@ @ Mar 29 2011, 08:53) *
Не могли бы Вы код предоставить в студию
Поиск рулит. Для затравки: www.avrfreaks.net
1100.1010.1011.1010
Такая же беда с таким же кодом на atttiny25,WinAVR - 20100110. моделирование в протеусе показывает задержку больше в 8 раз.тот же код на атмеге8 - нормально.

Цитата(1100.1010.1011.1010 @ Apr 3 2011, 16:32) *
Такая же беда с таким же кодом на atttiny25,WinAVR - 20100110. моделирование в протеусе показывает задержку больше в 8 раз.тот же код на атмеге8 - нормально.

ПАрдон,разобрался - CKDIV8 Fuse. нужно отключить прескаллер
777777
Цитата(_Pasha @ Mar 25 2011, 13:26) *
cranky.gif мир сошел с ума мир сошел с ума

Это точно. Только не мир а Россия - только здесь любят CvAVR, пишут программы на паскале, архивируют RAR-ом и пользуются Оперой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.