Anfänger sucht Unterstützung bei PIC-Programmierung
-
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ß
chrisabi
;*********************************************************** ;Programm zur Steuerung der Karusells mit PIC 12F629 ; ;Prozessor-Takt 4 MHz intern ; ;Nach Betätigen der Starttaste als Schalter GP3 beginnt das Programm. ;Das Beleuchtungsprogramm läuft unabhängig/parallel zum Karusellprogramm. ;Folgender Ablauf ist vorgesehen: ;Vor jedem Karusellstart Hupe für 2 sec ein ;K1 für 15 sec ein ;5 sec Pause, dann K2 für 15 sec ein ;10 sec Pause, dann K2 für 15 sec ein ;10 sec nach K2 ein - K1 für 15 sec ein ;nach Ablauf K1 - 5 sec Pause ;K1 für 15 sec ein ;10 sec später K2 für 15 sec ein. ;nach Ablauf K2 Programm von vorn. ;************************************************************* ;* Pinbelegung ;* ---------------------------------- ;* GP: 0 > Ausgang Karusell 1 ;* 1 > Ausgang Karusell 2 ;* 2 > Ausgang Starthupe für beide Karusells ;* 3 < Eingang Start ;* 4 > Ausgang Licht Karusell 1 ;* 5 > Ausgang Licht Karusell 2 ;************************************************************* ;* Vereinbarungen ;* ---------------------------------- list p=12f629 ;Controllertyp #include <P12f629.INC> ;Standardheaderfile für 12F629 __CONFIG _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ; ;************************************************************* ;* Variablendefinition ;* ----------------------------------- #define K1 GPIO,0 #define K2 GPIO,1 #define H GPIO,2 #define Start GPIO,3 #define L1 GPIO,4 ;noch nicht benutzt #define L2 GPIO,5 ;noch nicht benutzt loops Equ 0x20 ;Zähler für Warteschleife loops1 Equ 0x21 ;Zähler für Warteschleife loops2 Equ 0x22 ;Zähler für Warteschleife ;************************************************************* org 0x00 goto prog ;************************************************************* ;* Initialisierung ;* ---------------------------------- init bcf STATUS, RP0 ;Auswahl Bank 0 clrf GPIO ;alle E/A aus movlw 0x07 ;Vorbereitung für Komperator aus movwf CMCON ;Komperator aus, Freigabe GP4+5 bsf STATUS, RP0 ;Umschalten auf Bank 1 movlw B'00001000' ;GP3=Eingang GP0,1,2,4,5 Ausgang movwf TRISIO ;nach Register schieben bcf STATUS, RP0 ;Rückschalten auf Bank 0 bsf STATUS, RP0 ;Umschalten auf Bank 1 call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung movwf OSCCAL ;4 MHz Kalibrierung bcf STATUS, RP0 ;Rückschalten auf Bank 0 return ;Rückkehr nach call ;************************************************************* ;* Hauptprogramm ;* ---------------------------------- prog call init ;Aufruf Initialisierung M1 btfss Start ;Abfrage Eingang, wenn 1 überspringe nächsten Befehl goto M1 ;warte bis Starttaster gedrückt ;---------------------------------------------------------------------- bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K1 ;Karusell 1 ein movlw D'60' ;Lade Zeit für 15 sec movwf loops call wait bcf K1 ;Karusell 1 aus ;------------------------------------------------------------------- movlw D'20' ;5 sec Pause movwf loops call wait ;------------------------------------------------------------------- bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K2 ;Karusell 2 ein movlw D'60' ;Lade Zeit für 15 sec movwf loops call wait bcf K2 ;Karusell 2 aus ;-------------------------------------------------------------------- movlw D'40' ;10 sec Pause movwf loops call wait ;-------------------------------------------------------------------- bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K2 ;Karusell 2 ein movlw D'40' ;Lade Zeit für 10 sec movwf loops call wait bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K1 ;Karusell 1 ein, 2 läuft noch movlw D'20' ;5 sec Restlaufzeit für Karusell 2 movwf loops call wait bcf K2 ;Karusell 2 aus; Karusell 1 noch 10 sec weiter movlw D'40' ;10 sec Restlaufzeit für Karusell 1 movwf loops call wait bcf K1 ;Karusell 1 aus ;-------------------------------------------------------------------- movlw D'20' ;5 sec Pause movwf loops call wait ;-------------------------------------------------------------------- bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K1 ;Karusell 1 ein movlw D'20' ;Lade Zeit für 5 sec movwf loops call wait bsf H ;Hupe ein movlw D'8' ;Lade Zeit für 2 sec. movwf loops call wait bcf H ;Hupe aus movlw D'4' ;1 sec Pause movwf loops call wait bsf K2 ;Karusell 2 ein, 1 läuft noch movlw D'40' ;10 sec Restlaufzeit für Karusell 2 movwf loops call wait bcf K1 ;Karusell 1 aus; Karusell 2 noch 5 sec weiter movlw D'20' ;5 sec Restlaufzeit für Karusell 2 movwf loops call wait bcf K2 ;Karusell 2 aus ;-------------------------------------------------------------------- movlw D'20' ;5 sec Pause movwf loops call wait goto M1 ;Sprung an Anfang ;-------------------------------------------------------------------- ;************************************************************* ;* Unterprogramme ;* ---------------------------------- ; ; Warteschleife 250ms*Wert aus loops wait movlw D'250' ;1. Zähler auf 250 movwf loops1 wai movlw D'250' ;2. Zähler auf 250 movwf loops2 ;loops1 wird 250 mal durchlaufen => 250*250*4µs => 250ms wai2 nop ;loops2 wird 250 mal durchlaufen je 4 Befehle = 4µs => 1ms decfsz loops2, F ;2. Zähler minus 1, schon 0? goto wai2 ;nein, noch nicht decfsz loops1, F ;1. Zähler minus 1, schon 0? goto wai ;nein, noch nicht decfsz loops, F ;3. Zähler minus 1, schon 0? goto wait ;nein noch nicht retlw 0 ;Rückkehr zum Hauptprogramm end
-
Also, wenn der Simulator schon OK anzeigt, dann weist das eher auf eine Hardwaregeschichte hin.
Ich sehe ehrlich gesagt auch nix auffälliges, aber frag am besten hier nochmal nach
http://www.mikrocontroller.net/forum/mikrocontroller-elektronik
-
Ein Schaltplan währe mal nicht Schlecht - Wenn die Simulation funktioniert, wird es vermutlich an der Schaltung lieget. Hast du den mal Spannung & Ströme an den Ports gemessen?