Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART ATmega8535
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
colombo_2007
Доброго врени суток.
Такая проблема: есть ATmega8535 с кварцем в 16мег и программой
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define baudrate 207

ISR(USART_UDRE_vect)
{
UDR=0x71;
}

main()
{
UBRRH = 0;//(unsigned char) (baudrate>>8);
UBRRL = 207;//(unsigned char) baudrate;
UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(UDRIE);
UCSRC = _BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);
sei();
UDR=0x71;
sleep_mode();
}

Компьютер на передачу реагирует, но принимает 0x00. ПУ стандартный на MAX232. Где я не прав?
Заранее спасибо.
Eltex
Цитата
Где я не прав?


Вот здесь:
UCSRC = _BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);

Регистр UCSRC находится в одной области ввода/вывода с UBRRH, стр. 160 даташита.
colombo_2007
Цитата(Eltex @ Jul 19 2007, 09:33) *
Вот здесь:
UCSRC = _BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);

Регистр UCSRC находится в одной области ввода/вывода с UBRRH, стр. 160 даташита.

Ok. Т.е. ты хочешь сказать, что компилятор хоть и C сам разбираться не хочет, хотя ему явно указано в какой регист я хочу делать I/O?
AVR
Цитата(colombo_2007 @ Jul 19 2007, 12:39) *
Ok. Т.е. ты хочешь сказать, что компилятор хоть и C сам разбираться не хочет, хотя ему явно указано в какой регист я хочу делать I/O?

Да, надо указывать самостоятельно.
P.S.
UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);
Eltex
Цитата(colombo_2007 @ Jul 19 2007, 11:39) *
Ok. Т.е. ты хочешь сказать, что компилятор хоть и C сам разбираться не хочет, хотя ему явно указано в какой регист я хочу делать I/O?


И где это ему явно указано?
UCSRC - это всего лишь константа обьявленная дерективой #define соответствующая адрессу ячейки I/O в соответсвующем контроллере, так сложилось что UCSRC и UBRRH находятся в одной ячейке и имеют
соответственно одинаковое значение.
Мало того в дефайнах этого контроллера чаще всего имеет место быть такая запись:

#define UBRRH _SFR_IO8(0x20)
#define UCSRC UBRRH

Так откуда компилеру знать чего Вы от него хотите.

Пишите так как указано выше (AVR).

PS: А в доку видать так и не заглянули....
colombo_2007
Не в доку заглянул, все это чуть дальше написано, просто после PC таки вещи немного странными кажуться.
Ладно, все это лирика. Завтра с утра будет очередной подход к снаряду. Спасибо.
colombo_2007
UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);
Непологло. Все постарому
mdmitry
Вместо sleep_mode(); поставить бесконечный цикл для отладки и посмотреть что будет. Можно в цикле ногой дергать, показывая, что живет.
Сергей Борщ
Цитата(colombo_2007 @ Jul 19 2007, 13:29) *
просто после PC таки вещи немного странными кажуться.
Ознакомьтесь для примера с описанием ПиСишного контроллера последовательного порта 16550, в частности c регистрами Receiver(Transmitter) Buffer, Interrupt Enable, Divisor Latch Hi, Divisor Latch Lo и с назначением бита DLAB. Конечно, вызывая API-функции вы всего этого не видите, но и драйвера кто-то пишет.
colombo_2007
Всем спасибо. Разобрался я. Контроллер по дефолту работает на внутреннем ленераторе частотой в 1мег.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.