Hallo, ich habe ein einfaches Lauflicht für einen PIC 17F630 in C geschrieben. Nun möchte ich die Richtung des Lauflichts mit einem per Taster ausgelösten Interrupt umkehren. Dazu wollte ich die Pins alle Auf Digital umstellen, und habe dazu die ersten 3 Bit des CMCON Registers auf 1 gesetzt. Doch seitdem läuft der interne Oszillator nichtmehr. Weiß jemand woran das liegen könnte? MFG Hainz
Meinst du den 16F630? Im Datenblatt steht sonst nichts besonderes im CMCON Register, was so ein Verhalten erklären würde. Bist du sicher, daß der interne Oszillator nicht mehr läuft? Programmiere mal das Configration Word 2007, sodaß CLKOUT am RA4-Pin anliegt. Da müsstest du dann 1/4 des internen Taktes per Scope messen. Bei Interrupts kann man auch viel falsch machen, sodaß die CPU irgendwo ins Nirwana springt (Interrupt Vector falsch gesetzt) oder dauernd den Interrupt wieder anspringt (INTCON-Flags bei Eintritt in den Interrupt nicht gelöscht). Wenn du schon ein Lauflicht hast, würde ich einfach im Rahmen des Lauflichts den Taster abfragen.
Hallo Frank, ein Oszilloskop steht mir leider nicht zur verfügung. Ich habe mein Kinfigurationsword durch "2007" ersetzt, doch leider passiert dann garnichts mehr. Auch habe ich es mit einem externen Oszillator versucht, doch es ist das gleiche Ergebnis: Setzte ich die ersten 3 Bit des CMCON Registers auf eins um alle PINS auf Digital umzustellen, Läuft das Lauflicht nichtmehr. Das es am Interrupt liegt denke ich nicht, denn solange die Eingänge nicht Digital kann theorethisch ja kein Interrupt ausgelößt werden, von daher... Woran könnte es noch liegen? MFG Hainz
Da habe ich mich missverständlich ausgedrückt: Ich meinte die Bits in dem Konfigurationswort 2007 so setzen, daß am RA4-Pin CLKOUT rausgeschaltet wird. Aber da du kein Scope hast, erübrigt sich das. Du könntest höchtens per Multimeter sehen, daß da scheinbar die halbe Versorgungsspannung stabil anliegt, da das so hohe Frequenzen integriert. Stabil in dem Sinne, daß du da auch ein 1k Widerstand nach + oder - legen kannst und die Spannung immer noch dieselbe ist. Ansonsten mache ich in solchen Situationen folgendes: Zurück zur letzten funktionierenden Version (ein Versionsmanagmentsystem wie SVN ist dafür sehr sinnvoll). Dann schrittweise die Änderungen nachvollziehen und sehen, wo es hängenbleibt. Also meine Vermutung wäre ja die Interruptprogrammierung. Daher also von der stabilen Version ausgehend erst das CMCON-Register umprogrammieren und testen. Dann vielleicht versuchen die Pins abzufragen und testen. Dann den Interrupt wieder einbauen, falls du das wirklich per Interrupt lösen willst.
Gut, du hattest doch recht, es lag am Interrupt. Mein Pull-Up Widerstand war falsch. Aber nun noch eine andere Frage: Wie kann ich in C von einer Funktion, also von einem Unterprogramm herausspringen wie ich es in Assembler problemlos mit "goto" konnte? Wenn ich verusche zurück zu main zu springen (main ();), zeigt es immer einen Fehler an... MFG Hainz
In C ist ein "main();" sowas wie ein "Call main". Goto geht glaube ich nur innerhalb von Funktionen, es sei denn, du verwendest longjomp, was aber kein Standard C ist. Vergiss aber beides am besten sofort wieder :-) und schau dir mal die verschiedenen Ergebnisse an, die eine Google Suche nach "strukturierte Programmierung" ergibt.
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.