|
USART на АTmega48, не работает |
|
|
|
Dec 9 2008, 16:27
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 22-09-08
Пользователь №: 40 380

|
Доброго времени суток. Значит так, собрал платку на 48 Атмеге, работает, необходимо отправлять данные на ПК... Как топорный вариант выбрал COM-порт. Для этого была взята схемка MAX232, ну вобщем всё по книжке... Однако, не получается даже сделать простешего зеркала=/. При этом ситуация следующая: - Атмега работает от внешнего кварца в 20 МГц; - скорость - не важно, пробовал на многих, ни на одной не работает... - МАХ рабочий, тупо закорачивал ноги - сигнал возвращался тут же... - если оциллографом смотреть на ногах самой Атмеги, то приходит всегда то, что нужно, а в ответ уходит какая-то ересь... (в моём случае это 0x80) Ну вот собственно код: Код #include <avr/io.h> #include <avr/interrupt.h>
#define FOSC 20000000 // Clock Speed #define BAUD 2400 #define MYUBRR FOSC/16/BAUD-1
void USART_Init (unsigned int);
volatile unsigned char buff;
ISR (USART_RX_vect, ISR_BLOCK) { buff=UDR0; while ( !( UCSR0A & (1<<UDRE0)) ); UDR0 = buff; }
ISR (USART_TX_vect, ISR_BLOCK) { buff=0; }
void main( void ) { sei(); USART_Init(MYUBRR); for(;;); }
void USART_Init(unsigned int ubrr) { UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr;
UCSR0B |= (1<<RXCIE0); UCSR0B |= (1<<TXCIE0);
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<USBS0)|(3<<UCSZ00); } Может быть кварц слишком быстрый? Но по даташиту ограничения нету на его частоту никаких... Спасибо.
Сообщение отредактировал NikitoS-86 - Dec 9 2008, 16:29
|
|
|
|
|
 |
Ответов
|
Dec 9 2008, 16:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(NikitoS-86 @ Dec 9 2008, 18:27)  - если оциллографом смотреть на ногах самой Атмеги, то приходит всегда то, что нужно, а в ответ уходит какая-то ересь... (в моём случае это 0x80) Странно. Уходить не должно вообще. Прерывания приема не разрешены, значит до записи в UDR дело не доходит. Зачем вы используете прерывания, если внутри обработчика все равно ждете в цикле? Код UCSR0B |= (1<<RXCIE0); UCSR0B |= (1<<TXCIE0);
UCSR0B |= (1<<RXEN0)|(1<<TXEN0); Каков глубокий смысл этих манипуляций? Почему не написать сразу UCSR0B = (1<<RXCIE0)| (1<<TXCIE0)| (1<<RXEN0)|(1<<TXEN0); и не забыть | (1<<RXСIE0) Цитата(NikitoS-86 @ Dec 9 2008, 18:27)  Может быть кварц слишком быстрый? Но по даташиту ограничения нету на его частоту никаких... Ограничения есть в зависимости от напряжения питания. Красивые графики №131 и 132. Цитата(Палыч @ Dec 9 2008, 18:36)  Я - не уверен. Посчитайте на калькуляторе и запишите результат: Абсолютно глупый совет. А если завтра кварц другой поставят? Снова калькулятор в зубы? А если скорость другая потребуется? А как не забыть все места, в которых надо подправить такие "магические" числа? Или вы думаете, что калькулятор в компиляторе может ошибаться? Тогда надежнее всего писать прямо в кодах - мало ли, ассемблер ошибется и не тот код команды подставит. Чтобы компилятор посчитал правильно, надо ему правильно написать: #define FOSC 20000000ULL Все, дальше вычисления идут в длинных целых. Порядок действий компилятор изменить может лишь в том случае, если это не повлияет на результат.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 9 2008, 17:37
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(Сергей Борщ @ Dec 9 2008, 19:54)  А если завтра кварц другой поставят? Снова калькулятор в зубы? А если скорость другая потребуется? А как не забыть все места, в которых надо подправить такие "магические" числа? Или вы думаете, что калькулятор в компиляторе может ошибаться? А если поставят кварц, когда ошибка разсинхронизации выйдет за грани допустимой при любых прескалерах - не думали? Именно для исключения подобных неурядиц пользуются так называемыми Code Wizard или Uart calculator. Например в Code Vision это очень хорошо сделано, да и для IAR вроде уже есть плагины.
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Dec 9 2008, 18:13
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(Сергей Борщ @ Dec 9 2008, 20:49)  И что будет? В худшем случае на первом же тестовом устройстве связи не будет. Причем сразу ясно, где копать. В лучшем - стоит проверка, вычисляющая получившуюся ошибку и дающая #error или #warning прямо на этапе компиляции. А если вы изменили кварц и из пяти таких "магических" цифр вспомнили поменять только четыре - приятной отладки. Будет именно то, что написал товарищ. А на скорости 2400 при кварце 20 Гц нет таких прескалеров, которые сделали бы уарт работоспособным. Именно поэтому и рекомендую пользовать вышеуказанный софт  Хотя, извиняюсь... калькулятор кривоват оказался. В Code Vision все ок.. А на счет #warning и #error поддреживаю, вопрос только в том - зачем делать то, что уже сделано другими (это кстати к вопросу - может на асме наченм программировать? :-) )
--------------------
Это не то что вы подумали ...
|
|
|
|
Сообщений в этой теме
NikitoS-86 USART на АTmega48 Dec 9 2008, 16:27 Палыч Вы уверены что вот это будет подсчитано правильно
... Dec 9 2008, 16:36 NikitoS-86 Цитата(Палыч @ Dec 9 2008, 19:36) Вы увер... Dec 9 2008, 16:43  Палыч Цитата(NikitoS-86 @ Dec 9 2008, 19:4... Dec 9 2008, 16:49   NikitoS-86 Цитата(Палыч @ Dec 9 2008, 19:49) Ну, поч... Dec 9 2008, 16:53 Палыч Может fuse CKDIV8 остался запрограммирован? С заво... Dec 9 2008, 17:01 Палыч Цитата(Сергей Борщ @ Dec 9 2008, 19:54) С... Dec 9 2008, 17:07 NikitoS-86 Цитата(Сергей Борщ @ Dec 9 2008, 19:54) С... Dec 9 2008, 17:10  Сергей Борщ Цитата(NikitoS-86 @ Dec 9 2008, 19:1... Dec 9 2008, 17:44 man with no name попробуйте uart включать после окончательной иници... Dec 9 2008, 17:04 gormih AVR CALCULATOR
Хватит уже п**у мучать, товарищи... Dec 9 2008, 17:46 =GM= Цитата(NikitoS-86 @ Dec 9 2008, 16:2... Dec 9 2008, 19:01 NikitoS-86 Значится так...
1) Всем спасибо, поскольку полезно... Dec 10 2008, 09:07 Сергей Борщ Цитата(NikitoS-86 @ Dec 10 2008, 11... Dec 10 2008, 09:53  NikitoS-86 Цитата(Сергей Борщ @ Dec 10 2008, 12:53) ... Dec 10 2008, 13:11   Сергей Борщ Цитата(NikitoS-86 @ Dec 10 2008, 15... Dec 10 2008, 13:22
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|