Hallo an alle Profis,
für meine Modelleisenbahn versuche ich über eine PICF629 2 Karuselles zu
steuern. Die Schaltung dazu ist absolut einfach. Die Spannungsversorgung
wird über eine Z-Dioden stabilisierte Einweggelichrichtung erzeugt. Als
Eingang und damit als Starttaster wird GP3 verwendet. Die Ausgänge sind
über Transistorstufen an die Aktoren geschaltet. Im Versuchsaufbau
übernehmen LED die Motoren- und Hupenfunktion.
Im angehangenen Listing ist die Funktion einigermaßen beschrieben, die
Lichtsteuerungen sind noch nicht enthalten, die Ausgänge also noch nicht
benutzt.
Nach dem Schreiben des Programmteils teste ich das ganze mit dem
Simulator im MPLAB. Dort funktioniert das Programm auch so wie ich es
mir vorgestellt habe.
Über ein Experimentierboard der Firma Vellman brennte ich mit der
zugehörigen PIC-Brennersoftware dan PIC. Zu meiner großen Enttäuschung
funktioniert das Programm leider nicht. Seltsamerweise wird der Ausgang
GP2 angestuert und das wars dann. Zu Versuchszwecken kommentierte ich
schon die Abfrage für den Starttaster aus und veränderte natürlich auch
die Marke entsprechend.
Ich vermutete, dass ich als Anfänger mit meinen Experimenten den PIC
zerschossen habe (durch dummerweises überschreiben des OSCALL), was sich
aber nicht bestätigte, denn nach dem Brennen eines Lernbeispiels von der
Seite sprut.de (und wiederherstellen des OSCALL) läuft dort das
Beispiel.
Also liegt der Fehler in meinem Progrämmchen. Es gelingt mir leider
nicht irgendeinen Ansatz noch zu finden, wo der Fehler zu finden ist und
bitte deshalb um Unterstützung und Hinweise.
Ich bin mir bewusst, dass es wesentlich elegantere Lösungen für die
Realsierung der Aufgabe gibt.
In der Hoffnung auf Hilfe
mit freundlichem Gruß
Versuch mal die Register OPTION_REG, INTCON, PIE1, IOC und WPU auf 0 zu
setzen. Kannst ja mal gucken, was das alles ist, ich hab in deinem
Programm jedenfalls nichts gesehen, was etwas davon braucht (Interrupts
etc).
mist, drauf reingefallen.. GPPU ist negiert.. also OPTION_REG auf
0b10000000, also 128.
Christian schrieb:> call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung
daran könnte es natürlich auch liegen ;) statt call mal movlw nehmen.
Zudem ist OSCCAL ein Register, das 8 Bit groß ist, deine Zahl aber 12..
also hier auch 128 rein, für Center-Frequenz.
ist die korrekte Belegung des OSCCON mit dem Kalibrierungswert. Der
spielt aber keine Rolle, weil hier keine zeitkritischen Dinge
stattfinden, OSCCAL beeinflusst die Taktfrequenz nur in einem begrenzten
Rahmen.
Die Warteschleife sieht bei sprut.de übrigens anders aus:
Hallo,
ich will das mal stückweise durchgehen. Kann sein, dass es ein bisschen
hart für dich wird nicht persönlich nehmen - ich versuche nur ein
bisschen deine Fähigkeiten und Sinne zu schulen.
Christian schrieb:> über eine PICF629
Diesen PIC gibt es nicht.
Christian schrieb:> Die Spannungsversorgung> wird über eine Z-Dioden stabilisierte Einweggelichrichtung erzeugt.
Das ist keine Spannungsversorgung sondern ein Quick 'n Dirty. Nicht
sonderlich gut.
Ich entnehme dieser Beschreibung, dass es sich um eine
Wechselstromanlage handelt ?!
Christian schrieb:> Als> Eingang und damit als Starttaster wird GP3 verwendet.
Okay mit Pullup (gut), Pulldown (ok) oder als Wechsler (schlecht)
Stichwort Interrupt für deine PIC-Schulung (brauchst du bei diesen
geringen Anforderungen an den PIC nicht, ist aber immer gut zu wissen)
Christian schrieb:> Die Ausgänge sind> über Transistorstufen an die Aktoren geschaltet.
PNP oder NPN, welche Vorwiderstände ?
Christian schrieb:> Zu meiner großen Enttäuschung> funktioniert das Programm leider nicht.
Welche Configbits hast du gesetzt? Wie ist MCLR beschalten? Welche
Taktquelle hast du real? Übernimmst du die ConfigBits aus dem Code oder
setzt du in der Programmersoftware neue?
Christian schrieb:> Zu Versuchszwecken kommentierte ich> schon die Abfrage für den Starttaster aus und veränderte natürlich auch> die Marke entsprechend.
Du hast keinerlei Entprellung realisiert, das ist überhaupts nicht gut.
Christian schrieb:> Ich vermutete, dass ich als Anfänger mit meinen Experimenten den PIC> zerschossen habe (durch dummerweises überschreiben des OSCALL), was sich> aber nicht bestätigte, denn nach dem Brennen eines Lernbeispiels von der> Seite sprut.de (und wiederherstellen des OSCALL) läuft dort das> Beispiel.
Man kann einen PIC nicht auf diese Art und Weise zerstören bzw.
unbrauchbar machen wie die AVRs. Das Register OSCALL gibt es nicht. Dein
Compiler weiß das nicht ... darum ist immer Präzision erforderlich.
Stelle bitte mal deinen Schaltplan ein, dann können wir uns dem Code
widmen.
Hallo Michael,
nur konstruktive Krtik bringt vorwärts, auch wenn diese manchmal hart
erscheint.
Tippfehler sind immer da, insbesondere dann, wenn man das eigene
Schreiben nur oberflächlich korrigiert. Sorry.
Es handelt sich um einen PIC 12F629. Die "12" ist verschwunden.
Zur Klärung der Beschaltung des Bausteins die angehängte Datei. Ich
bitte die Form zu entschuldigen. Die Platine habe ich ordentlich
gezeichnet, die äußere Beschaltung nicht.
Alle Pins, mit Ausnahme GP3 sind in der INIT-Routine als Ausgänge
gesetzt.
Entprellen ist sicherlich noch notwendigerweise einzuarbeiten. Im ersten
Step bin ich schon glücklich die einfache Routine zu laufen zu bringen.
In der Hoffnung auf weitere fruchtbringende Hinweise verbleibe ich
mit freundlichem Gruß
Christian.
ich schrieb:> Versuch mal die Register OPTION_REG, INTCON, PIE1, IOC und WPU auf 0 zu> setzen. Kannst ja mal gucken, was das alles ist, ich hab in deinem> Programm jedenfalls nichts gesehen, was etwas davon braucht (Interrupts> etc).ich schrieb:> mist, drauf reingefallen.. GPPU ist negiert.. also OPTION_REG auf> 0b10000000, also 128.>> Christian schrieb:>> call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung>> daran könnte es natürlich auch liegen ;) statt call mal movlw nehmen.> Zudem ist OSCCAL ein Register, das 8 Bit groß ist, deine Zahl aber 12..> also hier auch 128 rein, für Center-Frequenz.
Schon probiert? ;) seh ich nämlich nicht. Call setzt den ProgramCounter
(also die Adresse im Flashspeicher, wo das prog grade ist) auf den Wert
bzw. auf die Zeile, wo das Label ist. Zusätzlich speichert er die
Flash-Adresse, in dem der Call-Befehl steht, im Stack. Also springt er
an die Adresse 0x3FF, da wird aber sehr warscheinlich nichts sein und
das Programm läuft ans Ende vom Flash-Speicher.. Ende..
bingo schrieb:> ist die korrekte Belegung des OSCCON mit dem Kalibrierungswert
Ich hab im Datenblatt gesucht und nichts mit "OSCCON" gefunden. Hat das
wohl nicht.
Ich würde deinem Taster einen Pull-Up-Widerstand spendieren oder den
Internen Benutzen.
So ich wollte es nochmal wissen... Die letzte Adresse im
Programm-Speicher ist 0x03FF... Also machst du mit "call 0x3FF" nichts
anderes, als an die letzte Zeile vom Programmspeicher zu springen.
Danach hört er meines Wissens auf und ist.. am ende.. macht nichts
mehr.. Aber selbst, wenn er wieder von vorne anfängt, springst du gleich
wieder hin.. Also kann es nicht gehen.
Hallo Michael,
in Ergänzung zu meiner vorigen Antwort:
Beim Brennen verändere ich weder die config-bits noch den OSCCAL-Wert.
Letzeres habe ich unvorsichtiger (oder auch aus
Anfängerahnungslosigkeit) gemacht, inzwischen aber der Ursprungswert
wieder zurückgeschrieben.
Meine Schaltung scheint schon einigermaßen zu funktionieren, denn ich
lud in den PIC eine Lernsoftware von sprut.de. Diese Programm
funktioniert auf meinem PIC. Allerdings ist dieses Lehrbeispiel mit
Interruptroutinen organisiert. Deshalb habe ich immer noch die
Vermutung, dass ich mir beim Brennen doch den PIC in der Routine zur
Kalibrierung verdorben habe. Ich überschrieb den vom Brenner gelesenen
Wert mit x3ff. Nach dem Erkennen meines Fehlers schrieb ich den
ursprünglichen Wert wieder ein. Vielleicht jedoch falsch.
Gruß
Christian.
Wie so gibt es immer wieder Leute die hier Fragen stellen und die
Antworten dann nicht lesen :(
Das durchwirrt mich völlig, last das Bitte Bitte Bitte...
Also, bei den 12F629 steht im jungfräulichen Zustand auf 0x03FF ein
RETLW Kallibrierungswert. Das heist, dass man den Kallibrierungswert mit
einem CALL 0x03FF ins W Register zurückbekommt. ABER: wenn deine
Brennsoftware den gesamten Flash beschreibt, wird sie auch das RETLW auf
0x03FF überschreiben und dann hängt sich dein PIC auf. Ich würde dieses
CALL erst einmal auskommentieren, da es nicht wichtig ist, wie genau
deine Zeiten eingehalten werden. Was hast du denn auf 0x03FF
geschrieben? nur den Wert oder ein RETLW Wert?
Zu deiner Schaltung: Durch den 1k im Netzteil begrenzt du den zur
Verfügung stehenden Strom auf ca. 7mA. Das könnte funktionieren, muss
aber nicht. Ich würde da ein Übliches Netzteil mit Brückengleichrichter
und 7805 bauen.
Die Beschaltung an GP3 ist auch Unsinn. Der Eingang hängt bei nicht
gedrücktem Taster in der Luft. Du brauchst einen Pullup. Also den 1k
(besser sind 10k) zwischen +5V und GP3 und den Taster zwischen GP3 und
Masse. Die Diode kannst du weglassen.
Am Programm selbst hab ich erst mal auch nichts weiter gefunden. Sollte
also gehen.
Sven
Hallo Sven,
vielen Dank für die ersten Ansätze zur Lösung meines Problems.
Ich werde das heute abend sofort ausprobieren und dann berichten.
Ich schrieb einen Wert (x34FF) zurück und bin langsam davon überzeugt,
dass dort die Ursache zu suchen ist.
Meine Schaltung werde ich deinen Hinweisen entsprechend abändern.
Vielen Dank
Christian
movlw 0x80 ;Lade 0x80 für Taktgeneratorkalibrierung
10
movwf OSCCAL ;Kalibrierung Centerfrequenz
11
movlw 0x80 ;Lade 0x80 für OPTION_REG
12
movwf OPTION_REG ;Ausschalten der Pull-Ups, einstellen der Timer
13
clrf WPU ;Ausschalten der Pull-Ups
14
clrf PIE1 ;Ausschalten der Interrups
15
clrf IOC ;Ausschalten der Interrups
16
bcf STATUS, RP0 ;Rückschalten auf Bank 0
17
return ;Rückkehr nach call
2.) Ändere, wie schon von stepp44 erwähnt, deine 1-Dioden-Gleichrichtung
durch einen Brückengleichrichter und einen 7805. Der hat auch bei 10mA
oder 100mA oder 500mA konstante 5V. Daran kannst du dann auch deine LEDs
hängen, nicht, dass die dann leicht flackern durch die Halbwellen.
3.) Hänge einen Pull-Up-Widerstand von ca. 10k Ohm an den Pin vom
Taster.
4.) Poste, wenn du die 3 Schritte probiert hast, ob es funktioniert oder
nicht.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!ICH HOFFE, DU SIEHST MEINEN POST DIESES MAL!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!ICH HOFFE, DU SIEHST MEINEN POST DIESES MAL!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hallo ich,
vielen Dank für die Hinweise.
Die Änderung der Schaltung werde ich entsprechend ausführen und die
Änderung der init-Routine heute abend testen, sowohl Svens als auch die
oben stehende. Das Ergebnis poste ich natürlich.
Nochmals vielen Dank an alle, die mir bis hierher schon Ratschläge
gaben.
Mit freundlichem Gruß
Christian.
Hallo,
ich habe die obigen Hinweise in meine init-Routine eingebaut und:
*fett*ES FUNKTIONIERT!!!*fett*
Vielen Dank an die freundlichen Hilfen. Jetzt kommen die weiteren
Programmschritte dran und die Deatilanalysen der Befehlsfolgen
1
movlw 0x80 ;Lade 0x80 für Taktgeneratorkalibrierung
2
movwf OSCCAL ;Kalibrierung Centerfrequenz
3
movlw 0x80 ;Lade 0x80 für OPTION_REG
4
movwf OPTION_REG ;Ausschalten der Pull-Ups, einstellen der Timer
5
clrf WPU ;Ausschalten der Pull-Ups
die den entscheidenden Anstoß zur Funktionsaufnahme gaben.
Nochmals vielen Dank an "ich" zum Hinweis.
Mit freundlichem Gruß
Christian.