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 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
:-) 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.