PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grundlegendes Problem mit Port-Zugriff und Timer-Interrupts



stefan-tiger
12.09.2007, 18:27
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.

PICture
12.09.2007, 18:47
Hallo stefan-tiger!

Ich kann Dir leider nicht helfen, weil ich C nicht kenne. Ich glaube aber, dass nach dem download Deines Quellcodes wird auch keiner Lust haben das zu formatieren. Schau Dir mal das, bitte, an. Normaleweise postet man sowas mit Code, was die Formatierung nicht vernichtet.

MfG

stefan-tiger
12.09.2007, 19:22
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)

PICture
12.09.2007, 19:31
Ich klicke nur eifach auf "Download" und was dann kommt, ist für mich unbrauchbar. Ich bin zu faul um nachzudenken mit welchem Programm wird es vielleicht richtig formatiert. :)

MfG

stefan-tiger
12.09.2007, 19:51
Ich klicke nur eifach auf "Download" und was dann kommt, ist für mich unbrauchbar. Ich bin zu faul um nachzudenken mit welchem Programm wird es vielleicht richtig formatiert. :)

MfG

Das hat doch nichts mit dem Programm zu tun. Das sind ASCII-Dateien.

Das einzige Problem könnte sein, wenn du es mit einem Editor anguckst, der Windows-Zeilenumbrüche erwartet.
Dann sieht du alles in einer Zeile mit lauter Kästchen drin und man kann es nur schwer lesen.
Das kommt vor wenn man z.B. den Editor/Notepad von Windows verwendet.
Wordpad macht es glaube richtig.
Mit welchem Programm hast du versucht es zu öffnen?

PICture
12.09.2007, 20:19
Das weiss ich nicht, wie gesagt nur auf "Download" geklickt. Ich weiss wirklich nicht (wozu sollte ich eigentlich wissen) was der Windows XP dafür nimmt. Warum erwartest Du von Forum-Benutzer, dass sie sich bemühen werden um Deine Dateien versuchen zu öffnen?

MfG

stefan-tiger
12.09.2007, 21:32
Das weiss ich nicht, wie gesagt nur auf "Download" geklickt. Ich weiss wirklich nicht (wozu sollte ich eigentlich wissen) was der Windows XP dafür nimmt. Warum erwartest Du von Forum-Benutzer, dass sie sich bemühen werden um Deine Dateien versuchen zu öffnen?

MfG

Also wenn du mir wirklich helfen wolltest, dann dürftest du nicht wegen an so etwas Unbedeutendem scheitern.
Demnächst willst du auch noch daß meine Tabs nicht 8 sondern 4 Leerzeichen groß sind, wie?

Ich werde keine Änderungen an den Dateien vornehmen, denn diese sind technisch in Ordnung.

stefan-tiger
12.09.2007, 23:16
Dieses Problem ist nun auch gelöst: Ich habe den SDCC auf Version 2.7.0 geupdated.

Nun gehts mit Interrupt und DELAY 80 und damit ist alles plausibel :-)

PICture
13.09.2007, 06:55
Hallo stefan-tiger!

Das freut mich sehr, das Du es allein geschafft hast. Manchmal ändert sich etwas, was eigentlich schwer logisch zum Erklären ist, so wie diesmal bei Dir. Auf sowas würde ich wachrscheinlich gar nicht denken.

Wünsche Dir noch viel Spass und Erfolg mit PICs ! :)

MfG