Mez (01.03.2008 13:05, просмотров: 81) ответил AVR на А я не могу понять, почему ты упорно не отвечаешь на вопрос "покажи фузы". В частности, покажи CKSEL и CKDIV8, а еще покажи весь код инициализации, а не ту разрозненную пургу, которую ты выше намёл
Всё что пожелаете. CLKSEL=0010, CKDIV8 установлен делить на 8 (проверял по осциллографу), SUT пробовал любые. Программа прилагается. Что ещё показать? коэффициент 30 даёт обмен с РС на 9600.
посылка 'A' для просмотра на осциллографе.
#include <inavr.h>
#include "iom168.h"
void USART_Init(unsigned int baudrate)
{
// Set baud rate
UBRR0H = (unsigned char)(baudrate>>8);
UBRR0L = (unsigned char)baudrate;
// 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);
}
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
}
char recchar(void)
{
int i = 0;
if(SREG & 0x80)
{
while (!(UCSR0A & (1<<RXC0)) && (i<10000))
{
i++;
}
}
else
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
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 / 4 = 2Mhz
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;
}