Liste der Anhänge anzeigen (Anzahl: 1)
Grundlegendes Problem mit Port-Zugriff und Timer-Interrupts
Hallo,
verwende zur Zeit nen PIC18F2550 und Piklab + SDCC.
Ich verwende auch den USB-Bootloader von Sprut.
LEDs hängen an RC0, RC1 und RC2.
Quarz ist 4 MHz, Fosc ist 48 Mhz (wegen PLL).
In Grunde funktioniert das schon.
Jetzt hab ich aber ein seltsames Problem.
Ich habe zuerst ein Programm geschrieben, daß in main() in einer Endlos-While-Schleife die LEDs nacheinander ein und ausschaltet und dazwischen Zeit vergeudet in dem es drei geschachtelte for-Schleifen durchläuft.
Danach wollte ich das selbe mit Timer-Interrupts machen. Ich lasse den Timer alle 1500 Schritte mit dem 1/8 Prescaler überlaufen, d.h. der Interrupt tritt alle 1 ms auf.
Ich zähle die Interrupts mit, und alle 500 mal, toggle ich die 2. LED.
Das funktioniert, alle 500ms ändert die 2. LED ihren Zusand.
Jetzt das Problem: Wenn ich beide Varianten zusammen betreiben möchte, also LED 1 und 3 in der main() und LED2 in der isr ansteruen, dann funktioniert das nicht wie gewünscht.
Die LED2 blinkt dann korrekt, währen die LED1 und 3 flackern.
Woran könnte das liegen?
MIr ist irgendwie sowas in den Sinn gekommen wie: beim Einsprung in die ISR werden die Ports gesichert und danach wieder hergestellt. Aber ich weiß nicht wonach ich da genau suchen kann.
Evtl. liegt es ja auch an was ganz anderem?
Anbei der Quellcode.
Liste der Anhänge anzeigen (Anzahl: 4)
Was meinst du? Der Quellcode ist jednefalls lesbar eingerückt.
Wenn ich es von hier herunterlade und in kwrite aufmache kann ich es wunderbar lesen.
Ich kann aber auch Assemblercode anhängen.
Ich habe das Problem glaub ich gelöst, bin dann aber auf ein anderes gestoßen, was ich mir nicht erlären kann.
Zuerstmal die Lösung: Es wurde nichts gerettet, hatte das Schlüsselwort "interrupt" für den SDCC nicht richtig eingesetzt.
Im Anhang die neue Version wo man es sieht.
Das andere Problem: Wenn ich ohne Interrupts arbeite, also ein Delay mit geschachtelten for-Schleifen benutzte, dann sind bei Fosc=48 MHz drei geschachtelte for-Schleifen die von 0 bis 80 laufen grob ne halbe Sekunde lang. (Es sind dann ca. 80^3 * 10 Maschinen-Befehle. läßt sich gut nachrechnen)
Wenn ich den Timer benutz, wie im Anhang zu sehen, dann wird der PIC aufeinmal sauschnell. Ich muss dann diedrei geschachtelten for-Schleifen von 0 bis 700 oder so laufen lassen um grob ne halbe Sekunde zu überbrücken.
Das verstehe ich nicht. Ich weiss auch nicht wie ich es besser erklären soll. (siehe "#define DELAY" im C-Code)