Написал простенькую програмку для OR-AVR-M32-D посылаю в UART 1 или 2, соответственно должен загораться или гаситься LED на PB3. Проверил в VMLAB все отлично работает.
Прошиваю в контроллер нифига не работает. Подключаюсь к UART контроллера получаю на выходе кракозябру из 3 символов вместо "Ok!" В настройках терминала стоит 9600 8-1.
Что-то приходит, но из за частоты видимо не так как надо. Подскажите какую частоту установить в USART_Init (0x33) или как правильно фьюзы прописать.
Вот фьюзы и частота из make файла. Фьюзы взял с http://roboforum.ru/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%B2%D1%8B%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_fuse-%D0%B1%D0%B8%D1%82%D0%BE%D0%B2_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%BE%D0%B2_Open_Robotics
- Код: Выделить всё
DEVICE = atmega32
CLOCK = 7372800
PROGRAMMER = -c USBasp -P avrdoper
OBJECTS = main.o
FUSES = -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m
А вот и сам код.
- Код: Выделить всё
#include <avr/io.h> // Most basic include files
#include <avr/interrupt.h> // Add the necessary ones here
void USART_Transmit( unsigned char data );
void USART_Init( unsigned int baud );
ISR(USART_RXC_vect)
{
int b;
b = UDR;
// Выполняем обработку принятого байта
if(b=='1')//Если приняли "1"
{
PORTB |= (1 << 3);
USART_Transmit('R');//Отправляем букву "R"
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
}
else//Если нет
if(b=='2')//Если приняли "2"
{
PORTB &= ~(1 << 3);
USART_Transmit('L');//Отправляем букву "L"
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
}
}
void USART_Transmit( unsigned char data ) {
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
; /* Put data into buffer, sends the data */
UDR = data;
}
void USART_Init( unsigned int baud ) {
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // Set frame format: 8data, 1stop bit
/* Set frame format: 8data, 2stop bit */
//UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
sei();// Enable the Global Interrupt Enable flag so that interrupts can be processed
}
unsigned char USART_Receive( void ) {
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
; /* Get and return received data from buffer */
return UDR;
}
// ***********************************************************
// Main program
//
int main(void) {
DDRB = 0xFF; //Для отладки
//Скорость USART 9600 при кварцевом генераторе 8MHz
USART_Init (0x33);
USART_Transmit('O');//Передаем при включении
USART_Transmit('k');//сообщение "Ok!", что свидетельствует
USART_Transmit('!');//о правильно работе программы
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
while(1) { // Infinite loop; define here the
}
}