Forum: Mikrocontroller und Digitale Elektronik Gründe für Reset beim PIC


von Latissimo (Gast)


Lesenswert?

Hallo!
Mein PIC wird alle 2,5s geresetted. Ich verzweifle mittlerweile, denn:

- einerseits habe ich den Brown-Out reset aus
- andererseits habe ich den Watchdog auch aus!

zum Code:

ein zyklischer Interrupt soll bestimmte Pins auf ne best. Art toggeln. 
diese Zykluszeit beträgt ca 8ms.
1
#include "int16CXX.h"
2
#pragma origin 4
3
interrupt serverX(void)
4
{
5
    int_save_registers
6
    if (TMR1IF)              // T1 übergelaufen?
7
    {
8
        PORTB.6 = !PORTB.6;
9
10
        PORTC.1 = 0;
11
        TMR1IF = 0;
12
        T1OSCEN = 0;
13
        TMR1CS = 0;
14
        TMR1H = 240;
15
        TMR1L = 220;
16
        TMR1ON = 1;
17
        GIE = 1;
18
        PEIE = 1;
19
        TMR1IE = 1;
20
        TMR1IF = 0;
21
22
        if (PORTB.5 == 0 && !m)
23
        {
24
            PRO = PRO<<1;
25
            n=1;
26
            PORTB.4 =1;
27
        }
28
        if (!m) PORTB.5 = !PORTB.5;
29
30
        else
31
        {
32
            m = 0;
33
            n = 0;
34
            PORTB.4 = 0;
35
            PORTC.2 = 0;
36
        }
37
        if (PRO.7 && n == 1)
38
        {
39
            m = 1;
40
            PORTC.2 =1;
41
        }
42
43
44
45
    }//if(TMR1IF)
46
47
    int_restore_registers
48
}               // Interrupt-Routine zu ende
49
50
51
void main(void)       // Hauptfunktion
52
{
53
    OSCCON.4 = 1;
54
    OSCCON.5 = 1;
55
    OSCCON.6 = 1;  // 8MHz interne Taktung
56
57
    ANSEL = 0;
58
    //nach dem Reset vom KG Steuergerät 1 vorimpuls, zwei Nullprotokolle
59
    PROTOCOL = 0b.1111.1111;// Grundzustand des Protokolls
60
    PRO = PROTOCOL;
61
62
    TRISA = 0;
63
    TRISB = 0;
64
    TRISC = 0;
65
    TMR1IF = 0;
66
    T1OSCEN = 0;      // Timerinitialisierungen für Interruptauslösung
67
    TMR1CS = 0;
68
    TMR1H = 240;
69
    TMR1L = 220;
70
    T1CKPS0=0;        // Prescaler auf 8 einstellen
71
    T1CKPS1=1;
72
    TMR1ON = 1;
73
    GIE = 1;
74
    PEIE = 1;
75
    TMR1IE =1;
76
    TMR1IF = 0;
77
    m = 0;
78
    n = 0;
79
    PORTB.6 = 1;
80
    PORTB.5 = 0;
81
    PORTC.1 = 1;        // auf HI beim Reset
82
    for (;;)
83
        {}
84
85
}

von Latissimo (Gast)


Lesenswert?

evtl. nicht ganz richtig mit der Adresse für die Interruptfunktion?

mit dem CC5X-Compiler hab ich folgende Vorgabe benutzt:

#include "int16CXX.h"
#pragma origin 4
interrupt serverX(void)
{

von André (Gast)


Lesenswert?

Ok

wie schaut die externe Beschaltung aus?

du brauchst den Timer nicht in jedem Interrupt neu zu enablen / 
konfigurieren.

Ebenso würde die GIE=1 im Interrupt unterlassen, darum kümmert sich 
normalerweise der Rücksprung aus dem IRQ.

Und das TMR1IF = 0; würde ich ans Ende des IRQ's verlagern, aber noch im 
if(...)

Warum setzt du PEIE=1 ?? nutzt du die Serielle Schnittstelle oder etwas 
derartiges? - Interrupt Quellen sollte man nur aktivieren, wenn man sie 
auch bedient, weil wenn Sie sonst auftreten und du vergisst das Löschen 
der Flags, kommst du praktisch nicht mehr aus Interruptroutine heraus -> 
Stacküberlauf kann bei Dir auch noch passieren, durch dein extra GIE=0 
in der Interrupt Routine.

André

von André (Gast)


Lesenswert?

org 0x04 für den Interruptroutine sollte bei den 16er Pics in Ordnung 
gehen.

von Latissimo (Gast)


Lesenswert?

GIE auf 0 mache ich nicht! Steht explizit im Handbuch....


PEIE ist noch vom Copy und Paste aus nem alten Programm.(Brauche ich 
hier nicht, werde ich raus machen)

org 4 ist ja dann die richtige Adressierung...

Wenn ich den Timer nicht neu konfiguriere(ok die Prescalereinstellungen 
können wohl weg) Dann hat der Timer ja nicht mehr den Startwert, den ich 
im gerne mitgeben würde, um auf mein timing zu kommen...


GIE = 1 im Interrupt werde ich wegmachen.
TMR1IF = 0; muss glaube ich bleiben

Sehe ich das jezt so richtig?


Und danke schon mal...

von André (Gast)


Lesenswert?

Hallo,

die Zuweisung and TM1HL und TMR1H im IRQ kannst du weiter mache, ich 
meinte eher die Vorteiler und Clock Konfiguration dafür - die ist 
überflüssig.

und das TRM1F muss natürlich auf 0 gesetzt werden - ich meinte hier nur 
etwas nach unten verschieben gegen Ende der Routine.

im IRQ
1
       TMR1IF = 0;  - darf bleiben
2
        T1OSCEN = 0; - weg
3
        TMR1CS = 0;  - weg
4
        TMR1H = 240;  - darf bleiben
5
        TMR1L = 220; - darf bleiben
6
        TMR1ON = 1;   - weg
7
        GIE = 1;      - weg
8
        PEIE = 1;     - weg
9
        TMR1IE = 1;   - weg

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.