|
|
  |
Программные задержки в IAR |
|
|
|
Dec 27 2008, 10:11
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306

|
Пользуюсь Embedded Workbench 4.0 AVR. Для реализации программных задержек использую библиотеку, скачанную здесь delay.h Цитата #include <intrinsics.h> #define f_cpu (1000000) //Частота задающего генератора(ГЦ)
#define delay_us(temp) (__delay_cycles((temp * f_cpu) / 1000000)); #define delay_ms(temp) (__delay_cycles((temp * f_cpu) / 1000)); #define delay_s(temp) (__delay_cycles(temp * f_cpu)); Проблема в том, что задержки получаются точными только с кварцем в 16МГц. С другими кварцами что-попало выходит. В чём может быть проблема???
|
|
|
|
|
Dec 27 2008, 11:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(artemm @ Dec 27 2008, 12:11)  С другими кварцами что-попало выходит. Да и с 16 МГц должно получаться "что попало". Вычисления в приведенных вами формулах происходят, согласно правилам языка С, в размерности int, котрой явно мало даже для f_cpu. Нужно явно заставить компилятор работать с размерностью long long: Код #define F_CPU (1000000LL) И еще - принято макроопределения писать заглавными буквами, чтобы отличать от идентификаторов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 27 2008, 13:20
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306

|
Цитата(Сергей Борщ @ Dec 27 2008, 17:11)  Т.е. ошибка в 12 тактов кварца. Как измеряете? Дергаете ногами? А время на дерганье учитываете? Да, дёргаю ногами, но время ж на дёрганье что при 16мгц что при 1мгц одно и тоже, поэтому им можно пренебречь.
|
|
|
|
|
Dec 27 2008, 13:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(artemm @ Dec 27 2008, 16:20)  Время ж на дёрганье что при 16мгц что при 1мгц одно и тоже, поэтому им можно пренебречь. как пренебречь? если время дёрганья ногой одинаково на 1МГц и на 16Мгц, то код Код PORTA=0xFF; PORTA=0x00; PORTA=0xFF; PORTA=0x00; ...... ..... ... PORTA=0xFF; PORTA=0x00; должен "показывать" одинаковую картину на осциллографе что на 1МГц, что на 16МГц?
|
|
|
|
|
Dec 27 2008, 13:42
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306

|
Цитата PORTF = 0xFF; while(1) { delay_us(100); PORTF =~PORTF; }
|
|
|
|
|
Dec 27 2008, 13:59
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306

|
Цитата(Сергей Борщ @ Dec 27 2008, 17:49)  Так, а теперь покажите листинг. Сколько, по-вашему, занимает инверсия порта и переход на начало цикла? 2 машинных цикла, что в случае с 1 мгц какраз и получается примерно на 12 мкс больше Всем спасибо, дошло
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|