реклама на сайте
подробности

 
 
> USART на АTmega48, не работает
NikitoS-86
сообщение Dec 9 2008, 16:27
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Dec 9 2008, 16:54
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
gormih
сообщение Dec 9 2008, 17:37
Сообщение #3


nofb
***

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



Цитата(Сергей Борщ @ Dec 9 2008, 19:54) *
А если завтра кварц другой поставят? Снова калькулятор в зубы? А если скорость другая потребуется? А как не забыть все места, в которых надо подправить такие "магические" числа? Или вы думаете, что калькулятор в компиляторе может ошибаться?

А если поставят кварц, когда ошибка разсинхронизации выйдет за грани допустимой при любых прескалерах - не думали? Именно для исключения подобных неурядиц пользуются так называемыми Code Wizard или Uart calculator. Например в Code Vision это очень хорошо сделано, да и для IAR вроде уже есть плагины.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 9 2008, 17:49
Сообщение #4


Гуру
******

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



Цитата(gormih @ Dec 9 2008, 19:37) *
А если поставят кварц, когда ошибка разсинхронизации выйдет за грани допустимой при любых прескалерах - не думали?
И что будет? В худшем случае на первом же тестовом устройстве связи не будет. Причем сразу ясно, где копать. В лучшем - стоит проверка, вычисляющая получившуюся ошибку и дающая #error или #warning прямо на этапе компиляции. А если вы изменили кварц и из пяти таких "магических" цифр вспомнили поменять только четыре - приятной отладки.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - gormih   Цитата(Сергей Борщ @ Dec 9 2008, 20:49) И...   Dec 9 2008, 18:13
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 18:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01295 секунд с 7
ELECTRONIX ©2004-2016