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

 
 
> Одноразовый UART в AVR, Отправляет данные корректно только 1 раз..
Dikoy
сообщение Aug 2 2012, 18:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



IAR 4.30, ATmega640.
Структура. Надо её всю слить в UART.
Беру указатель на начало и попёр. Вроде всё правильно. Но отправляется корректно она только первый раз, а потом идёт мусор.

CODE
#pragma pack(1)
typedef struct
{
unsigned char Length;
unsigned char Cmd;
unsigned char ADC1[ADCBUFSISE]; // ADCBUFSISE == 18
unsigned char ADC2[ADCBUFSISE];
unsigned char ADC3[ADCBUFSISE];
unsigned char crc_h;
unsigned char crc_l;
} Response_str;
#pragma pack()


Response_str TransmisionFrame;
unsigned char *pUart0_tx_pointer;


void USART0_Transmit( unsigned char data ) {
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
}


// инициирую отправку пакета раз в 2 секунды, пакет отправляется 2 мс, по этому период огромен
void main( void ) {
while(1) {
pUart0_tx_pointer = &TransmisionFrame.Cmd;
USART0_Transmit( TransmisionFrame.Length );
__delay_cycles(8000000*8);

}
}


// прерывание
// USART0 Transmitter interrupt service routine
#pragma vector=(0x36*0x02)
__interrupt void USART0_TXC_isr(void) { //

if( pUart0_tx_pointer <= &TransmisionFrame.crc_l ) {
UDR0 = *pUart0_tx_pointer++;
}
}


Результат:

Код
223A0000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000A55A - верный пакет
1A606908A5019746581A058A58A58199C65F1A606908A5019746581A058A58A58199C65F1A606908
A5019746581A058A58A58199C65F1A606908 - лажа
1A626910A52197C6581A078A64A5A19906601A626910A52197C6581A078A64A5A19906601A626910
A52197C6581A078A64A5A19906601A626910 - лажа


Подумал, указатель сползает... Сделал так:

Код
while( 1 )
  {
    pUart0_tx_pointer = &TransmisionFrame.Cmd;
    USART0_Transmit( TransmisionFrame.Length );  
    __delay_cycles(8000000*8);
    memset( &TransmisionFrame, 0xAA, sizeof(TransmisionFrame) );    
  }


Получил:

Код
223A0000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000A55A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Лага категорически не вижу sad.gif

Сообщение отредактировал IgorKossak - Aug 2 2012, 18:23
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Aug 3 2012, 04:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



2 Dikoy
Вы не верно строите прерывание. Как Вы знаете, в USART AVR при передаче работают два регистра - UDR (Доступен из программы пользователя) и Transmit Shift Register (будем для краткости называть его TSR). Когда Вы записываете данные в UDR, они, если TSR пуст, автоматически переписываются в него. Второй как раз занимается передачей последовательных данных на выход TXDx. О состоянии этих регистров можно судить по флагам UDRE (регистр данных пуст) и TXC (TSR пуст). Так вот, не нужно при передаче пакета данных использовать прерывание TXC, а нужно использовать прерывание UDRE. А вот окончание сеанса передачи всего пакета уже можно отследить по TXC, т.е. данных для отправки нет, и TSR освободился.


--------------------
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Aug 3 2012, 14:51
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Цитата(prottoss @ Aug 3 2012, 08:09) *
2 Dikoy
а нужно использовать прерывание UDRE.

Помимо передачи, у меня есть ещё и приём. UDRE будет возникать в обоих случаях. Насколько помню, для разделения процессов приёма и передачи TxC/RxC и были придуманы. По крайней мере до этого я использовал именно их, и сейчас, после отключения лишних прерываний, данный код отлично работает.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 3 2012, 15:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Aug 3 2012, 17:51) *
Помимо передачи, у меня есть ещё и приём. UDRE будет возникать в обоих случаях.

Да ну?

Цитата
• Bit 5 – UDREn: USART Data Register Empty
The UDREn flag indicates if the transmit buffer (UDRn) is ready to receive new data. If UDREn is
one, the buffer is empty, and therefore ready to be written. The UDREn flag can generate a Data
Register Empty interrupt (see description of the UDRIEn bit).
UDREn is set after a reset to indicate that the Transmitter is ready.


Цитата(Dikoy @ Aug 3 2012, 17:51) *
Насколько помню, для разделения процессов приёма и передачи TxC/RxC и были придуманы.


RxC - флаг приёма.
TxC - байт передан, нужен для определения окончания передачи пакета (RS485 и тп)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dikoy   Одноразовый UART в AVR   Aug 2 2012, 18:17
- - Сергей Борщ   Что-то (стек?) затирает содержимое структуры после...   Aug 2 2012, 21:34
- - kolobok0   Цитата(Dikoy @ Aug 2 2012, 22:17) ...иниц...   Aug 2 2012, 21:41
- - Dikoy   Да, скорее всего стек... 18 байт, это размер масси...   Aug 3 2012, 02:59
|- - Сергей Борщ   QUOTE (Dikoy @ Aug 3 2012, 05:59) Ещё до ...   Aug 3 2012, 23:10
|- - _Артём_   Цитата(Сергей Борщ @ Aug 4 2012, 02:10) З...   Aug 4 2012, 00:09
- - mempfis_   Может организуйте fifo для отправки данных? CODEu...   Aug 3 2012, 08:44
- - xemul   Кодwhile( 1 ) { pUart0_tx_pointer = ...   Aug 3 2012, 10:51
|- - _Артём_   Цитата(xemul @ Aug 3 2012, 13:51) Кодwhil...   Aug 3 2012, 11:02
||- - xemul   Цитата(_Артём_ @ Aug 3 2012, 15:02) Несоп...   Aug 3 2012, 11:56
||- - _Артём_   Цитата(xemul @ Aug 3 2012, 14:56) У меня ...   Aug 3 2012, 12:18
||- - xemul   Цитата(_Артём_ @ Aug 3 2012, 16:18) И что...   Aug 3 2012, 12:25
||- - _Артём_   Цитата(xemul @ Aug 3 2012, 15:25) Да ну? ...   Aug 3 2012, 12:43
||- - xemul   Цитата(_Артём_ @ Aug 3 2012, 16:31) Кодvo...   Aug 3 2012, 12:48
||- - _Артём_   Цитата(xemul @ Aug 3 2012, 15:48) Йес-с-с...   Aug 3 2012, 13:07
||- - xemul   Цитата(_Артём_ @ Aug 3 2012, 17:07) Обычн...   Aug 3 2012, 13:19
|- - Dikoy   Цитата(xemul @ Aug 3 2012, 14:51) Кодwhil...   Aug 3 2012, 15:34
|- - _Артём_   Цитата(Dikoy @ Aug 3 2012, 18:34) Вы пред...   Aug 3 2012, 15:43
- - Dikoy   Почитал про UDRE. Получается, прерывание оное надо...   Aug 4 2012, 01:01
|- - _Артём_   Цитата(Dikoy @ Aug 4 2012, 04:01) Почитал...   Aug 4 2012, 01:17
|- - _Артём_   Цитата(Dikoy @ Aug 4 2012, 04:01) Отключа...   Aug 5 2012, 19:39
- - Dikoy   RE: Одноразовый UART в AVR   Aug 5 2012, 18:01
- - Dikoy   Я уже писал тут где-то, что у меня цепь из 2 чипов...   Aug 5 2012, 20:32
|- - _Артём_   Цитата(Dikoy @ Aug 5 2012, 23:32) Я уже п...   Aug 5 2012, 21:00
- - Dikoy   В общем, память однозначо перетирают прерывания от...   Aug 5 2012, 23:54
|- - Petka   Цитата(Dikoy @ Aug 6 2012, 03:54) В общем...   Aug 6 2012, 06:33
|- - _Артём_   Цитата(Petka @ Aug 6 2012, 09:33) Разумее...   Aug 6 2012, 11:12
||- - kolobok0   Цитата(_Артём_ @ Aug 6 2012, 15:12) ...А ...   Aug 6 2012, 13:10
||- - _Артём_   Цитата(kolobok0 @ Aug 6 2012, 16:10) код ...   Aug 6 2012, 13:24
||- - Сергей Борщ   QUOTE (_Артём_ @ Aug 6 2012, 16:24) Я так...   Aug 6 2012, 19:09
||- - kolobok0   Цитата(_Артём_ @ Aug 6 2012, 17:24) ...ко...   Aug 7 2012, 06:05
|- - Dikoy   Цитата(Petka @ Aug 6 2012, 10:33) Полный ...   Aug 6 2012, 20:18
|- - _Pasha   Цитата(Dikoy @ Aug 6 2012, 23:18) а не в ...   Aug 6 2012, 23:06
|- - Petka   Цитата(Dikoy @ Aug 7 2012, 00:18) ... 1 и...   Aug 7 2012, 07:05
|- - Dikoy   Цитата(Petka @ Aug 7 2012, 11:05) А что з...   Aug 7 2012, 23:02
- - _Pasha   Вы б отложили чашку с кофейной гущей и гадали бы н...   Aug 6 2012, 12:25
- - hd44780   Возьмите реализацию очередей из CVAvr-а. Я её и на...   Aug 7 2012, 06:27
|- - mempfis_   Цитата(hd44780 @ Aug 7 2012, 09:27) Возьм...   Aug 7 2012, 07:12
- - Dikoy   Переписал прерывание через указатель, и всё зарабо...   Aug 8 2012, 02:35
|- - Сергей Борщ   QUOTE (Dikoy @ Aug 8 2012, 05:35) Прерыва...   Aug 8 2012, 16:18
- - Dikoy   В этом случае компилер ругается Warning[Pa082]: ...   Aug 9 2012, 02:33
|- - xemul   Цитата(Dikoy @ Aug 9 2012, 06:33) В этом ...   Aug 9 2012, 09:39
||- - _Артём_   Цитата(xemul @ Aug 9 2012, 12:39) Вот так...   Aug 9 2012, 09:53
||- - xemul   Цитата(_Артём_ @ Aug 9 2012, 13:53) Нет, ...   Aug 9 2012, 10:18
||- - _Артём_   Цитата(xemul @ Aug 9 2012, 13:18) Обоснов...   Aug 9 2012, 11:00
|- - Сергей Борщ   QUOTE (Dikoy @ Aug 9 2012, 05:33) В этом ...   Aug 9 2012, 18:26
- - xemul   Спасибо. Вероятно, предупреждение связано таки с д...   Aug 9 2012, 11:41
- - Dikoy   инкремент указателя будет согласно типу. У нас это...   Aug 9 2012, 17:13


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

 


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


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