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

 
 
> Программные задержки, для 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
 
Start new topic
Ответов
prottoss
сообщение Feb 11 2007, 12:46
Сообщение #2


Гуру
******

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



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


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


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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, 02:27
- - prottoss   Цитата(GIGAWAT @ Feb 11 2007, 06:27) #def...   Feb 11 2007, 03:48
|- - GIGAWAT   Цитата(prottoss @ Feb 11 2007, 03:48) Цит...   Feb 11 2007, 12:35
- - GIGAWAT   Видимо мне не удастся запрограмировать фьюзы через...   Feb 11 2007, 15:42
|- - prottoss   Цитата(GIGAWAT @ Feb 11 2007, 19:42) Види...   Feb 11 2007, 15:59
|- - rx3apf   Цитата(prottoss @ Feb 11 2007, 15:59) Да,...   Feb 11 2007, 16:48
- - GIGAWAT   Благодарю за ответ И еще пару вопросов ,дабы не...   Feb 11 2007, 16:30
|- - prottoss   Цитата(GIGAWAT @ Feb 11 2007, 20:30) 1) Е...   Feb 11 2007, 16:58
|- - rx3apf   Цитата(prottoss @ Feb 11 2007, 16:58) Как...   Feb 11 2007, 17:20
- - GIGAWAT   Вот я и думаю прикупить себе JTAG чтоб и программа...   Feb 11 2007, 17:23
|- - rx3apf   Цитата(GIGAWAT @ Feb 11 2007, 17:23) Вот ...   Feb 11 2007, 19:10
- - GIGAWAT   Ну если Byteblaster от Altera подойдет, то он у ме...   Feb 11 2007, 22:06
|- - rx3apf   Цитата(GIGAWAT @ Feb 11 2007, 22:06) Ну е...   Feb 11 2007, 22:12
|- - GIGAWAT   ЦитатаТак это если устройство живет само по себе, ...   Feb 11 2007, 22:31
- - konny   Поскольку используешь #include <util/delay.h...   Feb 12 2007, 10:17


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

 


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


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