mikrocontroller.net

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


Autor: Latissimo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include "int16CXX.h"
#pragma origin 4
interrupt serverX(void)
{
    int_save_registers
    if (TMR1IF)              // T1 übergelaufen?
    {
        PORTB.6 = !PORTB.6;

        PORTC.1 = 0;
        TMR1IF = 0;
        T1OSCEN = 0;
        TMR1CS = 0;
        TMR1H = 240;
        TMR1L = 220;
        TMR1ON = 1;
        GIE = 1;
        PEIE = 1;
        TMR1IE = 1;
        TMR1IF = 0;

        if (PORTB.5 == 0 && !m)
        {
            PRO = PRO<<1;
            n=1;
            PORTB.4 =1;
        }
        if (!m) PORTB.5 = !PORTB.5;

        else
        {
            m = 0;
            n = 0;
            PORTB.4 = 0;
            PORTC.2 = 0;
        }
        if (PRO.7 && n == 1)
        {
            m = 1;
            PORTC.2 =1;
        }



    }//if(TMR1IF)

    int_restore_registers
}               // Interrupt-Routine zu ende


void main(void)       // Hauptfunktion
{
    OSCCON.4 = 1;
    OSCCON.5 = 1;
    OSCCON.6 = 1;  // 8MHz interne Taktung

    ANSEL = 0;
    //nach dem Reset vom KG Steuergerät 1 vorimpuls, zwei Nullprotokolle
    PROTOCOL = 0b.1111.1111;// Grundzustand des Protokolls
    PRO = PROTOCOL;

    TRISA = 0;
    TRISB = 0;
    TRISC = 0;
    TMR1IF = 0;
    T1OSCEN = 0;      // Timerinitialisierungen für Interruptauslösung
    TMR1CS = 0;
    TMR1H = 240;
    TMR1L = 220;
    T1CKPS0=0;        // Prescaler auf 8 einstellen
    T1CKPS1=1;
    TMR1ON = 1;
    GIE = 1;
    PEIE = 1;
    TMR1IE =1;
    TMR1IF = 0;
    m = 0;
    n = 0;
    PORTB.6 = 1;
    PORTB.5 = 0;
    PORTC.1 = 1;        // auf HI beim Reset
    for (;;)
        {}

}


Autor: Latissimo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
{

Autor: André (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: André (Gast)
Datum:

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

Autor: Latissimo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: André (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
       TMR1IF = 0;  - darf bleiben
        T1OSCEN = 0; - weg
        TMR1CS = 0;  - weg
        TMR1H = 240;  - darf bleiben
        TMR1L = 220; - darf bleiben
        TMR1ON = 1;   - weg
        GIE = 1;      - weg
        PEIE = 1;     - weg
        TMR1IE = 1;   - weg


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.