Forum: Mikrocontroller und Digitale Elektronik SDCC und PIC18F2680 Reset nach regelmäßiger Zeit 2 Minuten 8 Sekunden.


von skorpionx (Gast)


Lesenswert?

Vielleicht komisch aber wahr. Ich arbeite an meiner Entwicklung
parallel mit zwei Compiler: SDCC und  Microchip MC18 (freie Version). 
Das SDCC durch Sentiment...   Das Programm ist umfangreich. Beide 
Interrupts (low und high Priorität)mitlaufen. Unter SDCC kommt nach 
regelmäßigen Abständen zum Reseten. Unter MC18 läuft das  Programm über 
Tage  ohne Problemen.  Zuerst dachte ich an ein Hardwareproblem, aber 
nichts verdächtiges habe ich gefunden.  Heute habe ich diese Abstände 
zwischen Reset gemessen. Sind das regelmäßig 2 Minuten und 8 Sekunden. 
Also leider SDCC  Fehler.
Nach dem Wiedereintritt nach dem Reset habe ich noch den Inhalt vom
RCON ausgelesen: 0b00010100

CON:
bit 7 IPEN: Interrupt Priority Enable bit
   1 = Enable priority levels on interrupts
   0 = Disable priority levels on interrupts (16CXXX Compatibility mode)
bit 6 SBOREN: BOR Software Enable bit(1)
     If BOREN1:BOREN0 = 01:
      1 = BOR is enabled
      0 = BOR is disabled
     If BOREN1:BOREN0 = 00, 10 or 11:
       Bit is disabled and read as ‘0’.
bit 5 Unimplemented: Read as ‘0’
bit 4 RI: RESET Instruction Flag bit
   1 = The RESET instruction was not executed (set by firmware only)
   0 = The RESET instruction was executed causing a device Reset
             (must be set in  software aftera Brown-out Reset occurs)
bit 3 TO: Watchdog Time-out Flag bit
   1 = Set by power-up, CLRWDT instruction or SLEEP instruction
   0 = A WDT time-out occurred
bit 2 PD: Power-down Detection Flag bit
   1 = Set by power-up or by the CLRWDT instruction
   0 = Set by execution of the SLEEP instruction
bit 1 POR: Power-on Reset Status bit(2)
   1 = A Power-on Reset has not occurred (set by firmware only)
   0 = A Power-on Reset occurred (must be set in software after a
                 Power-on Reset occurs)
bit 0 BOR: Brown-out Reset Status bit
   1 = A Brown-out Reset has not occurred (set by firmware only)
   0 = A Brown-out Reset occurred (must be set in software
         after a Brown-out Reset occurs)

von Michael H. (morph1)


Lesenswert?

(deep sleep) watchdog aus versehen in der SDCC config aktiviert?

von skorpionx (Gast)


Lesenswert?

Michael H. schrieb:
> (deep sleep) watchdog aus versehen in der SDCC config aktiviert?

meine config :

//CONFIG1H
#define IESO (0b0<<7)    //Internal/External Oscillator Switchover: 0
                         disabled
#define FCMEN (0b0<<6)   //Fail-Safe Clock Monitor: 0  disabled
#define FOSC  (0b0010)   //Oscillator Selection bits : 0010 HS 
oscillator
#define CONFIG1H_ IESO|FCMEN|FOSC

//CONFIG2H
#define WDTPS (0b0000<<1) //Watchdog Timer Postscale Select bits: 0000 
1:1
#define WDTEN  (0b0)      //Watchdog Timer Enable : 0 no Enable
#define  CONFIG2H_ WDTPS|WDTEN

//CONFIG2L
#define VBOR (0b11<<3)      //Brown-out Reset Voltage: 11 set to 2.1V
#define BOREN (0b00<<1)     // Brown-out Enable bits:  00 Brown-out
                                disabled in hardware and software
#define PWRTEN (0b0)        // Power-up Timer Enable: 0 = PWRT enabled
#define CONFIG2L_  VBOR|BOREN|PWRTEN

//CONFIG3H
#define MCLRE (0b1<<7)      //MCLR Pin Enable: 1 MCLR pin enabled; RE3 
input pin disabled
#define LPT1OSC (0b0<<2)    //Timer1 configured:  0
                           for higher power operation
#define PBADEN (0b0<<1)     //PORTB A/D Enable bit : 0 pins are 
configured
                             as digital I/O on Reset
#define CONFIG3H_  MCLRE|LPT1OSC|PBADEN

//CONFIG4L
#define DEBUG (0b1<<7)     //Background Debugger Enable: 1
                           Background debugger disabled, RB6 and RB7
                          configured as general purpose I/O pins
#define XINST (0b1<<6)     //Extended Instruction Set Enable: 1 =
                            Instruction set extension and Indexed
                            Addressing mode enabled
#define BBSIZ (0b00<<4)    // Boot Block Size: 00:  1K words
#define LVP    (0b0<<2)    //Single-Supply ICSP Enable bit: 0 disabled
#define STVREN  (0b1)      //Stack Full/Underflow Reset Enable:  1 =
                             Stack full/underflow will cause Reset
#define CONFIG4L_ DEBUG|XINST|BBSIZ|LVP|STVREN


__code  __at __CONFIG1H char conf1H = CONFIG1H_;
__code  __at __CONFIG2L  unsigned short conf2H_conf2L=(((unsigned
               short)CONFIG2H_)<<8)|CONFIG2L_;
__code  __at __CONFIG3H char conf3H = CONFIG3H_;
__code  __at __CONFIG4L char conf4L = CONFIG4L_;

von A. S. (Gast)


Lesenswert?

Dann setze doch die RCON-Bits auf 1 und schaue, was den Reset verursacht 
hat.

Beim Watchdog einfach mal regelmäßige Resets mit einflechten, ob sich 
die Zeit dann ändert.

von skorpionx (Gast)


Lesenswert?

Achim S. schrieb:
> Dann setze doch die RCON-Bits auf 1 und schaue, was den Reset verursacht
> hat.

RCON im Programm nicht gesetzt:
Nach dem Spannung ein RCON = 0b00011100.
Nach jedem unerwarteten Reset RCON = 0b00010100

RCON im Programm  gesetzt (RCON=0xFF):
Nach dem Spannung ein RCON = 0b00011100.
Nach jedem unerwarteten Reset RCON = 0b00010111

Watchdog ist nicht aktiviert. Trotzdem mache ich einige Versuche.

von skorpionx (Gast)


Lesenswert?

skorpionx schrieb:
> Watchdog ist nicht aktiviert. Trotzdem mache ich einige Versuche.

Bingo! Am Ende von meiner while(1) Schleife habe ich
eingeführt den Befehl:

ClrWdt();

und seit ca. 15 Minuten das Programm läuft ohne Reset.
Speichergrenze Verletzung? Fehler vom SDCC? Diese Zeit 2 Minuten und
8 Sekunden war ziemlich lang...

von skorpionx (Gast)


Lesenswert?

Eigentlich schon danach sollte klar sein:
Nach dem Spannung ein RCON = 0b00011100.
Nach jedem unerwarteten Reset RCON = 0b00010100

bit 3 TO: Watchdog Time-out Flag bit
         1 = Set by power-up, CLRWDT instruction
             or SLEEP instruction
         0 = A WDT time-out occurred

Bit3 = 0 also Ursache für Reset Watchdog war.
Aber warum wurde Watchdog aktiv?

von (prx) A. K. (prx)


Lesenswert?

skorpionx schrieb:
> Aber warum wurde Watchdog aktiv?

Per Config-Bits eingeschaltet?

von skorpionx (Gast)


Lesenswert?

A. K. schrieb:
>> Aber warum wurde Watchdog aktiv?
>
> Per Config-Bits eingeschaltet?

Unabsichtlich! Ich wollte Den watchdog ausschalten (sehe Oben):
#define WDTEN  (0b0)      //Watchdog Timer Enable : 0 no Enable
Danach wollte genauso wie bei den anderen (CONFIG1H, CONFIG3H, CONFIG4L)
mein PIC konfigurieren:

__code  __at __CONFIG2L char  conf2L = CONFIG2L_;
__code  __at __CONFIG2H char  conf2H = CONFIG2H_;

Leider danach kam Fehlermeldung vom Linker:

error: File "obj\Release\Heizung.o", section 
".config_300002_OBJ\RELEASE\HEIZUNG.O" (0x300002) is absolute but occurs 
in more than one file.

Ich konnte das nicht bestätigen. Der Linker  hat nur akzeptiert
wenn ich nur einen von denen beiden entweder  CONFIG2L oder
CONFIG2H so wie oben beschreibe. Dann habe ich eine Idee das
alles zusammen zu fassen (sehe Oben):

__code  __at __CONFIG2L  unsigned short conf2H_conf2L=(((unsigned
               short)CONFIG2H_)<<8)|CONFIG2L_;
Der Compiler und Linker haben das akzeptiert. Ich war überzeugt,
dass beide Register richtig beschrieben wurden. Und da habe ich mich 
geirrt. Nur Register  CONFIG2L wurde richtig beschrieben
und der Inhalt vom   CONFIG2H bleibt beim Standardwert also:
0b00011111. Also Watchdog war aktiv! Auch diese Zeit über 2 Minuten 
stimmt! Ich habe auch alternativ noch das ausprobiert:

__code  __at __CONFIG2L char  conf2L[] = {CONFIG2L_,CONFIG2L_};

Auch in diesem Fall wurde nur CONFIG2L beschrieben.

CONFIG2L=300002h  und  CONFIG2H=300003h

Hat jemand einen Rat...

von skorpionx (Gast)


Lesenswert?

An SDCC Entwickler als Fehler gemeldet...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.