реклама на сайте
подробности

 
 
> Atmega8 задержки, помогите новичку
kennykiller
сообщение Dec 19 2011, 06:34
Сообщение #1





Группа: Участник
Сообщений: 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мс). Подскажите в чем ошибка? Или подскажите (с примером кода) как можно по другому решить данную задачу. Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sergey_Aleksandr...
сообщение Dec 19 2011, 07:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Скорее всего неверно задана частота МК в проекте. Это может быть запись вида "#define MAIN_CLK 8000000" в одном из заголовочных файлов, либо в настройках проекта. Что за компилятор используете?
Дело в том, что функции задержки являются циклом, в котором выполняется пустая команда "nop". При расчёте числа итераций цикла, компилятор использует параметры: длительность задержки (то что вы задавали в качестве аргумента функции _delay_ms()) и тактовая частота.
Ещё неплохо убедиться что сам МК работает на той частоте, которую вы от него хотите получить (проверяем Fuse).
Go to the top of the page
 
+Quote Post
kennykiller
сообщение Dec 19 2011, 08:28
Сообщение #3





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Dec 19 2011, 09:20
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kennykiller   Atmega8 задержки   Dec 19 2011, 06:34
|- - demiurg_spb   Цитата(kennykiller @ Dec 19 2011, 11:28) ...   Dec 19 2011, 10:33
- - mempfis_   Цитата(kennykiller @ Dec 19 2011, 09:34) ...   Dec 19 2011, 08:00
- - haker_fox   QUOTE (kennykiller @ Dec 19 2011, 14:34) ...   Dec 19 2011, 09:36
|- - kennykiller   Цитата(haker_fox @ Dec 19 2011, 13:36) Та...   Dec 19 2011, 09:46
|- - MaxiMuz   Цитата(kennykiller @ Dec 19 2011, 12:46) ...   Dec 19 2011, 10:01
- - TriD   Значение F_CPU лучше всего указать в свойствах про...   Dec 19 2011, 10:20
- - kennykiller   Всем кто помогал, огромнейшее спасибо с аппаратным...   Dec 19 2011, 11:14
- - demiurg_spb   Цитата(kennykiller @ Dec 19 2011, 14:14) ...   Dec 19 2011, 11:18
|- - kennykiller   Цитата(demiurg_spb @ Dec 19 2011, 15:18) ...   Dec 19 2011, 12:01
|- - demiurg_spb   Студия использует тот же тулчейн (avr-gcc) что и W...   Dec 19 2011, 12:07
|- - kennykiller   Цитата(demiurg_spb @ Dec 19 2011, 16:07) ...   Dec 19 2011, 12:10
|- - demiurg_spb   Цитата(kennykiller @ Dec 19 2011, 15:10) ...   Dec 19 2011, 12:16
|- - kennykiller   Цитата(demiurg_spb @ Dec 19 2011, 16:16) ...   Dec 19 2011, 12:30
|- - demiurg_spb   Цитата(kennykiller @ Dec 19 2011, 15:30) ...   Dec 20 2011, 04:52
- - MaxiMuz   Цитата(kennykiller @ Dec 19 2011, 14:14) ...   Dec 19 2011, 12:15


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 03:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01365 секунд с 7
ELECTRONIX ©2004-2016