-
28.03.2010, 04:48 #1
- Регистрация
- 22.03.2010
- Возраст
- 42
- Сообщений
- 5
- Поблагодарили
- 0
- Поблагодарил
- 0
USART в mega16
Привет всем!
Немогу понять, что делать с регистрами UBRRL и UBRRH. Процессор
AtMega16L-8PU, кварц на 7.3728 МГц. Требуется следующее: с компьютера передать байт по RS-232 в коде 8-N-1 на частоте 9600 бит/сек в микроконтроллер так, чтобы он появился в регистре UBR.
Какие вообще нужно установить флаги в регистрах управления USART?
Заранее большое спасибо!
-
28.03.2010, 06:40 #2
- Регистрация
- 14.02.2005
- Адрес
- Санкт-Петербург
- Возраст
- 61
- Сообщений
- 487
- Поблагодарили
- 47
- Поблагодарил
- 12
Код:// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x2F;
... Я там сам глубину промерял! :: Геннадий Завидовский (Санкт-Петербург)
-
28.03.2010, 17:34 #3
- Регистрация
- 22.03.2010
- Возраст
- 42
- Сообщений
- 5
- Поблагодарили
- 0
- Поблагодарил
- 0
Спасибо за ответ, но вот что получается: в регистре UCSRA bit UDRE
всегда установлен, даже тогда, когда пишеш в него 0х00. Далее, в
регистр UCSRC ничего не пишется, хотя всё как обычно:
ldi r16, $86
out ucsrc, r16
на моей отладочной плате подключён эмулятор AVR Dragon по JTAG и в
окне регистров USART это хорошо видно (в пошаговом режиме программа
просто " пролетает мимо " и в регистре UCSRC остаются нули ). Разумеется ничего не работает. Что это может быть?
-
28.03.2010, 17:54 #4
- Регистрация
- 14.02.2005
- Адрес
- Санкт-Петербург
- Возраст
- 61
- Сообщений
- 487
- Поблагодарили
- 47
- Поблагодарил
- 12
Страницу 153 даташита на процессор посмотрите - там про то, как читать из UCSRC. Только зачем оно? Вы не уверены в том, что ассемблер транслирует правильно?
Бит UDRE - это состояние. Ничего туда писать не надо. В даташите этот бит вообще как read-only помечен (страница 154).
Вот кусочек работающей программы (от атмеги 32) - передача по поросу.
Код:/* передача символа если готов порт */ uint_least8_t hardware_putchar(uint_fast8_t c) { #if defined(CPUSTYLE_SAM7S) if ((AT91C_BASE_US1->US_CSR & AT91C_US_TXRDY) == 0) return 0; AT91C_BASE_US1->US_THR = c; #elif defined (CPUSTYLE_ATMEGA128) if ((UCSR0A & (1 << UDRE0)) == 0) return 0; UDR0 = c; #elif defined (CPUSTYLE_ATMEGA32) if ((UCSRA & (1 << UDRE)) == 0) return 0; UDR = c; #else #error Undefined CPUSTYLE_XXX #endif return 1; } #endif int dbg_putchar(int c) { if (c == '\n') dbg_putchar('\r'); while (hardware_putchar(c) == 0) ; return c; }
... Я там сам глубину промерял! :: Геннадий Завидовский (Санкт-Петербург)
-
01.04.2010, 15:22 #5
- Регистрация
- 22.03.2010
- Возраст
- 42
- Сообщений
- 5
- Поблагодарили
- 0
- Поблагодарил
- 0
Дошло наконец...Работает. Большое спасибо за помощь!
|
Социальные закладки