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

 
 
> 2 USART под RS485 на ATMega162
vetalxh
сообщение Mar 15 2009, 20:31
Сообщение #1





Группа: Новичок
Сообщений: 13
Регистрация: 28-06-08
Пользователь №: 38 608



Здравия желаю всем !

Делаю устройство на Mega162 с двумя протоколами modbus.
USART0 - master, посылает всего 11 разных запросов. USART1 - slave, отвечает на эти 11 запросов с некоторыми корректировками. То есть устройство устанавливается между master и slave и общается с ними с нужными мне исправлениями.

В общем, сделал отдельно master и slave - работает, но когда все в целом, то работает только slave, а master зацикливается на 1-й посылке, иногда 2-я проскакивает.

Вроде проблема с прерываниями, т.к. slave постоянно принимает и отвечает, и не дает master работать. Игрался с запретом прерываний, но ничего не помогло.

Также делал чтобы slave принял, ответил, а потом master послал, принял, поочередно, но так теряется слейвом фреймы.

У кого могут быть какие идеи? Такое устройство возможно ли вообще?

Мега162, кварц - 3,6864... Параметры связи обоих 2400-О-1...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vetalxh
сообщение Mar 15 2009, 21:31
Сообщение #2





Группа: Новичок
Сообщений: 13
Регистрация: 28-06-08
Пользователь №: 38 608



Кода вообще много... Постараюсь основное. Сильно не пинайте, т.к. учусь уму разуму...
Это один из вариантов. Но не один из них корректно не работает


CODE
void StartTrans0(void)
{
DisableReceive0;
SetBit(PORTA,1);
TrCount0=0;
GoTrans0;
}

void StartTrans1(void)
{
SetBit(PORTA,0);
TrCount1=0;
GoTrans1;
}


interrupt [USART0_DRE] void usart0_udre_isr(void)
{
if (TrCount0<cNumTrByte0-1)
{
UDR0=cmTrBuf0[TrCount0];
TrCount0++;
}
else
{
UDR0=cmTrBuf0[cNumTrByte0-1];
StopTrans0;
TrCount0=0;
FinTrans=1;
}
}

interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if (TrCount0<cNumTrByte0-1)
{
StopTrans0;
FinTrans=1;
ClrBit(PORTA,1);
EnableReceive0;
}

interrupt [USART0_RXC] void usart0_rx_isr(void) // USART0 I?a?uaaiea i?eaiieea IANOA?A
{
char status;
status=UCSR0A;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if (StartRec0==0)
{
StartRec0=1;
RcCount0=0;
cmRcBuf0[RcCount0++]=UDR0;
TCCR1B=0x05;
TCNT1H=0xFF;
TCNT1L=0xEA;
}
else
{
cmRcBuf0[RcCount0++]=UDR0;
TCNT1H=0xFF;
TCNT1L=0xEA;
}
}
}

interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if (StartRec1==0)
{
StartRec1=1;
RcCount1=0;
cmRcBuf1[RcCount1++]=data;
TCNT0=0xE9;
TCCR0=0x05;
}
else
{
if (RcCount1<MaxLenghtRecBuf1)
{
cmRcBuf1[RcCount1++]=data;
}
else
{
cmRcBuf1[MaxLenghtRecBuf1-1]=data;
}
TCNT0=0xE9;
}
}
}

interrupt [USART1_DRE] void usart1_udre_isr(void) // USART1 I?a?uaaiea ia?aaao?eea IIA?EIAIIIAI
{
if (TrCount1<cNumTrByte1+1)
{
UDR1=cmTrBuf1[TrCount1];
TrCount1++;
}
else
{
StopTrans1;
//ClrBit(DDRA,0);
ClrBit(PORTA,0); //PA0 a 0 - ?aaioa a?aeaa?a 485 ia i?eai
//EnableReceive1;
TrCount1=0;
}
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

if (StartRec1==1)
{
StartRec1=0;
cNumRcByte1=RcCount1;
bModBus1=1;
TCCR0=0;
}
}

char ModBus0 (void)
{
int TempI;
if (cmRcBuf0[0]==0x01 && cmRcBuf0[1]==0x03 && cmRcBuf0[2]==0x02)
{
...
}
}

char ModBus2 (void)
{
switch (ModFlag)
{
case (1):
{
...
}
}
}


interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if (StartRec0==1)
{
StartRec0=0;
cNumRcByte0=RcCount0;
bModBus0=1;
TCCR1B=0x00;
DisableReceive0;
}
else
{
TCCR1B=0x00;
TCNT2=0x00;
TCCR2=0x07;
DisableReceive0;
}
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TrCount0=0;
cNumTrByte0=ModBus2();
StartTrans0();
TCCR2=0x00;
}

char ModBus1 (char NumByte)
{
...
}
}


void main(void)
{
Setup();
StartUART0();
StartUART1();
SetBit(DDRD,0);SetBit(PORTD,0);
ClrBit(DDRD,1);ClrBit(PORTD,1);
SetBit(PORTA,1);
ClrBit(DDRB,2);ClrBit(PORTB,2);
SetBit(DDRB,3);SetBit(PORTB,3);
EnableReceive1;
ClrBit(PORTA,0);
TCCR2=0x07;
TCNT2=0x00;
#asm("sei")
while (1)
{
#asm("cli")
if (bModBus0==1)
{
ModBus0();
bModBus0=0;
TCNT2=0x00;
TCCR2=0x07;
}
if (bModBus1==1)
{
cNumTrByte1=ModBus1(cNumRcByte1);
if (cNumTrByte1!=0) StartTrans1();
bModBus1=0;
}
#asm("sei")
}
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vetalxh   2 USART под RS485 на ATMega162   Mar 15 2009, 20:31
- - smac   Цитата(vetalxh @ Mar 15 2009, 23:31) ... ...   Mar 15 2009, 21:09
|- - vetalxh   Цитата(smac @ Mar 16 2009, 01:09) Устройс...   Mar 15 2009, 22:38
- - sensor_ua   Не разбирался, но взглянул. Заметил такое: выключе...   Mar 15 2009, 22:43
|- - vetalxh   1) С работой слейва проблем не возникало. Смотрю м...   Mar 15 2009, 22:57
- - Огурцов   Цитата(vetalxh @ Mar 15 2009, 20:31) Врод...   Mar 15 2009, 23:06
- - sensor_ua   ЦитатаВопрос с 3.5 задержкой связан с готовым устр...   Mar 15 2009, 23:06
- - vetalxh   sensor_ua, спасибо, буду думать... А можно по-подр...   Mar 15 2009, 23:42
|- - Огурцов   Организуйте прерывание от таймера и проверяйте в н...   Mar 15 2009, 23:51
|- - vetalxh   Цитата(Огурцов @ Mar 16 2009, 03:51) Орга...   Mar 16 2009, 00:11
|- - vetalxh   В прерывании таймера проверять оба уарта? А если п...   Mar 16 2009, 09:08
|- - smac   Цитата(vetalxh @ Mar 16 2009, 12:08) В пр...   Mar 16 2009, 19:37
|- - vetalxh   Короче, думал-думал...Решил обойти все это еще одн...   Mar 16 2009, 22:26
- - defunct   Цитата(vetalxh @ Mar 15 2009, 22:31) У ко...   Mar 17 2009, 00:19
|- - vetalxh   Цитата(defunct @ Mar 17 2009, 03:19) А ка...   Mar 17 2009, 08:15
||- - Палыч   Цитата(vetalxh @ Mar 17 2009, 11:15) И во...   Mar 17 2009, 08:52
||- - vetalxh   Цитата(Палыч @ Mar 17 2009, 11:52) Очень ...   Mar 17 2009, 10:47
|- - _Pasha   Цитата(defunct @ Mar 17 2009, 04:19) для ...   Mar 17 2009, 08:43
- - sitafern   Цитата(vetalxh @ Mar 15 2009, 22:31) Здра...   Mar 22 2009, 10:13
|- - _Pasha   Цитата(sitafern @ Mar 22 2009, 14:13) Есл...   Mar 22 2009, 12:44
|- - vetalxh   Цитата(_Pasha @ Mar 22 2009, 15:44) Недав...   Mar 22 2009, 16:41
- - vetalxh   Утройство сделал. Даже хватило кварца на 3,6864......   Mar 22 2009, 20:17


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

 


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


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