|
2 USART под RS485 на ATMega162 |
|
|
|
Mar 15 2009, 20:31
|
Группа: Новичок
Сообщений: 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...
|
|
|
|
|
 |
Ответов
|
Mar 15 2009, 21:31
|
Группа: Новичок
Сообщений: 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") } }
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|