Forum: Mikrocontroller und Digitale Elektronik Tiny Bootloader + HT-PIC + Interrupt


von gast (Gast)


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

von Severino R. (severino)


Lesenswert?

gast wrote:

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

Nein, hier im Forum benützen wir in solchen Fällen immer die Glaskugel; 
die sagt uns dann auch, um welchen PIC und um welchen Assembler/Compiler 
es sich handelt.

SCNR

von gast (Gast)


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

von gast (Gast)


Lesenswert?

keiner eine idee?

mfg und danke

von Severino R. (severino)


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.

von Chris S. (schris)


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

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.