ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
114320 Топик полностью
Mez (01.03.2008 13:05, просмотров: 80) ответил 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; }