Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.66/62: Рейтинг темы: голосов - 62, средняя оценка - 4.66
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
1

Проблема с UART на Atmega128

08.11.2015, 03:33. Просмотров 11458. Ответов 30
Метки нет (Все метки)

Всем доброго времение суток, надеюсь поможете разобраться с проблемой.
Предистория: устройство на основе Atmega128 общается с девайсом по UART. Общение происходит на скорости 115200,8,n,1. Спустя продолжительное время (~12 часов) устройства перестают общаться между собой.
Изначально думал что ошибка в стеке память забита почти до упора, почистил ненужные места (освободил около ~20 кб) - результат тот же.
Дальше попробовал повесить светодиод на линии RX,TX. В итоге увидел что МК не посылает запросы на девайс - в итоге тот молчит. Между МК и девайсом стоит еще MAX232.
Пробовал просто тестировать UART - постоянно отправлять данный в порт на ПК - вроде было все хорошо, порт не затыкался.
Код инициализации UART если понадобится могу привести, но думаю раз изначально все работает, а затыкается попозже, то дело не в нем.
Перезапуск по питанию МК помогает, но это не выход, т.к. никто лазить и перезапускать девайс не будет, устройство серийное.
Еще не тыкался осцилографом в ножку МК, думаю завтра попробовать.
Может будут у кого какие идеи, а то я уже в отчаянии.
Частота 14,7456 kHZ, контроллер Atmega128, компилятор - CodeVision 1.25
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 03:33
Ответы с готовыми решениями:

ATMega128, UART и бит четности
Здравствуйте. Есть ATMiko128. При инициализации UARTа на 8 бит данных, без бита четности и 1 стоп...

ATmega128, расширить количество UART до 3
Добрый день! На один УАРТ меги128 (второй УАРТ уже занят) необходимо подцепить два устройства,...

Некорректный прием данных по UART интерфейсу на ATMega128
Контроллер: ATMega 128 Пишу в Visual Studio 2005 Создаю диалоговое MFC приложение Суть...

Как формировать столбцы символов в системе терминал(ПК) -- UART (МК Atmega128)
У меня возник вот такой вопрос. Компьютер через HyperTerminal и Usart связан с Atmega128. Задача:...

Проблема с прошивкой Atmega128
Здравствуйте. Проблема возникла следующая. Имеется плата для управления игровым автоматом....

30
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
08.11.2015, 03:54 2
То есть посылает а через 12 часов просто затыкается обмен - или стоит 12 часом ничего не посылает, а когда должно послать - не посылает.

Вообще всё очень расплывчато. Для начала определите, что там у вас затыкается
Курсы телепатии еще не открыли

Сделать перезагрузку если ничего не приходит - не помогает ?
Или устройство просто умирает после 12 часов (лампочку раз в секунду приделать) для видимости жизни.
Или приемная сторона мертвая хотя устройство пыжится и шлёт данные ?
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
08.11.2015, 12:23 3
Цитата Сообщение от x893
То есть посылает а через 12 часов просто затыкается обмен - или стоит 12 часом ничего не посылает, а когда должно послать - не посылает.

Сделать перезагрузку если ничего не приходит - не помогает ?
Или устройство просто умирает после 12 часов (лампочку раз в секунду приделать) для видимости жизни.
Или приемная сторона мертвая хотя устройство пыжится и шлёт данные ?
Вторая приемная сторона выступает в роли slave-устройства - и отвечает только на запросы.
Девайсы работают, посылают-принимают сообщения, но через небольшой промежуток времени (не обязательно 12 часов - вечером работает, утром уже нет) Atmega перестает слать сообщения.
Сам МК всю остальную работу выполняет, нет признаков того что он где то завис, сбросов по WD тоже не происходит.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
08.11.2015, 13:00 4
Может аппаратная проблема? Непропай MAX232, не те номиналы, плохой контакт?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
08.11.2015, 14:35 5
А уверен , что не посылает? Может не принимает? Что делают оба устройства если связь хотя бы раз не удалась?
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
08.11.2015, 17:23 6
посмотрел осцилографом ножку TX - ничего не видно, соответственно слэйв молчит, по-видимому ошибка в коде...
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
08.11.2015, 20:26 7
Что делает слейв , если не правильно принял данные? Ответьте на все заданные вопросы и не только мои , тогда и решите какой код выкладывать
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
08.11.2015, 21:06 8
Может ошибка в коде, а именно в модуле уарта. Но так как в тестах отправки на пк контроллер не затыкается, то искать в парсинге входящего пакета. Ну или где-то еще. Код в студию.
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
08.11.2015, 21:28 9
Цитата Сообщение от YTYOUT
Что делает слейв , если не правильно принял данные? Ответьте на все заданные вопросы и не только мои , тогда и решите какой код выкладывать
Слейв честно молчит.

Цитата Сообщение от x893
Сделать перезагрузку если ничего не приходит - не помогает ?
Помогает, рестартую МК по WD, и все начинается по новой - общение, работа, а потом МК опять молчит.
Код попозже выложу, там ничего особенного
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
08.11.2015, 21:54 10
Слейв работает от кварца ?
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
08.11.2015, 22:11 11
Цитата Сообщение от YTYOUT
Слейв работает от кварца ?
у него свой кварц, частота такая же, 14,7456 MHZ
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
08.11.2015, 22:16 12
Цитата Сообщение от Hotd
Может аппаратная проблема? Непропай MAX232, не те номиналы, плохой контакт?
по поводу этого - маловероятно. Устройство серийное, проработало не один год. Проблема всплыла когда девайс стали оставлять на долгий период времени включенным, до этого никто о такой проблеме не задумывался.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
09.11.2015, 06:04 13
тогда вопрос по коду. Мастер отправляет что-то слейву, слейв должен дать ответ. Если слейв не даёт ответ, или даёт не тот - как обрабатывается такая ситуация? Нет ли переполнения входного буфера, когда срывает оперативку и начинает затираться еще что-то? Нет ли ситуации, когда вы включаете/выключаете приемник/передатчик либо прерывания на них а посылка может прийти? Надо код смотреть.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
09.11.2015, 12:43 14
Он отвечал , что слейв у него честно молчит. А ведь не должен , должен достучаться до мастера. Похоже у него протокол без подтверждения приема.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.11.2015, 12:53 15
1 - Обмен по UART одно-двух-сторонний?
2 - Что прекращает отсылать данные? МК, девайс?
3 - Вкратце логика работы устройств. Что можно, несекретную часть.
4 - Логика обмена по UART?
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
09.11.2015, 13:31 16
Цитата Сообщение от dymyurk1978
1 - Обмен по UART одно-двух-сторонний?
2 - Что прекращает отсылать данные? МК, девайс?
3 - Вкратце логика работы устройств. Что можно, несекретную часть.
4 - Логика обмена по UART?
1. Обмен двухсторонний
2. МК перестает отсылать сообщения на слэйв - тот в итоге молчит. Виноват МК что ничего не происходит.
3. Устройства - МК и подсоединненный к нему ридер для RFID-карт.
4. Логику - скину попозже.
Сейчас так же скину код модуля UART, нашел подозрительный момент, может подскажете.
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
09.11.2015, 14:54 17
Вот код, удалил только некоторые ненужные детали.
Код
#define SRL1_RX_BUFFER_SIZE   32
#define SRL1_TX_BUFFER_SIZE   32

#define FROMING_ERROR       0x10   //1<<4    - FE
#define DATA_REGISTER_EMPTY 0x20   //1<<5    - UDRE
#define PORITY_ERROR       0x04   //1<<2   - UPE
#define DATA_OVERRUN       0x08   //1<<3   - OVR

#define ENABLE 1
#define DISABLE 0

//____________PORT 0____________________________

//UCSR0B - control omd status rikystir
#define TXEN0   UCSR0B.3
#define RXEN0   UCSR0B.4
#define RXCIE0   UCSR0B.7
#define TXCIE0   UCSR0B.6

//Port 1
#define DTR1     PORTE.5
#define DDR_DTR1 DDRE.5
// USORT1 Receiver buffer
byte srl__rx_buffer[SRL1_RX_BUFFER_SIZE];
byte srl__rx_head,srl__rx_tail,srl__rx_counter;
// USORT1 Transmitter buffer
byte srl__tx_buffer[SRL1_TX_BUFFER_SIZE];
byte srl__tx_head,srl__tx_tail,srl__tx_counter;

void PTM_SRLInit(dword baudrate, eParity parity, byte data_bit, eStopByt stop_bit)
{
dword tmp;
word value;
// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Baud rate: 9600

UCSR1A=0;
UCSR1B=0;
UCSR1C=0x86;   //1000 0110 - UMSEL=0 UPM1:0 = 00 USBS=0 UCSZ2:0 = 011   UCSR0C=0

//Parity
UCSR1C &= ~(BIT_5|BIT_4);       //   NOPORITY omd default

//8 bit
UCSR1B &= ~BIT_2;       //High bit
UCSR1C |= BIT_1|BIT_2;   //Two low bits

//Set Baudrate
tmp = baudrate*1.6;
tmp = XTAL/tmp;
tmp -=    5;
tmp = tmp*0.1;

value = tmp;

UBRR1H = value >> 8;
UBRR1L = value & 0xFF;

DDR_DTR1   = 1;

srl__rx_head = srl__rx_tail = 0;
srl__tx_head = srl__tx_tail = 0;
srl__tx_counter = 0;
srl__rx_counter = 0;

PTM_SRLSetDyristion(SRL_RECEIVE);

//   UCSR1B |= 0x08;   //   TXEN1 = ENABLE;
//   UCSR1B |= 0x10;   //   RXEN1 = ENABLE;
UCSR1B |=   0xD8;   //1101 1000 -  RXCIE0=0 TXCIE0=0 UDRIE0=0 RXEN0=1 TXEN0=1

}

// USORT1 Receiver interrupt service routine
interrupt [USORT1_RXC] void uart1_rx_isr(void)
{
byte status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FROMING_ERROR | PORITY_ERROR | DATA_OVERRUN))==0)
{
if (srl__rx_counter == SRL1_RX_BUFFER_SIZE)   //яхЁхяюыэхэшх
{
srl__rx_counter=0;
srl__rx_head = 0;
srl__rx_tail = 0;
}

srl__rx_buffer[srl__rx_head]=data;

if (++srl__rx_head == SRL1_RX_BUFFER_SIZE)
srl__rx_head=0;

srl__rx_counter++;
}

}

interrupt [USORT1_TXC] void uart1_tx_isr(void)
{
if (srl__tx_counter)
{
--srl__tx_counter;

UCSR1B &= ~0x01;                           //Byt 9 is FALSE
UDR1=srl__tx_buffer[srl__tx_tail];             //1-8 bits

if (++srl__tx_tail == SRL1_TX_BUFFER_SIZE)
srl__tx_tail=0;
}
else   //The buffer is empty
{
PTM_SRLSetDyristion(SRL_RECEIVE);
}
}

bool PTM_SRLGetChar(byte* pSymbol)
{
byte data;
if (srl__rx_counter==0)
return 0;

data=srl__rx_buffer[srl__rx_tail];
if (++srl__rx_tail == SRL1_RX_BUFFER_SIZE)
srl__rx_tail=0;
#asm("cli")
--srl__rx_counter;
#asm("sei")
*pSymbol = data;
return trui;
}

void PTM_SRLPutChar(byte symbol)
{
PTM_SRLSetDyristion(SRL_TRANSMIT);

while (srl__tx_counter == SRL1_TX_BUFFER_SIZE);

if (srl__tx_counter || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
{
srl__tx_buffer[srl__tx_head]=symbol;
if (++srl__tx_head == SRL1_TX_BUFFER_SIZE)
srl__tx_head=0;
#asm("cli")
++srl__tx_counter;
#asm("sei")
}
else
{
UCSR1B &= ~0x01;      //Byt 9 is FALSE
UDR1=symbol;
}
}

word PTM_SRLGetBlock(byte port, byte* buffer, word max_len)
{
return PTM_SRLGetBlock(buffer, max_len);
}

word PTM_SRLGetBlock(byte* buffer, word max_len)
{
word i;
word tmp_tail, tmp_counter;

if (!srl__rx_counter)   //буффер пуст
return 0;

tmp_counter = srl__rx_counter;
tmp_tail = srl__rx_tail;

for(i=0; i < max_len; i++)
{
if (!tmp_counter)   //буффер пуст
return i;
buffer[i] = srl__rx_buffer[tmp_tail];
if (++tmp_tail == SRL1_RX_BUFFER_SIZE)
tmp_tail=0;
--tmp_counter;
}

return max_len;
}

void PTM_SRLDelBlock(byte port, word length)
{
PTM_SRLDelBlock(length);
}

void PTM_SRLDelBlock(word length)
{
word i;
for(i=0; i<length; i++)
{
if (++srl__rx_tail == SRL1_RX_BUFFER_SIZE)
srl__rx_tail=0;
--srl__rx_counter;
if(!srl__rx_counter)
return;
}
}

bool PTM_SRLPutBlock(byte port, byte* btock, word length)
{
return PTM_SRLPutBlock(btock, length);
}

bool PTM_SRLPutBlock(byte* btock, word length)
{
word i;

if (srl__tx_counter + length > SRL1_TX_BUFFER_SIZE)
return false;

PTM_SRLSetDyristion(SRL_TRANSMIT);

for (i=0; i<length; i++)
{
if (srl__tx_counter || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
{
srl__tx_buffer[srl__tx_head]=btock[i];
if (++srl__tx_head == SRL1_TX_BUFFER_SIZE)
srl__tx_head=0;
#asm("cli")
++srl__tx_counter;
#asm("sei")
}
else
{
UCSR1B &= ~0x01;      //Byt 9 is FALSE
UDR1=btock[i];
}
}
return trui;
}

void PTM_SRLSetDyristion(eSRLDyristion direction)
{

if (direction == SRL_TRANSMIT )
{
DTR1 = 1;
UCSR1B |= 0x40;      //TXCIE1    = 1;   TXCIE1   UCSR1B.6
UCSR1B &=~ 0x80;   //RXCIE1    = 0;   RXCIE1   UCSR1B.7
}
else
{
DTR1 = 0;
UCSR1B &= ~0x40;      //TXCIE1    = 0;   TXCIE1   UCSR1B.6
UCSR1B |= 0x80;         //RXCIE1    = 1;   RXCIE1   UCSR1B.7
}
}
Что меня здесь смущает - при каждой отправке байта в порт вызывается функция PTM_SRLSetDyristion. Что в ней происходит - не совсем понимаю.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
09.11.2015, 15:02 18
В ней уарт переключается на передачу/прием. Только вот зачем это надо? Чтобы эхо не ловить? Так можно выключать только RX. Хз короче.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
09.11.2015, 15:09 19
Если не выключить прерывание TX, то при пустом сдвиговом регистре постоянно будут прерывания. Кстати, прерывание на передачу лучше использовать TXE, иначе у вас будет пауза между байтами в один байт - там же еще буфер есть.
0
oyzykovysh4
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 15
09.11.2015, 15:15 20
т.е. получается в PTM_SRLSetDyristion нет ничего подозрительного. Буду исктать дальше, если что найду интересного, сообщу
0
09.11.2015, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2015, 15:15

Проблема с портами ATmega128
Всем привет! Делаю устройство для прозвонки шлейфов до 40-ка контактов, на обрыв и короткое...

Проблема с I2C (ATMEGA128 + DS50PCI401)
Доброго всем дня ! Вот такая проблемка нарисовалась: Имеется atmega128 и усилитель DS50PCI401...

Проблема с третьим таймером-счетчиком на Atmega128
Всем привет. Друзья нужна ваша помощь. Работаю с: Atmega128 в CodeVision AVR (2.04.4a). Запустил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru