|
Программные задержки, для 1-Ware |
|
|
|
Feb 11 2007, 02:27
|
Участник

Группа: Участник
Сообщений: 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Мгц достиг примерно нужного значения . Суть в том, что это ИМХО полный абсурд  . Ибо я считал что временные интервалы с уменьшением частоты должны УВЕЛИЧИВАТЬСЯ, а не УМЕНЬШАТЬСЯ. Что скажете товарищи ? Как же определить зависимость задержек от частоты? Жду ваших комментариев. Заранее спасибо P.S. Принимаю любую обоснованную критику в свой адрес т.к. еще новичек в этом деле.
|
|
|
|
|
Feb 11 2007, 12:35
|
Участник

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

|
Цитата(prottoss @ Feb 11 2007, 03:48)  Цитата(GIGAWAT @ Feb 11 2007, 06:27)  #define F_CPU 1000000UL А эту строчку Вы поправили на 8 Мгц? Да. Я начал с частоты 8 Мгц. Подправлял значение и в исходнике и в мэйк файле. Но почемуто при уменьшении частоты задержки тоже начали уменьшаться. Даже незнаю, что я мог упустить ? Вот из этого окна производились настроки частоты:
|
|
|
|
|
Feb 11 2007, 13:41
|
Участник

Группа: Участник
Сообщений: 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 } }
|
|
|
|
|
Feb 11 2007, 15:42
|
Участник

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

|
Видимо мне не удастся запрограмировать фьюзы через бутлоадер по RS232. Кстити вот описание на плату: DataSheetА вот разводка: СХЕМАХотя меня смущает строка кода: CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz Как я понимаю это установленная частота делится на 8 путем установки бита (но не фьюза). Я фьюзы не трогал, а софт этот записан еще на заводе. Может вы подскажете на каких выводах можно осцилографом померить частоту МК ?
|
|
|
|
|
Feb 11 2007, 15:59
|

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

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

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

|
Благодарю за ответ И еще пару вопросов ,дабы не создавать новый топик. 1) Если в плате у меня стоит батарейка на 3.3В, а в даташите на МК указано что он держит питание до 5В, могу ли я подать внешнее питание 5В ? Это собственно нужно для питания DS1920 у которой нормальное преобразование проходит тока при 4.3В и токе 1мА. 2) Что вы думаете по поводу вот такого девайса: JTAG USB
|
|
|
|
|
Feb 11 2007, 16:48
|
Гуру
     
Группа: Участник
Сообщений: 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 МГц, Вам достаточно закомментировать приведенную Вами строку и перепрошить МК  Да, популярнейшая ошибка новичков - неверно установленные фьюзы. Их много, они разные, значения неочевидные, заводские установки - надо внимательно читать даташит. А если шить чем-то типа ponyprog - еще верный путь запутаться. Я вот, как полагается белому человеку, на иные грабли наступал и по два, и по три раза  Вдобавок, это еще и потенциальные проблемы с avreal, к примеру - думаешь, что осциллятор генерит на 8 MHz, а он от внутреннего RC, и программатор даже связь не устанавливает... Цитата(prottoss @ Feb 11 2007, 15:59)  ИМХО тактовую частоту МК в Вашем случае на прямую не померить. НО, возможно запрограммировать какой нибудь счетчик МК на выход и померить частоту импульсов на выходе счетчика. Ну почему же ? Есть фьюз CKOUT, как раз для этих целей. А вообще да, первое, с чего стоит начинать, это именно с аппаратного контроля тактовой частоты. Хоть через CKO, хоть сделать программный цикл дергания ногой, причем с точно известной растактовкой.
|
|
|
|
|
Feb 11 2007, 16:58
|

Гуру
     
Группа: Свой
Сообщений: 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 вольт). Анодами к источникам, катодами вместе на шину питания девайса. Во вторых, надо проверить схему на предмет повышения напряжения. Возможно, если схема не рассчитанна на такое напряжение питания, каким то компонентам не понравится добавка Цитата(GIGAWAT @ Feb 11 2007, 20:30)  2) Что вы думаете по поводу вот такого девайса: JTAG USB Возможно, если Вы им умеете пользоваться, сэкономит Ваше время при отладке ПО МК Цитата(rx3apf @ Feb 11 2007, 20:48)  Цитата(prottoss @ Feb 11 2007, 15:59)  ИМХО тактовую частоту МК в Вашем случае на прямую не померить. НО, возможно запрограммировать какой нибудь счетчик МК на выход и померить частоту импульсов на выходе счетчика.
Ну почему же ? Есть фьюз CKOUT, как раз для этих целей. А вообще да, первое, с чего стоит начинать, это именно с аппаратного контроля тактовой частоты. Хоть через CKO, хоть сделать программный цикл дергания ногой, причем с точно известной растактовкой. Какой такой CKOUT??? У парня нетути программатора  У него бутлоадер, а через него, на сколько я знаю, фьюзы не запрограммировать...
--------------------
|
|
|
|
|
Feb 11 2007, 17:20
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(prottoss @ Feb 11 2007, 16:58)  Какой такой CKOUT??? У парня нетути программатора  У него бутлоадер, а через него, на сколько я знаю, фьюзы не запрограммировать... Так надо сделать !  Не, ну какая жизнь без программатора ? Понадобится внешний высочастотный кварц - и как ? ByteBlaster уж как минимум надо. Да, кстати, о развязках - у диодов с переходом Шоттки вовсе не 0.1V, а в лучшем случае, при микротоках, этак 200 с лишним mV. При единицах mA - уже 300-400 mV. Так что если нужно минимальное падение на развязке - прямой путь к p-канальным полевикам (какой-нибудь IRFML5203). Дороже и сложнее, но иногда без этого никак...
|
|
|
|
|
Feb 11 2007, 19:10
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(GIGAWAT @ Feb 11 2007, 17:23)  Вот я и думаю прикупить себе JTAG чтоб и программатор и эмулятор докучи, а под USB это чтоб мож было к ноуты подключать например.  Ну, на первый взгляд изделие интересное и не особо дорогое. Но, может быть, все равно для начала стоит сделать простенький byteblaster - делать его недолго, себестоимость смешная (но нужен LPT, если у бука нет LPT - то облом-с). А отладкой через JTAG я, например, никогда не пользовался. По лени и консервативности, да и задачки у меня все такие, что несподручно - все в реальном времени, останов делать нельзя. А когда что-то надо отладить или посмотреть - я просто делаю hex-распечатку того, что нужно, через терминал...
|
|
|
|
|
Feb 11 2007, 22:06
|
Участник

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

|
Ну если Byteblaster от Altera подойдет, то он у меня есть А про JTAG думаю, что это должно быть удобное средство отладки, там ведь отладка прям в системе с точками останова и т.д. и в реалтайме темболее.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|