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

 
 
 
Reply to this topicStart new topic
> USART ATmega8535
colombo_2007
сообщение Jul 19 2007, 06:12
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 19-07-07
Пользователь №: 29 221



Доброго врени суток.
Такая проблема: есть 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. Где я не прав?
Заранее спасибо.


--------------------
Все просто, но нам не заметно
Go to the top of the page
 
+Quote Post
Eltex
сообщение Jul 19 2007, 06:33
Сообщение #2





Группа: Новичок
Сообщений: 13
Регистрация: 14-07-06
Из: Ukraine
Пользователь №: 18 821



Цитата
Где я не прав?


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

Регистр UCSRC находится в одной области ввода/вывода с UBRRH, стр. 160 даташита.
Go to the top of the page
 
+Quote Post
colombo_2007
сообщение Jul 19 2007, 08:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 19-07-07
Пользователь №: 29 221



Цитата(Eltex @ Jul 19 2007, 09:33) *
Вот здесь:
UCSRC = _BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);

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

Ok. Т.е. ты хочешь сказать, что компилятор хоть и C сам разбираться не хочет, хотя ему явно указано в какой регист я хочу делать I/O?


--------------------
Все просто, но нам не заметно
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 19 2007, 09:05
Сообщение #4


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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

Да, надо указывать самостоятельно.
P.S.
UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);


--------------------
Go to the top of the page
 
+Quote Post
Eltex
сообщение Jul 19 2007, 09:09
Сообщение #5





Группа: Новичок
Сообщений: 13
Регистрация: 14-07-06
Из: Ukraine
Пользователь №: 18 821



Цитата(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: А в доку видать так и не заглянули....
Go to the top of the page
 
+Quote Post
colombo_2007
сообщение Jul 19 2007, 10:29
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 19-07-07
Пользователь №: 29 221



Не в доку заглянул, все это чуть дальше написано, просто после PC таки вещи немного странными кажуться.
Ладно, все это лирика. Завтра с утра будет очередной подход к снаряду. Спасибо.


--------------------
Все просто, но нам не заметно
Go to the top of the page
 
+Quote Post
colombo_2007
сообщение Jul 20 2007, 19:52
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 19-07-07
Пользователь №: 29 221



UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ0)|_BV(UCSZ1);
Непологло. Все постарому


--------------------
Все просто, но нам не заметно
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jul 20 2007, 20:34
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Вместо sleep_mode(); поставить бесконечный цикл для отладки и посмотреть что будет. Можно в цикле ногой дергать, показывая, что живет.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 20 2007, 21:26
Сообщение #9


Гуру
******

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



Цитата(colombo_2007 @ Jul 19 2007, 13:29) *
просто после PC таки вещи немного странными кажуться.
Ознакомьтесь для примера с описанием ПиСишного контроллера последовательного порта 16550, в частности c регистрами Receiver(Transmitter) Buffer, Interrupt Enable, Divisor Latch Hi, Divisor Latch Lo и с назначением бита DLAB. Конечно, вызывая API-функции вы всего этого не видите, но и драйвера кто-то пишет.


--------------------
На любой вопрос даю любой ответ
"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
colombo_2007
сообщение Jul 25 2007, 18:54
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 19-07-07
Пользователь №: 29 221



Всем спасибо. Разобрался я. Контроллер по дефолту работает на внутреннем ленераторе частотой в 1мег.


--------------------
Все просто, но нам не заметно
Go to the top of the page
 
+Quote Post

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

 


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


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