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

 
 
> Одноразовый 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
Ответов
Dikoy
сообщение Aug 5 2012, 23:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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 я вижу правильное число заходов в прерывание.
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 6 2012, 06:33
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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 сломает память.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 6 2012, 11:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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) *
нигде не указано, что менять местами поля нельзя в структуре. особенно первые и последнии.

А как указать чтобы поля не менялись местами?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 6 2012, 13:10
Сообщение #5


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(_Артём_ @ Aug 6 2012, 15:12) *
...А как указать чтобы поля не менялись местами?


код видоизменить так, что бы не было в нём первого поля, или последнего. структура как чёрный ящик - длина, начало буфера. тогда пофигу будет где в ней какие поля раскиданы.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 6 2012, 13:24
Сообщение #6


Гуру
******

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



Цитата(kolobok0 @ Aug 6 2012, 16:10) *
код видоизменить так, что бы не было в нём первого поля, или последнего. структура как чёрный ящик - длина, начало буфера. тогда пофигу будет где в ней какие поля раскиданы.

А что у вас были случаи когда компилятор менял местами поля в структуре?
Я таких случаев не помню.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 6 2012, 19:09
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Артём_ @ Aug 6 2012, 16:24) *
Я таких случаев не помню.
Да и стандарт не позволяет. Но у страха-то глаза велики...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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
- - 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


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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 21:17
Рейтинг@Mail.ru


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