Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Ехо при RS232 комуникация
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9316
Страница 1 от 1

Автор:  amdatlon [ Съб Сеп 03, 2011 9:00 pm ]
Заглавие:  Ехо при RS232 комуникация

Здравейте,
Постановката е следната:
Pic 18F6722 , на 32Mhz( 8Mhz кварц и PLL4) , си "приказва" със външно устройство чрез серийна комуникация .
Външното устройство има една линия за комуникация ( двупосочна)
, интерфейса м/у пик-а и у-вото е МC33290( ISO K Line Serial Link Interface)

Протокола е : Пик-а запитва ( чрез 1 байт ) - у-вото отговаря с един байт , и така до безкрай :)

Проблема ми е : Получава се ехо . Пик-а праща един байт ( примерно 0xFE ) и преминава в към други задачи , като при постъпване на отговор влиза в прекъсване и го прочита. Първия прочетен байт от Пик-а е пак 0xFE и чак след него пристига това което е пратено от външното у-во ( применро 0xЕ5)


Предишната версия на платката беше със 18F458 и със същия итерфейс за връзка , но такова ехо не съм имал. Пращах един байт и прочитах един байт.
Но там не ползвах прекъсване за четенето на отговора и процедирах така : пращам запитването и започва изчакване определено време за отговор.

Проблема за сега съм го изолирал с двойно четене на отговора от у-вото : първия път чета ехото и после това което ми трябва.

Но не ми се вижда добро решение, за това ако някой има идея защо се получава така ще бъда Благодарен за помоща :)

Използвам PIC CCS компилатор , ако е нужно ще пусна и код !

Автор:  ike [ Съб Сеп 03, 2011 11:18 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

amdatlon написа:
Но не ми се вижда добро решение, за това ако някой има идея защо се получава така ще бъда Благодарен за помоща :)


Дай ми платката и ще я свържа към моя компютър, за да видя дали външното устройство връща ехо. Ако е така, значи проблема е във външното устройство, а ако не е така, значи проблема е във вътрешното устройство.

Автор:  amdatlon [ Нед Сеп 04, 2011 12:49 am ]
Заглавие:  Re: Ехо при RS232 комуникация

Забравих да спомена че също съм направил симулатор на външното у-во , на компа си . От там със един USB -> RS232 , който е на база FT232RL , отива към ПИК-а .
Наблюдавам трансфера на данни с PortMonNT .
Проблема със сигурност не във външното у-во , то комп на кола :)
ECU .

Най вероятно ехото е от Пик-а и програмата ( и по точно използването на прекъсване за четене на данните ) , тъй като с другия Пик и същите останали компоненти няма ехо !?!

Автор:  bateAz [ Нед Сеп 04, 2011 10:36 am ]
Заглавие:  Re: Ехо при RS232 комуникация

Според мен ще има ехо. Не ми е ясно само защо на предишната платка с PIC18F458 не си имал. Явно там нещо си объркал ...

Автор:  amdatlon [ Нед Сеп 04, 2011 11:31 am ]
Заглавие:  Re: Ехо при RS232 комуникация

bateAz написа:
Според мен ще има ехо. Не ми е ясно само защо на предишната платка с PIC18F458 не си имал. Явно там нещо си объркал ...

Значи да не си блъскам главата повече , явно е нормално :)

Ами и аз се чудя защо на предишната платка нямаше ехо?
То буквално платката и сега е същата , новия пик съм го присадил на мястото на стария ( за тестовете) , и даже сорс кода 99 % е същия . Разликата е само наличието на прекъсване за четене на RS232 канала .

Преди с PIC18F458 си бачкаше нормално, но ми отесня от към програмна памет :P

Автор:  RM [ Нед Сеп 04, 2011 12:44 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

Тва май не е никакво ехо. Най намирисва на объркан софт. Тва че четеш последния изпратен байт и след това четеш върнатия ... виж си буферите ... дали в памета изпрашашия и приемащия буфер не са един след друг и първия да не е терминиран ... Ехо-то е друго , но още не съм срещал хардуерно ехо 8O . Срещал съм устройсва на които ехото може да се изключва, но се прави в програмата.

Автор:  itso.t [ Нед Сеп 04, 2011 1:03 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

Проблемът е "хардуерен" ако може така да се изразя. K-line интерфейсът, обединява RX и TX в обща шина. Каквото изпратиш по TX се получава директно на RX.

Автор:  amdatlon [ Нед Сеп 04, 2011 1:07 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

E то най вероятно е софта ама какво бъркам , не мога да разбера.
Ползвам стандартен начин за обработка на данните ( CCS ) , не пипам директно паметта.
Последно опростих сорса само за комуникация но проблема остава:

Пълни се буфер при всяко прекъсване и после се чете от него .
Буфера изглежда така

[FE] [E5] [FF] [0C]...........[ ]

Ето кода , тук работи защото чета първо ехото и после нужното.
T.e. мога да чета буфера през една клетка като пропускам ехото , но проблема че го има остава .
Код:
#include <18F6722.h>
#device PASS_STRINGS=IN_RAM   

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or 
#FUSES NOPUT
#FUSES H4
#FUSES NOXINST                  //Extended set extension and Indexed

#use delay(clock=32M )
#use rs232(baud=15625,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8  ,Errors)

#include "ks0108.c"
#include "graphics.c"


//***********************  DEFINE ***********************************/
//*******************************************************************/
#byte pA   =0xF80   //port a   //
#byte pB   =0xF81   //b         //
#byte pC   =0xF82   //c         //
#byte pD   =0xF83   //d         //
#byte pE   =0xF84   //port e   //
#byte pF   =0xF85   //port e   //
#byte pG   =0xF86   //port e   //
// *********************************


#Define  SetConfigPortA     9//100011  //33  100001
#Define  SetConfigPortB     240//255  11110010
#Define  SetConfigPortC    196//1000100 196//196//bx 11000100
#Define  SetConfigPortD     0
#Define  SetConfigPortE     0
#Define  SetConfigPortF     0
#Define  SetConfigPortG     0
//**************************************************


#bit IngSwitch=             pB.4
#bit UPButton=              pB.5
#bit DOWNButton=            pB.6
#bit MENUButton=            pB.7

#bit Led=                   pE.6
#bit LCD_Power=             pF.7     



  #define BUFFER_SIZE 32

BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;       

#define bkbhit (next_in!=next_out)   
     
       
//***********************************
#int_rda
void serial_isr() {
   int8 t;

   buffer[next_in]=getc();
   t=next_in;
  if (++next_in ==BUFFER_SIZE){ next_in=0; }

  if(next_in==next_out)
     next_in=t;           // Buffer full !!
     
}
//************************************

//***********************************
int WaitComGetc( ) {
   BYTE c;
   int16 count=10000;

   while((!bkbhit  )  ) ;
   
   
   c=buffer[next_out];

   if (++next_out ==BUFFER_SIZE)
       {
          next_out=0;
       }
   return(c);
}
//***********************************


//***********************************
void send_break(int16 time_ms)
{
// Disable the UART and send a Break
// for the specified time.
setup_uart(FALSE);
output_low(PIN_C6);
delay_ms(time_ms);

// Re-enable the UART.
setup_uart(TRUE);
set_uart_speed(15625);
}
//***********************************


//*********************************************************************
//Start initialization
void StartInit(void)
{
    int    tempBuff;
  Delay_ms(70);
     // Инициализациа със Break signal
  send_break(1800);
  Delay_ms(200);
  delay_ms(1000);


  putc (0xFE );    // Запитване
   
  //  Тук tempBuff =0xFE -Това е първия прочетен байт (ехо )         
   tempBuff=WaitComGetc( );

  // Тук tempBuff =0xE5  -Това е Вярния отговор
     tempBuff=WaitComGetc( );

  if (tempBuff==0xE5)
           
      {
        delay_ms(5 );
         putc (0xFF );  // Второ запитване
                 
        WaitComGetc( );   // tempBuff =0xFF  -Тук пак ехо
                 
               // tempBuff =0x0C - Тук пак верния байт от  PC       
        if (WaitComGetc( )==0x0C) 
                 
                   {
                   
                  ShowMessage("Connecton OK",1,1,1000,1);
                 
                 
                   }
                 else
                {
                     ShowMessage("Wrong Reply",1,1,1000,1);
                }
                   
                   While((UPButton!=0) && (DOWNButton!=0) && (MENUButton!=0))
                  {  Delay_ms(10);  }
   
                   
                   
                   
                   
              }
}//**********************************************************



Void MAIN (){
         char Message[21];
     
     set_tris_b(SetConfigPortB);
     set_tris_a(SetConfigPortA);
     set_tris_d(SetConfigPortD);
     set_tris_e(SetConfigPortE);
     set_tris_f(SetConfigPortF);
     set_tris_g(SetConfigPortG);

//LCD Init
     
      delay_ms(20 );
      Glcd_init(on);   
      delay_ms(20 );

      glcd_fillScreen(off);
  //LCD Init       

       delay_ms(500 );

       enable_interrupts(INT_RDA);  // turn on interrupts
       enable_interrupts(GLOBAL);
       

While(true)
{
     
             StartInit();
     
   }
   
} //End******   




Автор:  amdatlon [ Нед Сеп 04, 2011 1:20 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

itso.t написа:
Проблемът е "хардуерен" ако може така да се изразя. K-line интерфейсът, обединява RX и TX в обща шина. Каквото изпратиш по TX се получава директно на RX.

Това го забелязах от страна на PC-то като писах симулатора, там си има ехо и до колкото разбрах е нормално за този интерфейс , но не мислех че и от към ПИК-а е така :?

Автор:  Cekins [ Нед Сеп 04, 2011 6:18 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

Ами то няма как да нямаш ехо ако RX и TX са обединени. И понеже приемника работи независимо от предавателя, така квото пратиш дирекшън ти влиза в RX-а и на стоп бита си генерира прекъсване :). И тъй като преди не си ползвал прекъсването (а то се генерира точно когато свърши предаването) просто си "изтървал" ехото.

Автор:  amdatlon [ Нед Сеп 04, 2011 8:15 pm ]
Заглавие:  Re: Ехо при RS232 комуникация

Благодаря на всички за разясненията :)
явно така ще да е работата .
Явно съм останал с убеждението че ISO k-line драйвера разделя Rx и Tx ( да са независими ) от ПИК-а до него .
Но май бъркам :oops:

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/