...не совсем, что бы путаешь.(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено O.L. 25 сентября 2003 г. 13:38
В ответ на: Люди, кто работал с cygnal-ом, в частности O.L. ,подскажите если в курсе, в даташит написано, что таймер1 можно использовать как для USART, так и для SMBus, что б задать нужную скорость (+) отправлено Vlad77 25 сентября 2003 г. 10:40

Все так и будет, если ты не перепишешь TH1 или TH0. Но нужна ли тебе такая низкая скорость? Я делаю примерно так:
//----------------------------------------------------
// задали желаемую скорость
#define SMB_FREQUENCY 100000 // Target SCL clock rate
#define BAUDRATE 9600 // Baud rate of UART in bps

// для SMBus
void Timer1_reInit (void)
{
TR1 = 0; // Timer1 disabled
CKCON &= ~0x13; // Timer1 clock source = SYSCLK / 12
TMOD = 0x20; // Timer1 in 8-bit auto-reload mode

TH1 = -(SYSCLK/SMB_FREQUENCY/12/3); // Timer1 configured to overflow at 1/3
// the rate defined by SMB_FREQUENCY

TL1 = TH1; // Init Timer1

TR1 = 1; // Timer1 enabled
}
// для UART
void UART_Init (void)
{
TR1 = 0; // STOP Timer1
TMOD = 0;

SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON |= 0x01; // T1M = 0; SCA1:0 = 01
CKCON &= ~0x12;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON |= 0x02; // T1M = 0; SCA1:0 = 10
CKCON &= ~0x11;
}

TL1 = 0xff; // set Timer1 to overflow immediately
TMOD |= 0x20; // TMOD: timer 1 in 8-bit autoreload
TMOD &= ~0xD0; // mode
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
// ну и вперед.
// Это если один и тот же таймер используется и под UART, и под SMBus поочередно в случае, когда все остальные таймеры заняты
//-------------------------------------------------------------
Мождно использовать и оба таймера одновременно,но есть тонкость. Если исползуешь свои процедуры put (puts) и, соответственно, get (gets), пользуй любые таймеры для SMBus и для UART. А вот ежели пользуешь стандартные процедуры от дядюшки Кейла, то нужно, - либо править стандартную реализацию (а надо ли ?), либо UART-у оставить T1, а под SMBus пользовать T0.
Вот такая петруха :).

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru