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?


Anmelden zum Antworten