Tiny Bootloader + HT-PIC + Interrupt

Gast #1075397
Lesenswert?

Hallo.
Hab folgendes Problem: (Vorweg: hab nicht sooo viel erfahrung mit dem 
uC)
Habe den Bootloader von
*www.microchipc.com probiert(aber ohne erfolg --> konnte nicht mal zum 
bootloader "connecten")
*bloader + screamer (aber hab nicht brauchbaren für ht-pic + 
Speichereinstellungen gefunden --> bootloader funktioniert, aber ich 
kann nicht übertragen, wegen den sprungadressen)

Jetzt hab ich den Tiny Bootloader zum funktionieren gebracht. Hab im 
MPLAB einfach "-ICD" hinzugefügt und funktioniert soweit ohne Probleme.
mein Problem jetzt:

Vorweg kurz ein ausschnitt meines Programmcodes:

Interrupt:
Wen PortB:4 sich änder --> Einen Zählerstand um eins erhöhen.

MAIN:
1) General Iterrupt ein
2) Einen ausgangsport auf High
3) 2 Sekunden warten
4) Gerneral Interrupt aus
5) Einen ausgangsport auf Low
6) Zählerstand per RS232 ausgeben

Problem:
Wenn sich der Port EINMAL auf ein erhöht, funktioniert alles.
Ändert sich der Port aber wären den 2 Sekunden öfter, dann "hängt der 
PIC" aus schaltet den Ausgangsport nicht mehr aus.
--> meine vermutung --> INTERRUPT! (Da ich öfter gelesen habe das 
bootloader+interrupt nicht optimal ist)

Sollte jemand ausschnitte aus den Source-Code sehen wollen ist das auch 
kein Problem.

Ich hoffe ich habe mein Problem halbwegs verständlich 
beschrieben!(Sollte jemand einen anderen "Schematischen Vorschlag haben, 
würde ich mich freuen)

mfg und vielen Dank
empi
Gast #1076124
Lesenswert?

:-)
OK, sorry

PIC: 16F877A
Compiler: HT-PIC v8.02PL1 mit MPLAB 8.1

C-Code vom Interrupt:

void interrupt isr(void)
{
    GIE = 0;

    if (RBIF)
    {
  if(STDL_IN == 1)
  {
        stdl_counter++;
  }
    }

     RBIF = 0;

     GIE = 1;
}

main:
{
  RFS_OUT = 1;

  DelayMs(200);        //gibt zeit, damit das zu testende objekt sich 
starten/initalisieren kann
  DelayMs(200);
  DelayMs(200);

  GIE = 1;              //wärend dieser zeit soll der zählerstand erhöht 
werden durch einen interrupt
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);
  DelayMs(200);

  GIE = 0;              //alles wieder aus
  RFS_OUT = 0;
}

Das programm soll im prinzip zählen ob das andere gerät richtig 
arbeitet.

mfg und vielen dank
empi
#1082498
Lesenswert?

Funktioniert es denn im Simulator?

Und ev. in der Hardware, aber ohne Bootloader?

Deine main() sollte wohl auch einen Endlosloop haben. Sonst läuft main() 
nur einmal durch und der Controller startet wieder komplett neu (im 
besten Fall) oder bleibt gar hängen.
Wenn andere das auch ausprobieren sollten (z.B. im Simulator), wäre das 
ganze Projekt gezippt ideal, oder wenigstens der komplette Source-Code 
inkl. Configuration bits settings.
#1082509
Lesenswert?

Du bist dir schon bewusst, daß du nestest Interrupt erlaubst, und die
nicht bedienst.  Die Interrupt-Logic schaltet GIE aus, auf 0.
RETI schaltet sie wieder ein, also auf 1.  Wenn du sie vorher 
einschaltest,
sprich im Interrupthandler, dann erlaubst du nestet Interrupt.
Eine tolle Sache, aber nichts für den unerfahrenen Programmierer.

Mfg
Chris

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren