roboforum.ru

Технический форум по робототехнике.

Программные задержки

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Программные задержки

Сообщение GIGAWAT » 11 фев 2007, 02:47

Здраствуйте.
Есть вопрос по программным задержкам.
Для начала, опишу то с че я работаю.
Микроконтроллер mega169V в составе демонстрационной платы
AVR Butterfly. Программно обеспечение взято с сайта SmileyMicros.com и представляет из себя ,оптимизированные под WinAVR(GCC) исходники для IAR, с офф сайта Atmel.
Все это хозяйство я сопрягаю с датчиками DS1920 1-Ware.
Сответственно были взяты исходники для апноута AVR318 под IAR и оптимизированы под WinAvr.

Естественно первым делом я стал проверять мременные задержки.
Написал кусочек кода для формирования импульсов определенной длительности, и проверял на осцилографе, снимая сигнал с одной из ножек порта.
===============================================
#include "dallasbus.h"
#include <avr/io.h>
#include "main.h"
#include <util/delay.h>
#include "LCD_functions.h"
// 1-Ware function main
#define F_CPU 1000000UL

char dallasfunction (char input)
{
   static char enter = 1;
   
   if (enter)
   {
       enter = 0;
cbi(LCDCRA, 7);
DDRD=0xff; //Set port D to output port
//===========================
while (1)
{
PORTD=0xFF;
_delay_us(5);
PORTD=0x00;
_delay_us(10);

}
//============================
}
   else if (input == KEY_MINUS)
   {
       enter = 1;  // Set enter to 1 before leaving the TemperatureFunc
       return ST_1ware;
   }
   else
       return ST_1ware_FUNC;    
}
Как видно из изходника я использовал функцию _delay_us();
Изначально я использовал частоту 8 Мгц.
Импульсы получились не такими как я предполагал. Длительность и период были в разы больше чем я указывал.
Я начал  :!: УМЕНЬШАТЬ частоту и только на !! 1Мгц достиг примерно нужного значения .
Суть в том, что это ИМХО полный абсурд  :shock: . Ибо я считал что временные интервалы с уменьшением частоты должны УВЕЛИЧИВАТЬСЯ, а  не УМЕНЬШАТЬСЯ.
Что скажете товарищи. :?:
Как же определить зависимость задержек от частоты. Жду ваших комментариев  :roll:
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение =DeaD= » 11 фев 2007, 10:10

Очевидно вы меняли не реальную частоту МК, а константу в программе, из которой лишь рассчитывалось количество итераций в цикле _delay_us(), поэтому и зависимость обратная получилась :)

Угадал? 8)
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение GIGAWAT » 11 фев 2007, 13:57

Возможно.
Я указыл параметр частоты и в исходниках и в настройках мэйк файла так что здесь все верно.
Изображение
Я лишь неуверен по аппаратной части.
Изображение
Но судя по вырезке из даташита МК должен тянуть частоту 8Мгц на внутреннем осциляторе. Питание у меня идет 3.3В от батарейки.
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение avr123.nm.ru » 11 фев 2007, 16:32

о установке частоты в мегах написано на стр. avr123.nm.ru/07.htm

ваш опыт дает правильный ответ.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Программные задержки

Сообщение avr123.nm.ru » 11 фев 2007, 16:39

GIGAWAT писал(а):первым делом я стал проверять мременные задержки.


А в чем вы проверяли ?
 
ИМХО удобно в VMLAB  - пример: avr123.nm.ru/z3.htm - измерение временных интервалов в виртуальном осциллографе SCOPE.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Программные задержки

Сообщение GIGAWAT » 11 фев 2007, 16:51

avr123.nm.ru писал(а):
GIGAWAT писал(а):первым делом я стал проверять мременные задержки.


А в чем вы проверяли ?


Проверял я реальным осцилографом.
Кстати, оцените кусок кода (особенно красным цветом):
/*****************************************************************************
*
* Function name : OSCCAL_calibration
*
* Returns : None
*
* Parameters : None
*
* Purpose : Calibrate the internal OSCCAL byte, using the external
* 32,768 kHz crystal as reference
*
*****************************************************************************/
void OSCCAL_calibration(void)
{
unsigned char calibrate = FALSE;
int temp;
unsigned char tempL;

CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable //Может вот сдесь надо поменять
// set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
CLKPR = (1<<CLKPS1) | (1<<CLKPS0);


TIMSK2 = 0; //disable OCIE2A and TOIE2

ASSR = (1<<AS2); //select asynchronous operation of timer2 (32,768kHz)

OCR2A = 200; // set timer2 compare value

TIMSK0 = 0; // delete any interrupt sources

TCCR1B = (1<<CS10); // start timer1 with no prescaling
TCCR2A = (1<<CS20); // start timer2 with no prescaling

while((ASSR & 0x01) | (ASSR & 0x04)); //wait for TCN2UB and TCR2UB to be cleared
#ifdef debug_on
Delay(0);
#else
Delay(1000); // wait for external crystal to stabilise
#endif
while(!calibrate)
{
cli(); // mt __disable_interrupt(); // disable global interrupt
#ifdef debug_on
calibrate = TRUE; // the interRC is correct
#endif
TIFR1 = 0xFF; // delete TIFR1 flags
TIFR2 = 0xFF; // delete TIFR2 flags

TCNT1H = 0; // clear timer1 counter
TCNT1L = 0;
TCNT2 = 0; // clear timer2 counter

while ( !(TIFR2 && (1<<OCF2A)) ); // wait for timer2 compareflag

TCCR1B = 0; // stop timer1

sei(); // __enable_interrupt(); // enable global interrupt

if ( (TIFR1 && (1<<TOV1)) )
{
temp = 0xFFFF; // if timer1 overflows, set the temp to 0xFFFF
}
else
{ // read out the timer1 counter value
tempL = TCNT1L;
temp = TCNT1H;
temp = (temp << 8);
temp += tempL;
}

if (temp > 6250)
{
OSCCAL--; // the internRC oscillator runs to fast, decrease the OSCCAL
}
else if (temp < 6120)
{
OSCCAL++; // the internRC oscillator runs to slow, increase the OSCCAL
}
else
calibrate = TRUE; // the interRC is correct

TCCR1B = (1<<CS10); // start timer1
}
}

Как я понял у меня частота установлена на 8Мгц и установкой бита она делится на 8 т.е. 1Мгц  может быть в этом и суть ?
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение Myp » 11 фев 2007, 17:24

ага
а зачем вобще было ставить делитель?
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение GIGAWAT » 11 фев 2007, 17:31

Код написан не мной, а взят с сайта ATMEL . 8)
Просто я его еще не доканца разобрал, там порядка 100 страниц тока исходников несчитая хидер файлов. :shock:
А в чужом коде, сами знаете, разбираться не так просто  :roll:
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение avr123.nm.ru » 11 фев 2007, 17:37

Слава богу что не на АСМе !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение GIGAWAT » 11 фев 2007, 17:46

avr123.nm.ru писал(а):Слава богу что не на АСМе !

Мне месяца три назад приходилось писать для МК HOLTEK программу на асме , вот там мне пришлось реализовать вычисление корня кубического  :shock: ,и это притом ,что у этих МК есть тока однобайные команды сложения и вычитания  :twisted: .
Врезультате примерно 700 строк кода . Но РАБОТАЕТ =) Могу выложить ради прикола 8)
На С я тогда еще не умел писать для МК. Да и примеры мне попадались только для асма, да и МК не особо распространенные 8)
Вообщем ацтой...но мне это ковыряние в асме много чего дало  :wink: .
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение avr123.nm.ru » 11 фев 2007, 17:53

не 4-х битный холтек надеюсь ?

=====
Если на АСМе нужно чтото ТАКОЕ, то лучше (ИМХО) сделать на Си и посмотреть листинг компилятора на АСМе.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение GIGAWAT » 11 фев 2007, 18:05

avr123.nm.ru писал(а):не 4-х битный холтек надеюсь ?

=====
Если на АСМе нужно чтото ТАКОЕ, то лучше (ИМХО) сделать на Си и посмотреть листинг компилятора на АСМе.


Нет. Это был HT49C50-1 с контоллеров LCD.

Просто я еще тогда с железом вобще никак неладил, а на асме к железу как то поближе себя чувствуешь, вот и сидел грыз примеры на асме для тех же 51 от Atmela и плавненько перерабытывал под свою платформу 8) Зато хорошо научился работать со структурой памяти и всякими там битовыми заморочками. =)
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение =DeaD= » 11 фев 2007, 22:13

GIGAWAT писал(а):Возможно.
Я указыл параметр частоты и в исходниках и в настройках мэйк файла так что здесь все верно.
Изображение
Я лишь неуверен по аппаратной части.
Изображение
Но судя по вырезке из даташита МК должен тянуть частоту 8Мгц на внутреннем осциляторе. Питание у меня идет 3.3В от батарейки.

Тянуть то понятно что должен, только указание частоты в настройках проекта вроде только в константы пишется, а для выставления скорости работы на внутреннем осцилляторе нужно выставлять соответственно даташиту Security & Configuration bits, CKOPT и CKSELx. Делали? (только поаккуратнее с ними - отправить в свободное плавание можно МК с их помощью - проще чем два пальца об асфальт :))
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение GIGAWAT » 11 фев 2007, 22:39

Да уж...я про ужасы юзания фьюзов наслышан.
Мне пока это не страшно ибо программатора у мну нет, и шью я через бутлоадер  :wink:
GIGAWAT
 
Сообщения: 45
Зарегистрирован: 04 фев 2007, 00:53
Откуда: Питер

Сообщение avr123.nm.ru » 11 фев 2007, 23:09

=DeaD= писал(а):
GIGAWAT писал(а):Возможно.
Я указыл параметр частоты и в исходниках и в настройках мэйк файла так что здесь все верно.
Изображение
Я лишь неуверен по аппаратной части.
Изображение
Но судя по вырезке из даташита МК должен тянуть частоту 8Мгц на внутреннем осциляторе. Питание у меня идет 3.3В от батарейки.

Тянуть то понятно что должен


а мне кажется что 8 не должен.  наверно 1 должен как и практика показала.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25