Frage zum SLIP mit Adr. CheckSum und Handshake

  • 1
  • 2
  • Page 1 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 09.04.2016 - 01:35  ·  #1
Hallo Leute,

ich habe mich Heute mal mit dem SLIP und den ATMEGA1284P beschäftigt und hänge aber gerade an einen Punkt fest.

Wenn ich das SLIP mit Adr., CheckSum nutze ist alles gut ;)

Aber ich möchte gerne den Handshake mit TimeOut nutzen um im Fehlerfall (keine Antwort oder Leitung unterbrochen) einen Fehler anzuzeigen.

Wie läuft das mit dem Handshake beim SLIP, macht das der Treiber alleine? Oder muss ich ein Ackn selbst senden? Wenn ja welches Steuerzeichen? Im Handbuch habe ich dazu nichts genaues gefunden. Und ein Versuch mit dem AVR_Slip_PC und dem DualTerminal hat leider keinen Erfolg gebracht.

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 09.04.2016 - 18:18  ·  #2
Hallo Thorsten,

der SLIP schickt selbstständig das ACK.
Das bedeutet natürlich nicht dass der Empfänger die Message schon verarbeitet hat.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 09.04.2016 - 19:55  ·  #3
Quote by rh

Hallo Thorsten,

der SLIP schickt selbstständig das ACK.
Das bedeutet natürlich nicht dass der Empfänger die Message schon verarbeitet hat.

rolf


OK, dann stimmt da was nicht. Ich sende mit Adr, Cecksum. und Handshake vom Dualterminal, aber am ATEMAGA kommt nichts an. Ich lasse Heute Abend mal ein Analyser mitlaufen. Für mich sieht es so aus, als ob das Ackn nicht gesendet wird.

Gruß
Thorsten
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 766
Registered: 06 / 2013
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 11.04.2016 - 14:07  ·  #4
Hallo, bei dem Slip bin ich auch gerade dran.
Dazu teste ich mein Code im Debugger/Emulator

Dabei wird diese Zeile nicht wirklich ausgeführt. Also senden zu einer anderen Platine. (uC)
Repeat
Until SLIPstartTxC_D0(9);

Gibts da ein schalter den man setzten muss oder geht das nicht im Debugger Modus


Gruß Frank
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 11.04.2016 - 14:26  ·  #5
Hallo Frank,

bei den XMegas mit den komplexen Peripherals kann der SIM nicht alles
simulieren. Warum nicht das PDI-ICE benutzen. Das ist das wahre Leben
:3some:

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 11.04.2016 - 14:30  ·  #6
Quote by rh

Hallo Thorsten,

der SLIP schickt selbstständig das ACK.
Das bedeutet natürlich nicht dass der Empfänger die Message schon verarbeitet hat.

rolf


Hallo rolf,

evtl. habe ich ja einen Denkfehler.

Ich habe mal das SLIP_PC Demo Programm etwas mit Debug-Ausgaben angepasst.

Normalerweise übernimmt doch der PC automatisch die Adresse 0 (Dualterminal) und mit dem SET im Dualterminal stelle ich die Empfangsadresse ein oder?

Code
  SLIPsetMode2([slpAddr, slpHsk, slpChkS]);    // combine several modes
  SLIPsetTimeOut2(100);                         // timeout used for handshake
  SLIPsetTxAddr2(01);                 // for the address mode
  SLIPsetRxAddr2(02);                 // eigene Adresse


Also sollte doch der ATMEGA-Treiber in den TimeOut laufen, da ich die Sendeadresse auf 1 gesetzt habe.

Ich sende einen Text vom Dualterminal an Adresse 2 (Atmega), dieser empfängt den Text, schreibt ihn in den Sendepuffer und sendet es an Adresse 1. Da diese aber nicht existiert müsste der Treiber doch in den TimeOut laufen?

macht er aber nicht, er meldet immer SLIPready.

Hier mein Test-Code:
Code
program MainSlip1284;

{$NOSHADOW}
//{$NOWATCHDOGAUTO} // zum Test rausnehmen
{ $WG}                     {global Warnings off}

Device = mega1284P, VCC=5;
{ $BOOTRST $0F000}         {Reset Jump to $0F000}

Define_Fuses
  Override_Fuses;
  NoteBook       =  E;
  COMport        = USB;
  LockBits0      =  [];
  FuseBits0      =  [];
  FuseBits1      = [SPIEN, JTAGEN, OCDEN];
  ProgMode       =  JTAG;
  ProgFlash = true; // or false – program Flash
  ProgEEprom= true; // or false – program EEprom
  AutoRelease    = true; // or false – Release Target    // Wichtig für Programmierung über UPP !!

Import SysTick,SerPort, WatchDog, SLIPport2, SysLEDblink;


From System Import LEDmessage, LongWord, Int64, Fix64, Float, FlashOnce;



Define
  ProcClock      = 14745600;       {Hertz}
  SysTick        = 10;             {msec}
  WatchDog       = msec2000;         {presc = 7}
  StackSize      = 1024, iData;
  FrameSize      = 2048, iData;

//Serport1
  SerPort        = 19200, Stop1;    {Baud, StopBits|Parity}
  RxBuffer       = 064, iData;
  TxBuffer       = 064, iData;
  
// Serport 2 RS485
  SLIPport2      = 19200;
  SLIPportCtrl2 = PortB, 2, positive; // optional RS485 line driver control

 // SysLed
//SysLEDblink = 30; {30*SysTick = 300msec}
// alternative
SysLEDblink = mSec500; {10..1000 msec}
SysLEDBlink0 = PortD, 4, low; // LED OK
{SysLEDBlink1 = PortD, 5, low; // LED COM}
SysLEDBlink2 = PortD, 6, low; // LED RUN
SysLEDBlink3 = PortD, 7, low; // LED Err

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  RxBuff         : array[0..31] of byte;
  TxBuff         : array[0..31] of byte;
  TxResult       : tSLIPstate;
  RxResult       : tSLIPstate;

  cnt, idx       : word;
  
  OUT_LED_COM          [@PortD, 5 ] : bit;
  OUT_RSEnable         [@PortB, 2 ] : bit;
  strOut               : String[100];

// Zyklus Steuerung
  COMZyklus      : integer;
  IOZyklus       : integer;
  DebugZyklus       : integer;
  ADZyklus          : integer;
  FlashStartZyklus  : integer;
  ErrorZyklus       : integer;
  WarteZyklus       : integer;

{--------------------------------------------------------------}
{ functions }

{--------------------------------------------------------------}
procedure DebugOut( OutStr : String[100] );
begin
// if ConfigDip.Debug then
  WriteLn(serout1, OutStr);
// endif;
end; //Ende Debug Out

procedure DebugPrinting;
begin
 DebugZyklus:= DebugZyklus+1;
 // nur alle 6000mal abfragen
 if DebugZyklus >= 6000 then
  DebugZyklus:=0;

    DebugOut('--------------------------------'  );


  endif; // Ende DebugZyklus
end; // ENDE



procedure InitPorts;
begin

// INIT Werte IOs

//DDRA:= %00001111;
//DDRF.4:= 1;
// INIT PULLUP
//PORTA:= %00001111;
//PORTF.4:=0;

//OUT_LED_OK
 PortD.4:= 1; //Pullup
 DDRD.4:= 1;  // 0=EINGANG  1=Ausgang

//OUT_LED_COM
 PortD.5:= 1; //Pullup
 DDRD.5:= 1;  // 0=EINGANG  1=Ausgang

//OUT_LED_RUN
 PortD.6:= 1; //Pullup
 DDRD.6:= 1;  // 0=EINGANG  1=Ausgang

//OUT_LED_ERR
 PortD.7:= 1; //Pullup
 DDRD.7:= 1;  // 0=EINGANG  1=Ausgang

//OUT_RESET_OUT
 PortB.3:= 1; //Pullup
 DDRB.3:= 1;  // 0=EINGANG  1=Ausgang


end InitPorts;


procedure COMLED;
begin
 //OUT_LED_COM:= NOT( OUT_RSEnable );
  Toggle(OUT_LED_COM);
//  OUT_LED_COM:= SerStat2;

end; // ENDE LED COM

function CheckState( InStatus : tSLIPstate ) :tSLIPstate ;
begin
 if  InStatus = SLIPidle then
   DebugOut('COM: Idle');
 elsif InStatus = SLIPready then
   DebugOut('COM: SLIPready');
 elsif InStatus = SLIPbusy then
  // DebugOut('COM: SLIPbusy');
 elsif InStatus = SLIPovr then
   DebugOut('COM: SLIPovr');
 elsif InStatus = SLIPtout then
   DebugOut('COM: SLIPtout');
 elsif InStatus = SLIPfrm then
   DebugOut('COM: SLIPfrm');
 elsif InStatus = SLIPchkE then
   DebugOut('COM: SLIPchkE');
 endif;
 return( InStatus );
end; // ENDE LED COM



{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
 //WatchDogStart;




  // fill the Tx buffer with some data
  TxBuff[0]:= $41;
  TxBuff[1]:= $42;
  TxBuff[2]:= $43;
  TxBuff[3]:= $44;
  TxBuff[4]:= $45;
  TxBuff[5]:= $46;
  TxBuff[6]:= $47;
  TxBuff[7]:= $48;
  TxBuff[8]:= $49;

  SLIPsetTxAddr2(01);                 // for the address mode
  SLIPsetRxAddr2(02);                 // eigene Adresse

//  SLIPsetMode2([]);
//  SLIPsetMode2([slpAddr]);
//  SLIPsetMode2([slpHsk]);
//  SLIPsetMode2([slpChkS]);
//  SLIPsetMode2([slpAddr, slpHsk]);
//  SLIPsetMode2([slpAddr, slpChkS]);
//  SLIPsetMode2([slpHsk, slpChkS]);
  SLIPsetMode2([slpAddr, slpHsk, slpChkS]);    // combine several modes
  SLIPsetTimeOut2(100);                         // timeout used for handshake

  SLIPsetRxBuffer2(@RxBuff, sizeOf(RxBuff));
  SLIPsetTxBuffer2(@TxBuff, 9);

  EnableInts;

 DebugOut('Starte..');
 DebugOut('------------------');
 DebugOut('');
 DebugOut('Init..');
  InitPorts;
 DebugOut('Init..Ende');

  loop
    repeat
    until SLIPresumeRx2;    // Starte Empfang....
    // receive a frame
    repeat
      //RxResult:= SLIPgetRxState2;
       RxResult:= CheckState( SLIPgetRxState2);
       
    until RxResult <> SLIPbusy;
    if RxResult = SLIPready then
      if SLIPwasBC2 then
         DebugOut('BroagCast Message empfangen..');// BeepOut(800, 2);
      else
       DebugOut('Daten wurden empfangen');// BeepClick;
      endif;
      // process the received data or the error
      cnt:= SLIPgetRxCount2;
      strOut:= '';
      
      for idx:= 0 to cnt -1 do
        TxBuff[idx]:= RxBuff[idx];
        strOut:=StrOut+Char( RxBuff[idx]);
      endfor;
       COMLED;
       DebugOut('4..: '+strOut);
      // ....
      // ....
    else
     DebugOut('Not Ready..');// BeepSiren(0, 1);
       CheckState( SLIPgetRxState2);
     
    endif;

    if RxResult = SLIPready then
     DebugOut('Daten zurücksenden...');// BeepClick;
      repeat
      until SLIPstartTxC2(cnt) ;
      // transmit a frame
      repeat
        //TxResult:= SLIPgetTxState2;
        TxResult:= CheckState( SLIPgetRxState2);
      until TxResult <> SLIPbusy;
       CheckState( SLIPgetRxState2);
      
      if TxResult <> SLIPready then
       DebugOut('2..');// BeepOut(800, 10);
       elsif TxResult = SLIPtout Then
        DebugOut('TimeOut....');// BeepOut(800, 10);
      else
       COMLED;
         DebugOut('3..und nun');//   BeepClick;
      endif;
      
    endif;
    
 //  WatchDogTrig;
  DebugPrinting;
  
  endloop;
end MainSlip1284.



Gruss
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 11.04.2016 - 15:01  ·  #7
Hallo Thorsten,

ich habe schon seit Jahren nichts mehr mit dem SLIP gemacht. Ist für mich
jetzt auch wieder Neuland. Auf jeden Fall ist die RxAddresse "0" illegal.
Sie kann nur im Tx verwendet werden und hier bedeutet sie "broadcast".
Niemand antwortet auf eine broadcast, es kann auch keinen ACK geben.
Nur mal zur Klarstellung.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Frage zum SLIP mit Adr. CheckSum und Handshake

 · 
Posted: 11.04.2016 - 15:20  ·  #8
Quote by rh

Hallo Thorsten,

ich habe schon seit Jahren nichts mehr mit dem SLIP gemacht. Ist für mich
jetzt auch wieder Neuland. Auf jeden Fall ist die RxAddresse "0" illegal.
Sie kann nur im Tx verwendet werden und hier bedeutet sie "broadcast".
Niemand antwortet auf eine broadcast, es kann auch keinen ACK geben.
Nur mal zur Klarstellung.

rolf


Hallo rolf,

jetzt bin ich verwirrt....

Hier ein Auszug aus Deinem Handbuch Seite 150:
Quote
4. Mit Adresse. Damit kann ein single-Master/multi-Slave Netzwerk z.B. auf RS485 Basis aufgebaut
werden. Der Sender-Treiber schickt als erstes Byte im Packet die Adresse des gewünschten Slaves. Die
Empfangs-Treiber aller Slaves lesen das Packet mit und wenn die Adresse mit ihrer internen Adresse
übereinstimmt, wird das Packet ausgewertet, andernfalls wird es verworfen. Es sind 190 Adressen
möglich. Die Adresse 0 sollte für den Master reserviert sein. Die Adressen 190..254 sind für interne
Zwecke reserviert und dürfen nicht benutzt werden. Die Adresse 255 ist die Broadcast Adresse die von
allen Slaves ausgewertet wird aber niemals mit einem Acknowledge beantwortet wird.


Und nun?

Und welche Adresse hat dann das DualTerminal wenn nicht 0???

Gruß
Thorsten
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   141   155 · Page-Gen-Time: 0.047604s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI