mikrocontroller.net

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


Autor: gast (Gast)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: gast (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine idee?

mfg und danke

Autor: Severino R. (severino)
Datum:

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

Autor: Chris S. (schris)
Datum:

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

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.