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 wir ü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