Mez (01.03.2008 15:02, просмотров: 94) ответил mse на И этта...питание, небось, не 3В, значит ОСЦКАЛ подгонять под питалово надо...Кароче - начять и кончить. ;О) А за переключение 19200-9600 машштабированием сустем цлоцка - зачОт!!!
Попробовал, действительно не успевает. Ты прав. Заккоментировал все настройки в программе. Пусть фуз делит на 8. Получилась устойчивая связь на 4800 при UBRR=30, а в datasheet при UBRR=25 должно быть 2400. Удвоение у меня не установлено. Всё-таки не совпадает. Про подгон RC osc я думал, но по datasheet 7,3-8,1 MГц. Это значит, что если Fosc меньше, то и UBRR должно быть меньше, а у меня наоборот.
На этой плате (Crumb168) стоит керам.резонатор 20 МГц. Но при переключении на него частота не возрастает, а уменьшается. Тоже не знаю почему.
А вот последний листинг.
#include <inavr.h>
#include "iom168.h"
void sendchar(char data)
{
int i = 0;
UDR0 = data;
if(SREG & 0x80)
{
while ( !(UCSR0A&0x40) && (i<10000) )
{
i++;
}
}
else
while( !(UCSR0A&0x40) );
UCSR0A=UCSR0A|0x40; //delete TXCflag
}
int main( void )
{
DDRB=00;
PORTB=0xFF;
DDRC=00;
PORTC=0xFF;
DDRD=00;
PORTD=0xFF;
// boost IntRC to 2Mhz to achieve 19200 baudrate
// CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable
// set prescaler = 4, Inter RC 8Mhz / 4 = 2Mhz
// CLKPR = (1<<CLKPS1);
// set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
// CLKPR = (1<<CLKPS1)|(1<<CLKPS0);
UBRR0H = 0;
UBRR0L = 30;
// Enable 2x speed
//UCSR0A = (1<<U2X0);
// Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
// Async. mode, 8N1
UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
//TWI по умолчанию запрещён бит TWIEN=0 in TWCR
__enable_interrupt();
while(1)
{
sendchar('A');
}
//return 0;
}