Fehler im Compiler 4.99.42 ??

CHR(xx)

wom
 
Avatar
 
Subject:

Fehler im Compiler 4.99.42 ??

 · 
Posted: 11.07.2011 - 16:13  ·  #1
hallo rh,

in der neuen version 4.99.42 bekomme ich einen fehler bei volgender programmzeile

cx:=cx+48;
CASC[cy]:=Char(cx);

wenn cx:=1 dann ist das ergebniss in CASC[] nicht wie zu erwarten '1' sondern $01. Dies ist in der version 4.99.41 nicht der fall. hier erscheint bei cx:=1 auch '1' = $30 in der entsprechenden zelle.

der weiteren ist mir aufgefallen, dass bei der ersten com1 diese auch arbeitet wenn interrupt nicht enabled nicht aber die com2. wenn man interrupt enebeld dann arbeiten beide. dies ist verwirrend wenn man eine fehler sucht und mit beiden com1 und com2 arbeitet. da fällt der fehler nicht auf. besser währe, wenn beide com sich gleich verhalten würden.

gruß
wom
Thomas
Benutzer
Avatar
Gender:
Location: Gera
Age: 61
Posts: 123
Registered: 04 / 2003
Subject:

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 11.07.2011 - 17:24  ·  #2
hallo wom,

den Bug mit den Problem beim Cast nach Char hatte ich schon vor 2 Wochen an Rolf gemeldet und er hat ihn sofort gefixt. Den neuen Compiler hat er mir am 30.6. per Mail geschickt. Möglicherweise hat er vergessen, der Download auf der Webseite zu aktualisieren.

Mit SerPort gibt es einen ziemlich fiesen Bug.

benutz man
Code
  Import SysTick, SerPort, SerPort2;

  From System Import;
  
  Define
    ProcClock    = 8000000;                               //Interner Oszilator 8MHz
    SysTick      = 10;                                    //Systemtick 10ms
    StackSize    = $0040, iData;                          //64 Byte Stack
    FrameSize    = $0040, iData;                          //64 Byte Frame
    SerPort      = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    SerPort2     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer2    = 64,iData;                              //64 Byte mit Interrupt

dann ist alles ok.
Wenn man aber
Code
  Import SysTick, SerPort1, SerPort2;

  From System Import;
  
  Define
    ProcClock    = 8000000;                               //Interner Oszilator 8MHz
    SysTick      = 10;                                    //Systemtick 10ms
    StackSize    = $0040, iData;                          //64 Byte Stack
    FrameSize    = $0040, iData;                          //64 Byte Frame
    SerPort1     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    SerPort2     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
verwendet, dann wird die Puffergröße ignoriert und die Schnittstelle arbeitet ohne Puffer im Polling-Modus.
Der geht natürlich auch bei gesperrtem Interrupt.
Möglicherweise werden "RxBuffer1" und "TxBuffer1" nicht als Schlüsselworte erkannt.
Mit
Code
  Import SysTick, SerPort1, SerPort2;

  From System Import;
  
  Define
    ProcClock    = 8000000;                               //Interner Oszilator 8MHz
    SysTick      = 10;                                    //Systemtick 10ms
    StackSize    = $0040, iData;                          //64 Byte Stack
    FrameSize    = $0040, iData;                          //64 Byte Frame
    SerPort1     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    SerPort2     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer2    = 64,iData;                              //64 Byte mit Interrupt

funktioniert es auch.
Das Ganze ist zwar tückisch, aber genaugenommen nur eine Schönheitsfehler.

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

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 11.07.2011 - 18:37  ·  #3
@wom,
den Char/Byte Bug hatte ich sofort beseitigt und einen Download nachgeschoben, ohne allerdings eine neue Versions Nummer zu generieren. Also Update einfach nochmal download und install.

@Thomas,
ja, das wurde zum Problem nachdem der Mega128 kam und noch besser, der Mega256x. Da hat Atmel die UARTs umbenamst und mich zur Verzweiflung gebracht. Deshalb gilt: SerPort, TxBuffer, RxBuffer; SerPort2, TxBuffer2, RxBuffer2. Mit mehr als 2 UARTs SerPort1, SerPort2, SerPort3 etc. RxBuffer1, RxBuffer2, RxBuffer3 etc.

rolf
wom
 
Avatar
 
Subject:

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 11.07.2011 - 18:40  ·  #4
Hallo zusammen

danke für die infos. hat mich fast zur verzweiflung gebracht, da ich eine neue hardware habe und erst dort den fehler gesucht habe. ist ein fehler in der umschaltung (rs485) bekannt (sercont) ?

gruß
wom
Thomas
Benutzer
Avatar
Gender:
Location: Gera
Age: 61
Posts: 123
Registered: 04 / 2003
Subject:

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 11.07.2011 - 20:14  ·  #5
@rolf,

leider ist da noch ein Bug drin.

Testcode
Code
Device = Mega2560, VCC = 5;

  Define_Fuses
    LockBits0  = [];
    FuseBits0  = [];
    FuseBits1  = [];
    FuseBits2  = [];

  Import SysTick, SerPort1, SerPort2, SerPort3, SerPort4;

  From System Import;
  
  Define
    ProcClock    = 8000000;                               //Interner Oszilator 8MHz
    SysTick      = 10;                                    //Systemtick 10ms
    StackSize    = $0040, iData;                          //64 Byte Stack
    FrameSize    = $0040, iData;                          //64 Byte Frame
    SerPort1     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    SerPort2     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer2    = 64,iData;                              //64 Byte mit Interrupt
    SerPort3     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer3    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer3    = 64,iData;                              //64 Byte mit Interrupt
    SerPort4     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer4    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer4    = 64,iData;                              //64 Byte mit Interrupt

Implementation
...

sollte ja eigentlich 4 serielle Schnittstellen im Interruptbetrieb erzeugen.
Aber
Code
                        ; ============ Library ============

SYSTEM.SEROUT:
SYSTEM.SEROUT1:
SYSTEM._L0041:
                        LDS       _ACCB, ucsr0a
                        SBRS      _ACCB, 5
                        RJMP      SYSTEM._L0041
                        STS       UDR0, _ACCA
                        RET

SYSTEM.SEROUT2:
                        LDS       _ACCB, _TXCOUNT2
                        CPI       _ACCB, 64
                        BREQ      SYSTEM.SEROUT2
                        CLI
                        LDS       _ACCB, _TXINP2
                        LDI       _ACCCLO, _TXBUFF2 AND 0FFh
                        LDI       _ACCCHI, _TXBUFF2 SHRB 8
                        ...


SerPort1 erhält keine Puffer.

mit
Code

    ...
    SerPort1     = 9600,Stop2;                            //Seriell mit 9600 Baud
    RxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    ...


geht es.

Gruß Thomas
Attachments
Filename: Test.zip
Filesize: 38.08 KB
Title: Testprojekt
Download counter: 45
wom
 
Avatar
 
Subject:

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 13.07.2011 - 12:23  ·  #6
Hallo Thomas,
ist es dann so, dass wenn man ohne den Zusatz '1' arbeitet (bei SerPort1-> SerPort) das dann keine Probleme auftreten ??

Gruß
WOM
Thomas
Benutzer
Avatar
Gender:
Location: Gera
Age: 61
Posts: 123
Registered: 04 / 2003
Subject:

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 13.07.2011 - 17:22  ·  #7
Hallo wom,

meine bisherigen Erkenntnisse sind wie folgt:

ob man in der Zeile
Code
Import SysTick, SerPort1, SerPort2, SerPort3, SerPort4;

verwendet oder
Code
Import SysTick, SerPort, SerPort2, SerPort3, SerPort4;

ist egal.
Allerdings muss im Abschnitt "Define" auch entsprechend
Code

    ...
    SerPort1     = 9600,Stop2;                            //Seriell mit 9600 Baud
    ...
 

oder
Code

    ...
    SerPort      = 9600,Stop2;                            //Seriell mit 9600 Baud
    ...
 

verwendet werden.
Wichtig ist, dass man, egal was man im Import verwendet hat, die Pufferfestlegung mit
Code

    ...   
    RxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer     = 64,iData;                              //64 Byte mit Interrupt
    ...

macht.
Die Variante mit
Code

    ...
    RxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    TxBuffer1    = 64,iData;                              //64 Byte mit Interrupt
    ...

wirkt so, als ob RxBuffer und TxBuffer gar nicht angegeben sind.

Möglicherweise straft Rolf mich aber auch noch Lügen.

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

Re: Fehler im Compiler 4.99.42 ??

 · 
Posted: 13.07.2011 - 18:34  ·  #8
Hallo Thomas,
vermutlich keine Lügen :D
Ich werde das prüfen und auf jeden Fall am WE ein Update bereitstellen.

rolf
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: 16 · Cache Hits: 15   138   153 · Page-Gen-Time: 0.026804s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI