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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Программные задержки, для 1-Ware
GIGAWAT
сообщение Feb 11 2007, 02:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



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

Естественно первым делом я стал проверять мременные задержки.
Написал кусочек кода для формирования импульсов определенной длительности, и проверял на осцилографе, снимая сигнал с одной из ножек порта.
===============================================
#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;
}
===================================================
Это лиш один из программных модулей, здесь главное это бесконечный цикл while().
Как видно из изходника я использовал функцию _delay_us();
Изначально я использовал частоту 8 Мгц.
Импульсы получились не такими как я предполагал. Длительность и период были в разы больше чем я указывал.
Я начал УМЕНЬШАТЬ частоту и только на !! 1Мгц достиг примерно нужного значения .
Суть в том, что это ИМХО полный абсурд blink.gif. Ибо я считал что временные интервалы с уменьшением частоты должны УВЕЛИЧИВАТЬСЯ, а не УМЕНЬШАТЬСЯ.
Что скажете товарищи ?
Как же определить зависимость задержек от частоты? Жду ваших комментариев. Заранее спасибо smile.gif
P.S. Принимаю любую обоснованную критику в свой адрес т.к. еще новичек в этом деле.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2007, 03:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(GIGAWAT @ Feb 11 2007, 06:27) *
#define F_CPU 1000000UL
А эту строчку Вы поправили на 8 Мгц?


--------------------
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 12:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Цитата(prottoss @ Feb 11 2007, 03:48) *
Цитата(GIGAWAT @ Feb 11 2007, 06:27) *
#define F_CPU 1000000UL
А эту строчку Вы поправили на 8 Мгц?

Да. Я начал с частоты 8 Мгц. Подправлял значение и в исходнике и в мэйк файле. Но почемуто при уменьшении частоты задержки тоже начали уменьшаться. Даже незнаю, что я мог упустить ? cranky.gif
Вот из этого окна производились настроки частоты:
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2007, 12:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



А фьюзы в МК на внешний кварц поправили?


--------------------
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 13:41
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Цитата(prottoss @ Feb 11 2007, 12:46) *
А фьюзы в МК на внешний кварц поправили?

Вот здесь я пока я еще несилен, про фьюзы читал но как конкретно настраивать пока непонял.
Вот блок исходника который связан с внешним кварцем на 32КГц.

/*****************************************************************************
*
* 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
}
}
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2007, 14:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(GIGAWAT @ Feb 11 2007, 17:41) *
Цитата(prottoss @ Feb 11 2007, 12:46) *

А фьюзы в МК на внешний кварц поправили?

Вот здесь я пока я еще несилен...


Фьюзы программируются не во время выполнения программы, а на этапе программирования МК. Изначально, новый МК (с завода), имеет запрограммированные фьзы на частоту 1 МГц от встроенного RC-генератора. Вернее частота внутреннего генератора установлена на 8 МГц плюс запрограммированн фьз-бит SKDIV8. Почитайте внимательно раздел System Clock and Clock Options даташита на МК. Что то конкретное рекомендовать не буду, потому как не вижу вашу плату и всех ньюансов.


--------------------
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 15:42
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Видимо мне не удастся запрограмировать фьюзы через бутлоадер по RS232. wacko.gif
Кстити вот описание на плату:
DataSheet

А вот разводка:
СХЕМА

Хотя меня смущает строка кода:
CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
// set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
Как я понимаю это установленная частота делится на 8 путем установки бита (но не фьюза).
Я фьюзы не трогал, а софт этот записан еще на заводе.
Может вы подскажете на каких выводах можно осцилографом померить частоту МК ? blush.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2007, 15:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(GIGAWAT @ Feb 11 2007, 19:42) *
Видимо мне не удастся запрограмировать фьюзы через бутлоадер по RS232. wacko.gif
Видимо, нет...

Цитата(GIGAWAT @ Feb 11 2007, 19:42) *
Хотя меня смущает строка кода:
CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
// set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
Как я понимаю это установленная частота делится на 8 путем установки бита (но не фьюза).
Я фьюзы не трогал, а софт этот записан еще на заводе.
Может вы подскажете на каких выводах можно осцилографом померить частоту МК ? blush.gif
Да, скорее всего, в МК установлен внутренний RC-генератор, но не запрограммирован бит CKDIV8. А частота понижается до 1 МГц с помощью внутреннего прескалера. О нем можно почитать на стр.30 указанного Вами даташита Clock Prescale Register - CLKPR. Разрешение прескалера как раз с помощью бита CLKPCE. Чтобы МК заработал на 8 МГц, Вам достаточно закомментировать приведенную Вами строку и перепрошить МК smile.gif

ИМХО тактовую частоту МК в Вашем случае на прямую не померить. НО, возможно запрограммировать какой нибудь счетчик МК на выход и померить частоту импульсов на выходе счетчика.


--------------------
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 16:30
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Благодарю за ответ wink.gif
И еще пару вопросов ,дабы не создавать новый топик.
1) Если в плате у меня стоит батарейка на 3.3В, а в даташите на МК указано что он держит питание до 5В, могу ли я подать внешнее питание 5В ?
Это собственно нужно для питания DS1920 у которой нормальное преобразование проходит тока при 4.3В и токе 1мА.
2) Что вы думаете по поводу вот такого девайса:JTAG USB
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Feb 11 2007, 16:48
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(prottoss @ Feb 11 2007, 15:59) *
Да, скорее всего, в МК установлен внутренний RC-генератор, но не запрограммирован бит CKDIV8. А частота понижается до 1 МГц с помощью внутреннего прескалера. О нем можно почитать на стр.30 указанного Вами даташита Clock Prescale Register - CLKPR. Разрешение прескалера как раз с помощью бита CLKPCE. Чтобы МК заработал на 8 МГц, Вам достаточно закомментировать приведенную Вами строку и перепрошить МК smile.gif

Да, популярнейшая ошибка новичков - неверно установленные фьюзы. Их много, они разные, значения неочевидные, заводские установки - надо внимательно читать даташит. А если шить чем-то типа ponyprog - еще верный путь запутаться. Я вот, как полагается белому человеку, на иные грабли наступал и по два, и по три раза wink.gif
Вдобавок, это еще и потенциальные проблемы с avreal, к примеру - думаешь, что осциллятор генерит на 8 MHz, а он от внутреннего RC, и программатор даже связь не устанавливает...
Цитата(prottoss @ Feb 11 2007, 15:59) *
ИМХО тактовую частоту МК в Вашем случае на прямую не померить. НО, возможно запрограммировать какой нибудь счетчик МК на выход и померить частоту импульсов на выходе счетчика.

Ну почему же ? Есть фьюз CKOUT, как раз для этих целей. А вообще да, первое, с чего стоит начинать, это именно с аппаратного контроля тактовой частоты. Хоть через CKO, хоть сделать программный цикл дергания ногой, причем с точно известной растактовкой.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2007, 16:58
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(GIGAWAT @ Feb 11 2007, 20:30) *
1) Если в плате у меня стоит батарейка на 3.3В, а в даташите на МК указано что он держит питание до 5В, могу ли я подать внешнее питание 5В?
Это собственно нужно для питания DS1920 у которой нормальное преобразование проходит тока при 4.3В и токе 1мА.
В принципе можно. Но, во первых, если Вы собираетесь питать схему и от батарейки и от внешнего источника напряжения, думаю, полезно будет развязать оба источника диодами Шоттки (у этих диодов малое падение напряжения - (порядка 0,1 вольт) по сравнению с обычными выпрямительными - 0,6 - 0,7 вольт). Анодами к источникам, катодами вместе на шину питания девайса. Во вторых, надо проверить схему на предмет повышения напряжения. Возможно, если схема не рассчитанна на такое напряжение питания, каким то компонентам не понравится добавка smile.gif

Цитата(GIGAWAT @ Feb 11 2007, 20:30) *
2) Что вы думаете по поводу вот такого девайса:JTAG USB
Возможно, если Вы им умеете пользоваться, сэкономит Ваше время при отладке ПО МК smile.gif



Цитата(rx3apf @ Feb 11 2007, 20:48) *
Цитата(prottoss @ Feb 11 2007, 15:59) *

ИМХО тактовую частоту МК в Вашем случае на прямую не померить. НО, возможно запрограммировать какой нибудь счетчик МК на выход и померить частоту импульсов на выходе счетчика.

Ну почему же ? Есть фьюз CKOUT, как раз для этих целей. А вообще да, первое, с чего стоит начинать, это именно с аппаратного контроля тактовой частоты. Хоть через CKO, хоть сделать программный цикл дергания ногой, причем с точно известной растактовкой.
Какой такой CKOUT??? У парня нетути программатора smile.gif У него бутлоадер, а через него, на сколько я знаю, фьюзы не запрограммировать...


--------------------
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Feb 11 2007, 17:20
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(prottoss @ Feb 11 2007, 16:58) *
Какой такой CKOUT??? У парня нетути программатора smile.gif У него бутлоадер, а через него, на сколько я знаю, фьюзы не запрограммировать...

Так надо сделать ! wink.gif Не, ну какая жизнь без программатора ? Понадобится внешний высочастотный кварц - и как ? ByteBlaster уж как минимум надо.

Да, кстати, о развязках - у диодов с переходом Шоттки вовсе не 0.1V, а в лучшем случае, при микротоках, этак 200 с лишним mV. При единицах mA - уже 300-400 mV. Так что если нужно минимальное падение на развязке - прямой путь к p-канальным полевикам (какой-нибудь IRFML5203). Дороже и сложнее, но иногда без этого никак...
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 17:23
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Вот я и думаю прикупить себе JTAG чтоб и программатор и эмулятор докучи, а под USB это чтоб мож было к ноуты подключать например. smile.gif
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Feb 11 2007, 19:10
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(GIGAWAT @ Feb 11 2007, 17:23) *
Вот я и думаю прикупить себе JTAG чтоб и программатор и эмулятор докучи, а под USB это чтоб мож было к ноуты подключать например. smile.gif

Ну, на первый взгляд изделие интересное и не особо дорогое. Но, может быть, все равно для начала стоит сделать простенький byteblaster - делать его недолго, себестоимость смешная (но нужен LPT, если у бука нет LPT - то облом-с). А отладкой через JTAG я, например, никогда не пользовался. По лени и консервативности, да и задачки у меня все такие, что несподручно - все в реальном времени, останов делать нельзя. А когда что-то надо отладить или посмотреть - я просто делаю hex-распечатку того, что нужно, через терминал...
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 11 2007, 22:06
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Ну если Byteblaster от Altera подойдет, то он у меня есть smile.gif
А про JTAG думаю, что это должно быть удобное средство отладки, там ведь отладка прям в системе с точками останова и т.д. и в реалтайме темболее.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:18
Рейтинг@Mail.ru


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