Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega8 задержки
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
kennykiller
Я совсем новичок в программировании контролеров. Прошу помощи у знающих людей. Нужно сформировать последовательность импульсов длительностью 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мс). Подскажите в чем ошибка? Или подскажите (с примером кода) как можно по другому решить данную задачу. Спасибо
Sergey_Aleksandrovi4
Скорее всего неверно задана частота МК в проекте. Это может быть запись вида "#define MAIN_CLK 8000000" в одном из заголовочных файлов, либо в настройках проекта. Что за компилятор используете?
Дело в том, что функции задержки являются циклом, в котором выполняется пустая команда "nop". При расчёте числа итераций цикла, компилятор использует параметры: длительность задержки (то что вы задавали в качестве аргумента функции _delay_ms()) и тактовая частота.
Ещё неплохо убедиться что сам МК работает на той частоте, которую вы от него хотите получить (проверяем Fuse).
mempfis_
Цитата(kennykiller @ Dec 19 2011, 09:34) *
Я совсем новичок в программировании контролеров. Прошу помощи у знающих людей. Нужно сформировать последовательность импульсов длительностью 1мс с периодом 20мс для управления сервоприводом.



Почитайте внимательней об одном из режимов PWM TC1. Возможно для этого Вам подойдёт Phase Correct PWM Mode. И проверте чтобы Ваш процессор работал на заявленной частоте (fuse-биты, калибровочный байт если тактируете от внутренней RC-цепочки)
kennykiller
Цитата(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
Sergey_Aleksandrovi4
Цитата(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.
haker_fox
QUOTE (kennykiller @ Dec 19 2011, 14:34) *
Спасибо

Так это, модуль ШИМ (аппаратный) не подойдет? Это же издевательство над микроконтроллером - заставлять его программно генерировать такие малые интервалы сигналов. Аппаратные модули (в данном случае таймеры) значительно облегчают жизнь.


QUOTE (kennykiller @ Dec 19 2011, 16:28) *
если не трудно киньте ссылку где рассказывается о данном режиме для Atmega8

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



Вся информация о микроконтроллере находится в официальной документации (англ. datasheet). Искать ее необходимо на сайте производителя - www.atmel.com


Спасибо всем огромное за помошь. Datasheet есть но сам я разобраться с ним не в силах. Буду благодарен если кто-то сможет написать хотябы кусок программы в котором реализуется аппаратный ШИМ нужной длительности и частоты на любом выходе (длительность 1мс частота 20мс).
MaxiMuz
Цитата(kennykiller @ Dec 19 2011, 12:46) *
Спасибо всем огромное за помошь. Datasheet есть но сам я разобраться с ним не в силах. Буду благодарен если кто-то сможет написать хотябы кусок программы в котором реализуется аппаратный ШИМ нужной длительности и частоты на любом выходе (длительность 1мс частота 20мс).

Укажите на какой частоте работает ваш МК, параметры режима расчитываются изходя из Fclk.
TriD
Значение F_CPU лучше всего указать в свойствах проекта, тогда эта глобальная переменная будет видна всем. Кроме того, в дебагере приходится дополнительно выставлять используемое значение кварцевого резонатора.
demiurg_spb
Цитата(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 передаётся.

Ну а вообще такую задачу логичнее решать с использованием аппаратного таймера и ШИМ.
kennykiller
Всем кто помогал, огромнейшее спасибо с аппаратным ШИМ получилось таки разобраться. Единственное что не понял это как правильно задать частоту процессора. По идее он должен быть 1МГц. Длительность импульса и период я подогнал подбором с помощью делителя, получилось 1мс а период 32мс (нужно 20мс), но серва впринципе работает нормально и при такой частоте.

Еще рас спасибо всем за оперативную помощь =))

Цитата(MaxiMuz @ Dec 19 2011, 14:01) *
Укажите на какой частоте работает ваш МК, параметры режима расчитываются изходя из Fclk.

Fclk Это и есть частота процессора в ГЦ? если я правильно понял то она задается командой #define F_CPU 1000000UL

только я использовал не Phase Correct PWM, а Fast PWM с делителем 64.
demiurg_spb
Цитата(kennykiller @ Dec 19 2011, 14:14) *
Fclk Это и есть частота процессора в ГЦ? если я правильно понял то она задается командой #define F_CPU 1000000UL
Повторюсь ещё раз. Обычно она не задаётся через дефайн напрямую, а спускается из makefile. Точно также как и тип MCU.
kennykiller
Цитата(demiurg_spb @ Dec 19 2011, 15:18) *
Повторюсь ещё раз. Обычно она не задаётся через дефайн напрямую, а спускается из makefile. Точно также как и тип MCU.

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

как в AVRstudio мне из makefila задать правильно частоту процессора напиши пожалуйста подробнее
MaxiMuz
Цитата(kennykiller @ Dec 19 2011, 14:14) *
Fclk Это и есть частота процессора в ГЦ? если я правильно понял то она задается командой #define F_CPU 1000000UL

только я использовал не Phase Correct PWM, а Fast PWM с делителем 64.

вообщето точнее Clkcpu - это обозначение такт.частоты в документации. И задается она только при прошивке МК спец.фузами CKSEL3..0 и кварцевым резонатором если он задействован.

А режим, в вашем случае, подойдет любой PWM.

а # define F_CPU 1000000UL только сообщает библиотечной фун-ии delay.h сколько грубо говоря тактов пропустить
demiurg_spb
Цитата(kennykiller @ Dec 19 2011, 15:10) *
как в AVRstudio мне из makefila задать правильно частоту процессора напиши пожалуйста подробнее

http://www.avrfreaks.net/index.php?name=PN...836&start=0
Цитата
When using AVRStudio, you do not need to define F_CPU anywhere in code, just set it in "Project/Configuration Options" under "Frequency", together with the correct device.
AVRStudio will make sure F_CPU is passed as command line switch to the compiler for each file.

или тут почитайте
http://www.avrfreaks.net/index.php?name=PN...ic&p=803643

Вообще google поиск рулит.
kennykiller
Цитата(demiurg_spb @ Dec 19 2011, 16:16) *

спасибо еще раз. да гугл несомненно рулит, но много бесполезной и неправильной информации попадается))
demiurg_spb
Цитата(kennykiller @ Dec 19 2011, 15:30) *
но много бесполезной и неправильной информации попадается))
Правильно сформулированный вопрос - половина ответа:-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.