|
|
  |
WinAVR USART помогите |
|
|
|
Dec 26 2008, 08:07
|
Участник

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

|
При инициализации USART, а именно запись в регистр UCSRC, одновременно изменяет свое значение и регистр UBRRH.
Это видно в симуляторе (DEBUG) AVRStudio.
Вот инфа из ПДФ контроллера:
/* Set baud rate */ UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
После выполнения последней строчки UBRRH Становится равным UCSRC. Почему???
|
|
|
|
|
Dec 26 2008, 08:50
|
Участник

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

|
Цитата(_Pasha @ Dec 26 2008, 11:15)  Avrstudio известна некорректной симуляцией этих регистров. Лично наступал на эти грабли. Смотрите листинг, если там все нормально, то на студию можно плюнуть.  ПОЧЕМУ-ТО ВСЕ РАВНО НЕ ШЛЕТ. Вот мои функции: Код void UARTCreate(void) { bit_clear(DDRD, 0); bit_set(DDRD, 1); UBRRL = 77; // скорость 9600. кварц 20000000 UCSRB = 0xD8;//11011000 разрешены прерывания при приеме и при посылке UCSRC = 0x86;//10000110 1 стоп бит, 8бит данных }
void UARTOutByte(unsigned char Value) { UDR = Value; TxReady = 0; do { } while (TxReady == 0); }
ISR(USART_TX_vect) { TxReady = 1; } В main просто процедура UARTOutByte(0xAA) Что не так? P.S. Точнее шлет, не пойми что!!! От модератора. Сообщение отредактировано. Пожалуйста, пользуйтесь тегами code и codebox, для оформления исходных текстов.
|
|
|
|
|
Dec 26 2008, 09:13
|

Местный
  
Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344

|
у меня так Код void USART_init(void) { UBRR0H = 0; UBRR0L = 17; // Set baud rate UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0); UCSR0C = (1<<URSEL0) | (1<<UCSZ01) | (1<<UCSZ00); } void USART0_TX(char *s) { while (*s) { while ( !( UCSR0A & (1<<UDRE0))); UDR0 = *s++; } }
USART0_TX("\xAA");
Сообщение отредактировал chief_olimp - Dec 26 2008, 09:13
|
|
|
|
|
Dec 26 2008, 10:35
|
Группа: Новичок
Сообщений: 11
Регистрация: 12-04-08
Пользователь №: 36 705

|
Аналогичная ситуация и у меня: при изменении одного регистра, AVR Studio показывает изменение другого, и наоборот. НО только лишь ПОКАЗЫВАЕТ, реального изменения состояния нет. Просто глюк такой и надо с ним смириться) Кину пример небольшой программки. Она производит АЦП и пересылает байт результата оцифровки по UART. Прога отлажена на реальном стенде, так что всё работает. CODE .include "m16def.inc" .org $000 rjmp start .org $018 rjmp trans .org $01c rjmp adccomp .org $030
trans: out UDR,r28 reti
adccomp: in r27,ADCL out portb,r27 in r28,ADCH out portc,r28 reti
start: ldi r31,LOW(RAMEND) out spl,r31 ldi r31,HIGH(RAMEND) out sph,r31
sei
ldi r27,0b11111111 out ddrb, r27
ldi r27,0b11111111 out ddrc, r27
ldi r28,0b11101111 out ADCSRA,r28
ldi r28,0b00100000 out ADMUX,r28
ldi r28,95 out UBRRL,r28
ldi r28,0b00101000 out UCSRB,r28
ldi r28,0b10000110 out UCSRC,r28
Loop: rjmp Loop
На порты В и С выводится результат АЦП для наглядности при симуляции в AVR Studio или Протеусе.
Сообщение отредактировал rezident - Dec 27 2008, 22:19
|
|
|
|
|
Dec 27 2008, 08:00
|
Участник

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

|
Цитата(SysRq @ Dec 27 2008, 00:50)  Мнээ.. собстно, если формула расчета baudrate обычная (baudrate = f_osc/(16*(UBRR + 1))), то тут не 9600, а что-то в районе 16к. Принимающая сторона с режимом 9600-8-N-1 будет принимать, но всякую хрень.
PS: TxReady должна быть volatile. Перепутал. Кварц 12000000
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|