UART неверно передает данные. ATMega168 16MHz
Добавлено: Вс ноя 08, 2015 13:58:56
Собрал маленькую схемку, которая отправляла на комп по UART символы (строку/текст).
Схемка работала на внутреннем тактовом генераторе на 8 МГц. Всё было отлично.
Понадобилось повысить частоту схемки. Подключил внешний кварц на 16 МГц. Указал новые значения в регистре UBRR0L, соответствующие для 16 МГц и скорости 9600 бод.
Теперь вместо символов какая-то каша (такое ощущение, что символы передаются как-то криво)
То есть даже по длине строка не совпадает с отправленной. Есть ощущение, что кроме значения в указанном регистре я должен был поменять ещё где-то настройки, но я не могу найти где.
Подскажите пожалуйста.
Схемка работала на внутреннем тактовом генераторе на 8 МГц. Всё было отлично.
Понадобилось повысить частоту схемки. Подключил внешний кварц на 16 МГц. Указал новые значения в регистре UBRR0L, соответствующие для 16 МГц и скорости 9600 бод.
Теперь вместо символов какая-то каша (такое ощущение, что символы передаются как-то криво)
То есть даже по длине строка не совпадает с отправленной. Есть ощущение, что кроме значения в указанном регистре я должен был поменять ещё где-то настройки, но я не могу найти где.
Подскажите пожалуйста.
Код: Выделить всё
/*-----------------------------------------------------------------------
/ USART for ATmega168a ----- Gek0n
/-----------------------------------------------------------------------*/
#include "usart.h"
#include <mega168a.h>
void usart_init(){
UBRR0H = 0x00;
UBRR0L = 0x67; //Раньше тут было 0x33 для 8 МГц и 9600 бод
UCSR0B = (1 << TXEN0);
UCSR0C = (3 << UCSZ00);
}
void usart_send(char byte){
while(!(UCSR0A &(1 << UDRE0)));
UDR0 = byte;
}
void usart_send_str(char *s){
while(*s) usart_send(*s++);
}
void usart_send_buf(char *buf, int size){
do{ usart_send(*buf++); }
while(--size);
}