Forum: Mikrocontroller und Digitale Elektronik Interner Oszillator


von Hainz (Gast)


Lesenswert?

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

von Frank B. (foobar)


Lesenswert?

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.

von Hainz (Gast)


Lesenswert?

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

von Frank B. (foobar)


Lesenswert?

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.

von Hainz (Gast)


Lesenswert?

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

von bingo (Gast)


Lesenswert?

return ???

von Frank B. (foobar)


Lesenswert?

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
Noch kein Account? Hier anmelden.