|
Одноразовый UART в AVR, Отправляет данные корректно только 1 раз.. |
|
|
|
Aug 2 2012, 18:17
|

Местный
  
Группа: Участник
Сообщений: 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 Лага категорически не вижу
Сообщение отредактировал IgorKossak - Aug 2 2012, 18:23
Причина редактирования: [codebox] для длинного кода!!!
|
|
|
|
|
 |
Ответов
|
Aug 3 2012, 15:01
|
Гуру
     
Группа: Свой
Сообщений: 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 и тп)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|