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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.