|
Atmega8 задержки, помогите новичку |
|
|
|
Dec 19 2011, 06:34
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Я совсем новичок в программировании контролеров. Прошу помощи у знающих людей. Нужно сформировать последовательность импульсов длительностью 1мс с периодом 20мс для управления сервоприводом. Вот программа: CODE #include <avr/io.h> #include <avr/io.h> #include <util/delay.h> int main(void) { DDRC = 0xFF; unsigned char i; while(1) { _delay_ms(1000); for (i=0;i<255;i++) { PORTC = 0b111111; _delay_ms(1); PORTC = 0b000000; _delay_ms(19); } } }
но почему с помощью задержек длительность импульса получается всегда больше?(по данному коду получается 5мс, даже если поставить ее 1мкс получаем 2мс). Подскажите в чем ошибка? Или подскажите (с примером кода) как можно по другому решить данную задачу. Спасибо
|
|
|
|
|
Dec 19 2011, 08:28
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Цитата(Sergey_Aleksandrovi4 @ Dec 19 2011, 11:47)  Скорее всего неверно задана частота МК в проекте. Это может быть запись вида "#define MAIN_CLK 8000000" в одном из заголовочных файлов, либо в настройках проекта. Что за компилятор используете? Дело в том, что функции задержки являются циклом, в котором выполняется пустая команда "nop". При расчёте числа итераций цикла, компилятор использует параметры: длительность задержки (то что вы задавали в качестве аргумента функции _delay_ms()) и тактовая частота. Ещё неплохо убедиться что сам МК работает на той частоте, которую вы от него хотите получить (проверяем Fuse). компилирую с помощью AVR Studio 5.0. При компиляции ошибок не выдает но есть два предупреждения: Warning 1 #warning "F_CPU not defined for <util/delay.h>" Warning 2 #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" как раз в <util/delay.h> написано что Compiler optimizations должен быть включен иначе задержки будут дольше, как его включить? и почему пишет первое предупреждение если в присутствует строка # define F_CPU 1000000UL или я что то не так понимаю разъясните пожалуйста? Цитата(mempfis_ @ Dec 19 2011, 12:00)  Почитайте внимательней об одном из режимов PWM TC1. Возможно для этого Вам подойдёт Phase Correct PWM Mode. И проверте чтобы Ваш процессор работал на заявленной частоте (fuse-биты, калибровочный байт если тактируете от внутренней RC-цепочки) если не трудно киньте ссылку где рассказывается о данном режиме для Atmega8
|
|
|
|
|
Dec 19 2011, 09:20
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764

|
Цитата(kennykiller @ Dec 19 2011, 12:28)  если в присутствует строка # define F_CPU 1000000UL А где конкретно она присутствует? В файле <util/delay.h> или в файле "main.c"? На мой взгляд, универсальнее завести файл типа "GlobalParams.h" или "GlobalDefs.h", в котором задавать глобальные параметры проекта, в т.ч. F_CPU. И потом этот заголовочный файл подключать ко всем файлам проекта. Прочитать про режимы таймеров-счётчиков (Phase Correct PWM Mode) можно в DataSheet, который качается с официального сайта Atmel.
|
|
|
|
|
Dec 19 2011, 09:36
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (kennykiller @ Dec 19 2011, 14:34)  Спасибо Так это, модуль ШИМ (аппаратный) не подойдет? Это же издевательство над микроконтроллером - заставлять его программно генерировать такие малые интервалы сигналов. Аппаратные модули (в данном случае таймеры) значительно облегчают жизнь. QUOTE (kennykiller @ Dec 19 2011, 16:28)  если не трудно киньте ссылку где рассказывается о данном режиме для Atmega8 Вся информация о микроконтроллере находится в официальной документации (англ. datasheet). Искать ее необходимо на сайте производителя - www.atmel.com
--------------------
Выбор.
|
|
|
|
|
Dec 19 2011, 09:46
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Цитата(haker_fox @ Dec 19 2011, 13:36)  Так это, модуль ШИМ (аппаратный) не подойдет? Это же издевательство над микроконтроллером - заставлять его программно генерировать такие малые интервалы сигналов. Аппаратные модули (в данном случае таймеры) значительно облегчают жизнь.
Вся информация о микроконтроллере находится в официальной документации (англ. datasheet). Искать ее необходимо на сайте производителя - www.atmel.com Спасибо всем огромное за помошь. Datasheet есть но сам я разобраться с ним не в силах. Буду благодарен если кто-то сможет написать хотябы кусок программы в котором реализуется аппаратный ШИМ нужной длительности и частоты на любом выходе (длительность 1мс частота 20мс).
|
|
|
|
|
Dec 19 2011, 10:33
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(kennykiller @ Dec 19 2011, 11:28)  компилирую с помощью AVR Studio 5.0. При компиляции ошибок не выдает но есть два предупреждения: Warning 1 #warning "F_CPU not defined for <util/delay.h>" Warning 2 #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
как раз в <util/delay.h> написано что Compiler optimizations должен быть включен иначе задержки будут дольше, как его включить? В мейк-файле либо через опции AVR Studio при условии не true gnu make-managed project. Цитата и почему пишет первое предупреждение если в присутствует строка # define F_CPU 1000000UL или я что то не так понимаю разъясните пожалуйста? Это тоже обычно через makefile передаётся. Ну а вообще такую задачу логичнее решать с использованием аппаратного таймера и ШИМ.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 19 2011, 11:14
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Всем кто помогал, огромнейшее спасибо с аппаратным ШИМ получилось таки разобраться. Единственное что не понял это как правильно задать частоту процессора. По идее он должен быть 1МГц. Длительность импульса и период я подогнал подбором с помощью делителя, получилось 1мс а период 32мс (нужно 20мс), но серва впринципе работает нормально и при такой частоте. Еще рас спасибо всем за оперативную помощь =)) Цитата(MaxiMuz @ Dec 19 2011, 14:01)  Укажите на какой частоте работает ваш МК, параметры режима расчитываются изходя из Fclk. Fclk Это и есть частота процессора в ГЦ? если я правильно понял то она задается командой #define F_CPU 1000000UL только я использовал не Phase Correct PWM, а Fast PWM с делителем 64.
Сообщение отредактировал kennykiller - Dec 19 2011, 11:18
|
|
|
|
|
Dec 19 2011, 12:01
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Цитата(demiurg_spb @ Dec 19 2011, 15:18)  Повторюсь ещё раз. Обычно она не задаётся через дефайн напрямую, а спускается из makefile. Точно также как и тип MCU. makefile я знаю есть в WINavr а где он находится если я компилирую через AVRstudio? (язык C)
|
|
|
|
|
Dec 19 2011, 12:10
|
Группа: Участник
Сообщений: 10
Регистрация: 9-02-11
Пользователь №: 62 817

|
Цитата(demiurg_spb @ Dec 19 2011, 16:07)  Студия использует тот же тулчейн (avr-gcc) что и WinAVR и сборка проектов осуществляется утилитой make. Поэтому между ними нет никакой разницы в этом смысле. Единственное отличие заключаться в том, что студия может править makefile сама посредством меню с настройками проекта и т.п. как в AVRstudio мне из makefila задать правильно частоту процессора напиши пожалуйста подробнее
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|