Сообщение от Archer07
|
У меня AVR BUTTERFLY(mega169) демонстрационная отладочная плата,там кварц,LCD,Джойстик,все встроенное.И нет никакой внешней задающие RC-цепи.Кроме кварца нет ничего!Но я точно знаю,что связь организовать на 9600 бодах возможно.
Оригинальная прошивка на нее имеет возможность измерять температуру,проигрывать мелодии,...и отправлять данные в com-порт.
Подскажите пожалуйста способ организовать связь.
|
внешний кварц там чтобы калибровать внутренний. чтобы часики как можно более точно шли. вот этой хитрой функцией: OSCCAL_calibration
/************************************************** ***************************
*
* 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
Delay(1000); // wait for external crystal to stabilise
while(!calibrate)
{
__disable_interrupt(); // disable global interrupt
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
__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 ‹‹
![Горд собой](images/smilies/icon_dovl.gif)
;
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
}
}
А насчет способа организовать связь - это же элементарно! Читаете даташит. конкретно про модуль USART - там яснее некуда написано все... В сети мильон примеров есть.К тому же в прилагаемом к баттерфляю ПО есть пример (смотрите функцию "USART.C") Какие проблемы?
Проблемы щас с тем что компы без ком-портов уже. USB forever!