Hallo !
Habe von einem Freund mehrere Programme für Lichteffekte ,Decoder usw,bekommen !Diese stammen von einer Miba CD.
jetzt wollten wir wissen ob die Programme sowie sie sind einfach auf einen Chip zu brennen sind oder ob da noch was verändert werden muss .
Mfg
;**************************************
; Projekt aus "PICs für Modellbahner"
; Flackerlicht
;**************************************
; Festlegung der Eigenschaften des PIC18F1320
;
#INCLUDE Config_1320.asm
;*******************************
; Variablen
;
CBLOCK 000H ; Var im Bereich 0..FFh
WaitCount ; WaitMs
ZufallsZahlLo ; Zufall
ZufallsZahlHi
ENDC
;*******************************
; Hier startet der PIC nach dem Einschalten der +5V
;
ORG 0000H ; Reset vector
;=============================
; Erzeugt ein Flackerlicht mit 12 Leds (Led#11..#0).
; Verwendet LATA,3..0 und LATB,7..0
; Verwendet die gleiche Schaltung wie das Lauflicht.
; LATA,3 steuert Led#11, LATB,0 steuert Led#0
; CALL: WaitMs, Zufall
;
Flackerlicht:
;
; Alle Portpins sind digital In/Out (nicht analog In)
;
MOVLW B'01111111'
MOVWF ADCON1
;
; Konfiguriere alle Pins von PortA und PortB
; als Ausgang
;
CLRF TRISA
CLRF TRISB
;
; Setze den Startwert für die Zufallszahl = 0
;
CLRF ZufallsZahlLo
CLRF ZufallsZahlHi
FlackerLoop:
;
; Bilde die nächste 15 Bit-Zufallszahl
;
RCALL Zufall
;
; Kopiere die 15 Bit-Zufallszahl an die
; Portpins
;
MOVFF ZufallsZahlHi,LATA
MOVFF ZufallsZahlLo,LATB
;
; Warte 50 ms...
;
MOVLW .50
RCALL WaitMs
;
; ..und bilde die nächste Zufallszahl
;
BRA FlackerLoop
;==============================
; Prozeduren
;-------------------------------
; Zufall erzeugt eine 15 Bit Zufallszahl
; WaitMs wartet W Millisek
;-------------------------------
; Erzeugt eine Zufallszahl von 15 Bit Länge (Bit#0..Bit#14), die
; durch Linksrotation zweier Register und durch Einspeisen eines
; geeigneten Wertes in Bit#0 gewonnen wird.
; Dazu werden Bit#13 und Bit#14 miteinander verglichen. Enthalten
; beide Bits eine '1' oder beide Bits eine '0', wird von links
; eine '1' in das Doppelregister geschoben. Sind Bit#14 und Bit#13
; ungleich, so wird eine '0' eingespeist.
; Beim nächsten Aufruf der PROC hat Bit#0 den Wert übernommen
; und alle anderen Bits sind um eine Stelle nach links verschoben.
; Diese Art der Rückkopplung gewährleistet, dass das
; Doppelregister erst nach 32767 Takten wieder den Anfangszustand
; erreicht hat. ; Andere Rückkopplungen würden einen kürzeren
; Zyklus ergeben.
;
; Eing: ZufallsZahlHi:Lo
; Ausg: nächste ZufallsZahlHi:Lo
;
Zufall; PROC
; Hole ZufallsZahlHi ins W.
; Isoliere Bit#14 und Bit#13 durch logisches AND.
;
MOVF ZufallsZahlHi,W
ANDLW B'01100000'
;
; Bereite im Cy-Flag = 1 vor.
; Wenn jetzt W = 0 (Zeroflag = 1) ist, dann sind beide Bits
; '0' gewesen. Rotiere das gesetzte Cy-Flag in die Zufallszahl.
;
BSF STATUS,C
BZ Rotation ; gehe zur Rotation
;
; Wenn beide Bits '1' sind, rotiere ebenfalls das gesetzte
; Cy-Flag in die Zufallszahl.
; XOR verändert das gesetzte Cy-Flag nicht !
;
XORLW B'01100000'
BZ Rotation ; gehe zur Rotation
;
; Bit#14 ist ungleich Bit#13
; Bereite Cy-Flag = 0 für die Rotation vor
;
BCF STATUS,C
;
; Rotiere das vorbereitete Cy-Flag nach links
; in die 15 Bit-Zahl ZufallsZahlHi:Lo
;
Rotation: RLCF ZufallsZahlLo,F
RLCF ZufallsZahlHi,F
RETURN ; from Zufall
;-------------------------------
; Wartet 1..255 ms und kehrt dann zum aufrufenden
; Programm zurück.
; Voraussetzung: Clockfrequenz des PIC = 31,25 kHz
; Eing: W = Anzahl ms
; Ausg: W = unverändert
; Uses: WaitCount
;
WaitMs; PROC
MOVWF WaitCount ; W bleibt, wie..
WaitM_2: ; ..es ist
NOP ; Fülle die..
NOP ; .. Schleife..
NOP ; ..auf 1 ms-
NOP ; Dauer auf.
NOP
DECFSZ WaitCount,F
BRA WaitM_2
RETURN ; from WaitMs
;==============================
END