SerPort mit höheren Baud-Raten

  • 1
  • 2
  • Page 1 of 2
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 07:25  ·  #1
Hallo Rolf,

SerPort läßt sich im Programmkopf mit Define problemlos auf 921600 Baud einstellen und betreiben. Will man jedoch zur Laufzeit im Programmtext mit SerPort(921600); die Baudrate ändern, so führt das zur Compilerfehlermeldung 'Baudrate 150..300000 expected'.

Weiterhin kann ich die Prozedur SerPort_Send; nicht verwenden, sie gibt die Compilerfehlermeldung 'var or symbol expected'. Habe ich da etwas nicht berücksichtigt?

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

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 14:57  ·  #2
Hallo Michael,

921kBaud? Ist das realistisch?
SerPort_Send funktioniert nur mit der DTR Option. Ist diese implementiert?

rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 16:51  ·  #3
Hallo Rolf,

ja, das betreibe ich so seit 1 Jahr auf 5 Geräten mit DSR/DTR Handshake und 2 StopBits. Die Kommunikation läuft mit einem Lantronix XPort, der kann bis 921600 Bd.

Der Header sieht so aus:

Code

Device = mega2561, VCC=5;
...
Import SysTick, FAT16, RTclock, DCFclock, SerPort, LCDPort, TWIMaster;
...
Define
  ProcClock       = 14745600;       {Hertz}
  SysTick         = 10;             {msec}
...
  Serport         = 921600, Stop2; 
  SerPortDTR      = PinF, 0, Negative;
  SerPortDSR      = PortF, 1, Negative;
  RxBuffer        = 255, iData;     
  TxBuffer        = 255, iData;     


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

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 17:07  ·  #4
Hallo Michael,

wenn ich das richtig verstehe, hat das alles mal funktioniert, oder?
Ist das Problem mit dem letzten Update aufgetaucht?

Der Code Schnipsel hilft mir beim Debuggen nicht weiter. Ich brauche eine Mini App
die diese beiden Probleme aufzeigt.

rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 17:28  ·  #5
Hier erst mal ein Test-Programm. Der Compiler zeigt die Fehler dann auf.
Beide Funktionen (SerBaud und SerPort_Send) habe ich erst letzte Woche neu hinzu genommen. Ob sie früher funktioniert haben, kann ich nicht sagen. (Ich habe 4.97.0 und 4.97.8 getestet: beide NIO)

SerBaud(921600) wäre wichtiger, da ich jetzt die Baudraten zur Laufzeit umstellen muß.
Mit Define Serport = 921600; funktioniert die Baudrate, aber eben nur beim StartUp.


Code
program Test;
{$NOSHADOW}                                                                   // make this a comment, so that ALL registers get saved
{ $WG}                     {global Warnings off} // activate for error.list and unused variables
{ $W+}                                           // activate for error.list and unused variables
{$TYPEDCONST OFF}             // so können Typdefinitionen in Const weggelassen werden... naja

Device = mega2561, VCC=5;

Define_Fuses                                                                    // Fuses hier zur Dokumentation angegeben. Nicht angegeben = 1 = NICHT gesetzt
  Override_Fuses;                                                               // Das funktioniert nicht wie im Compiler-Handbuch auf S. 52 beschrieben
  LockBits0      = [];
  FuseBits0      = [SUT1];                                                      // CKSEL3..1 = 111 --> 16 MHz external oscillator
                                                                                // CKSEL0 = 1, SUT1..0 = 01 --> Crystal oscillator, BOD enabled
  FuseBits1      = [SPIEN, EESAVE];                                             // BOOTSZ1 --> Bootstart at WORD ADDRESS $F800, EESAVE --> EEPROM is preserved during a chip erase
  FuseBits2      = [BODLEVEL0,BODLEVEL2];                                       // Brown Out at 4.3V 0:1, 1:1, 2:0; 2.7V: 0:0, 1:1, 2:0
  ProgMode       = SPI;


Import SysTick, SerPort, RTClock;

From System  Import Float;

Define
  ProcClock       = 14745600;       {Hertz}
  SysTick         = 10;             {msec}

  StackSize       = $0100, iData;
  FrameSize       = $0200, iData;
  Serport         = 921600, Stop2;
  SerPortDTR      = PinF, 0, Negative;                                          // Input (CTS): Handshake from XPort to ATMega: Hi indicates ATMega STOP sending to XPort!
  SerPortDSR      = PortF, 1, Negative;                                         // Output(RTS): Handshake from ATMega to XPort: Hi indicates XPort STOP sending to ATMega!

  RxBuffer        = 254, iData;
  TxBuffer        = 254, iData;

  RTClock         = iData, DateTime;{Time, DateTime}
  RTCsource       = SysTick;


Implementation

{$IDATA}

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

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

Type

{--------------------------------------------------------------}



{$EEPROM}
                                                                                // Find the SerialNo at the end of the EEPROM!

{$IDATA}
{ Var Declarations }
Var
   IFPPower[@PortF,3] : Bit;

   DTR     [@PinF,  0] : Bit;                                          // Input (CTS): Handshake from XPort to ATMega: Hi indicates ATMega STOP sending to XPort!
   DSR     [@PortF, 1] : Bit;                                          // Output(RTS): Handshake from ATMega to XPort: Hi indicates XPort STOP sending to ATMega!

                                                                                // If RXBuffer is defined, it runs in Interrupt mode! Else in Polling mode
   RxBuff         : array[0..254] of byte;                                      // Große Puffer! Anpassen an SLIP_ReadStr...
   TxBuff         : array[0..254] of byte;
   RxPtr          : Pointer;
   TxPtr          : Pointer;


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


{--------------------------------------------------------------}
{ Main Program }
{$IDATA}




begin
                                                                                // PB0 = O /SS  SPI for MMC-Card
                                                                                // PB1 = O SCLK SPI for MMC-Card
                                                                                // PB2 = O MOSI SPI for MMC-Card
                                                                                // PB3 = I MISO SPI for MMC-Card
                                                                                // PB4 - PB7 = I direct fast Inputs via Optocoupler Input 17 - 24
   DDRB  := %00000111;                                                          // DDRx : 0 is Input, 1 is Output. If 0 = Input: then PortX = 1 activates the internal pullup
   PortB := %11111000;                                                          // All Outputs Lo, All Inputs with Pullup

                                                                                // PF0 = I CTS for controlling serial flow
                                                                                // PF1 = O RTS for controlling serial flow
                                                                                // PF2 = I from XPort CP2
                                                                                // PF3 = O Interface Platine IFP Power. 0 = IFP Off, 1 = IFP On.
                                                                                // PF4 - PF6 = I JTAG Interface, Not used
                                                                                // PF7 = I Analog Digital Converter input
   DDRF  := %00001010;                                                          // DDRx : 0 is Input, 1 is Output. If 0 = Input: then PortX = 1 activates the internal pullup
   PortF := %00000101;                                                          // All Outputs Lo, JTAGs and ADC PF7 no Pullup, CP2 and CTS with Pullup.

   mDelay(100);
   IFPPower := 1;                                                               // Do this late!
   mDelay(100);

   EnableInts;

   SerBaud(300000); // Geht

   SerPort_Send;    // Geht nicht
   
   SerBaud(921600); // Geht nicht
   
   
   loop

   endloop;
{ $DEPHASE}
end Test.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 15.02.2010 - 18:02  ·  #6
Hallo Michael.
Das mit dem SerPort_Send hat sich geklärt. Ich hatte das auf "SerPort_Send1" geändert
ohne das "SerPort_Send" weiter zuzulassen. Verwenden Sie vorläufig das SrPort_Send1
bis auch das alte beim nächsten Update wieder tut.

Die SerBaud Funktion ist jetzt auch auf 1MBaud erweitert.

rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 18.02.2010 - 10:45  ·  #7
Hallo Rolf,

ja, SerBaud(921600) läuft jetzt korrekt. Danke!
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: SerPort mit höheren Baud-Raten

 · 
Posted: 05.05.2012 - 10:35  ·  #8
Hallo Rolf,

mir ist aufgefallen, daß wenn man zur Laufzeit die Funktion SerBaud1 nicht mit einem festen Wert aufruft, sondern mit einer LongWord-Variablen, daß dann Werte größer 57600 Baud sich nicht einstellen lassen. (Werte größer ein Word)

Ich habe dann in der Doku gesehen, daß in der Funktion SerBaud( byte..longword) nur für "const" Werte definiert sind. Blöd ist nur, daß der Compiler ohne zu klagen eine Longword-Variable akzeptiert und Serbaud dann falsch setzt. Da hätte ich dann wenigstens eine Fehlermeldung wie "Word expected" erwartet - oder besser, daß man auch mit Longword Variablen die Baudrate > 65535 setzen kann..

Was meinen Sie?

Gruß, Michael

Beispiel:
[code]
...
Var
   lLw : LongWord;
Begin
   SerBaud1(57600);   // geht
...
   SerBaud1(115200); // geht
...
   lLw := 57600;
   SerBaud1(lLW);     // geht;
 ...
   lLw := 115200;
   SerBaud1(lLW);     // geht NICHT;
  
[/code]
  • 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: 15 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.025294s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI