|
Одноразовый 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 5 2012, 23:54
|

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

|
В общем, память однозначо перетирают прерывания от АЦП. Код volatile unsigned char laja; // TEST
#pragma vector=(0x48*0x02) __interrupt void ADC3_RxC_isr(void) { // unsigned char ADC3_temp; ADC3_temp = ADC3_RxC_counter; ADC3_temp--; laja = UDR1; // Buf_ADC3[ADC3_temp] = UDR1;
if(ADC3_temp) { UDR1 = ADC3_temp; } else { ADC3_CS_PASSIV; } ADC3_RxC_counter = ADC3_temp; PORTA ^= ((1<<1)); } Как только слив данных поставил в volatile переменную вместо массивов, сразу всё стало пучкасто. Провёл серию экспериментов, проинициализировал Buf_ADCx[], на выход идёт всё корректно. То есть цикл прерываний отрабатывается правильно, данные из временных буферов Buf_ADCx[] перекладываются во фрейм и т.д. То есть рушит всё именно строчка Buf_ADCx[ADCx_temp] = UDRx;. Только непонятно почему - по лапе PORTA я вижу правильное число заходов в прерывание.
|
|
|
|
|
Aug 6 2012, 06:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(Dikoy @ Aug 6 2012, 03:54)  В общем, память однозначо перетирают прерывания от АЦП. Код volatile unsigned char laja; // TEST
#pragma vector=(0x48*0x02) __interrupt void ADC3_RxC_isr(void) { // unsigned char ADC3_temp; ADC3_temp = ADC3_RxC_counter; ADC3_temp--; laja = UDR1; // Buf_ADC3[ADC3_temp] = UDR1;
if(ADC3_temp) { UDR1 = ADC3_temp; } else { ADC3_CS_PASSIV; } ADC3_RxC_counter = ADC3_temp; PORTA ^= ((1<<1)); } Полный бред. 1) ADC3_temp = ADC3_RxC_counter; 2) ADC3_temp--; 3) Buf_ADC3[ADC3_temp] = UDR1; 4) ADC3_RxC_counter = ADC3_temp; 5) goto 1 Разумеется после обнуления ADC3_temp команда из п.2 сделает ADC3_temp==0xFF и тогда п.3 сломает память.
|
|
|
|
|
Aug 6 2012, 11:12
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Petka @ Aug 6 2012, 09:33)  Разумеется после обнуления ADC3_temp команда из п.2 сделает ADC3_temp==0xFF и тогда п.3 сломает память. Но для этого нужно чтобы возникло прерывание.Оно возникнет? Цитата(kolobok0 @ Aug 3 2012, 00:41)  нигде не указано, что менять местами поля нельзя в структуре. особенно первые и последнии. А как указать чтобы поля не менялись местами?
|
|
|
|
Сообщений в этой теме
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 prottoss 2 Dikoy
Вы не верно строите прерывание. Как Вы зна... Aug 3 2012, 04:09 Dikoy Цитата(prottoss @ Aug 3 2012, 08:09) 2 Di... Aug 3 2012, 14:51  _Артём_ Цитата(Dikoy @ Aug 3 2012, 17:51) Помимо ... Aug 3 2012, 15:01 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     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
|
|
|