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