Code:
******************************************************************************
; Dateiname: Positionsbeleuchtung ohne Landebeleuchtung
; Autor: Thomas Pointhuber
; Datum: 25.05.09
; Version: 1.00
;
; Letzte Änderung: keine
;
;******************************************************************************
; Funktionsbeschreibung des Programms: Erstellt ein Blinklicht auf dem PORTA (0,1,2)
;
; RA,0 Positionsleuchte rechts
; RA,1 Positionsleuchte links
; RA,2 Positionsleuchte unten
; RC,1 Landeleuchte Flügel
; RC,2 Landeleuchte Propeller, Höhenruder, Seitenruder
;
;******************************************************************************
list p=16F630 ; "list" Anweisung zur Definition des Prozessors
#include <p16f630.inc> ; Einbinden von speziellen zum Controller gehörenden Variablen über die Datei *.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
;
; '__CONFIG' Diese Anweisung wird benutzt, um das Configurations-Word innerhalb des *.asm Datei einzubinden.
; Weitere Informationen zum Configurations-Word können auch dem Datenblatt entnommen werden.
; Die mit einem Sternchen * markierten Optionen sind ausgewählt worden.
;
; CP: Code Protection bit
; * OFF = Program Memory code protection is disabled
; ON = Program Memory code protection is enabled
; WDT: Watchdog Timer Enable bit
; ON = WDT enabled
; * OFF = WDT disabled
; BODEN: Brown-out Detect Enable bit
; * ON = BOD enabled
; OFF = BOD disabled
; PWRTE: Power-up Timer Enable bit
; OFF = PWRT disabled
; * ON = PWRT enabled
; MCLRE: GP3/MCLR pin function select
; ON = GP3/MCLR pin function is MCLR
; * OFF = GP3/MCLR pin function is digital I/O
; CPD: Data Code Protection bit
; * OFF = Data memory code protection is disabled
; ON = Data memory code protection is enabled
; Oscillator Variationen:
; LP_OSC = Low power crystal on GPIO4 and GPIO5
; XT_OSC = Crystal/resonator on GPIO4 and GPIO5
; HS_OSC = High speed crystal/resonator on GPIO4 and GPIO5
; EC_OSC = I/O function on GPIO4 pin, CLKIN on GPIO5
; * INTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, I/O function on GPIO5
; INTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, I/O function on GPIO5
; EXTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, RC on GPIO5
; EXTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, RC on GPIO5
;
;
ERRORLEVEL -302 ; Unterdrücken BANK SELECTION MESSAGES, dazu das ; Semikolon links entfernen
; ; Dies unterdrückt im Compiler die Nachricht "Register in operand not in bank 0. Ensure that bank bits are correct"
;
;*****************************************************************************
; Deklaration der Variablen und Konstanten
;******************************************************************************
;
schleife EQU H'0020' ; Anzahl der "schleifen"
help EQU H'0021' ; Hilfsvariable für verschiedene Aufgaben. Achtung der Inhalt wird nie gerettet!
sekunde EQU H'0022' ; Variable für die Einerstelle der Zahl
leuchten1 EQU H'0023' ; Variable für die Tabelle LED_PORTA
leuchten2 EQU H'0024' ; Variable für die Tabelle LED_PORTC
;******************************************************************************
org 0x000 ; Startadresse des PICs
goto EINSTELLUNGEN
;******************************************************************************
; INTERRUPT
org 0X004 ; Startadresse der ISR
retfie ; Beenden der ISR, zurück zum Programm
;******************************************************************************
; PIC***** Einstellungen
EINSTELLUNGEN
bsf STATUS,RP0 ; Auswahl Bank 1
movwf OSCCAL ; Neuladen der Kalibrirungswerte für den internen Takt
movlw B'00111000' ; 1=Eingang, 0=Ausgang
movwf TRISA
movlw B'00100000' ; 1=Eingang, 0=Ausgang
movwf TRISC
bcf STATUS,RP0 ; Zurück zu Bank 0
clrf PORTA ; Löschen aller Ausgänge
clrf PORTC ; Löschen aller Ausgänge
clrf INTCON ; Dekavieren eines Interuptes
;*************************************************************************
; HAUPTPROGRAMM
START
movlw B'11000111' ; Setzt alle Ausgänge von PORTA auf 1
movwf PORTA
movlw B'11011111' ; Setzt alle Ausgänge von PORTC auf 1
movwf PORTC
call PAUSE1s ; Macht 1 Sekunde Pause
clrf PORTA ; Löscht PORT A & C
clrf PORTC
call PAUSE1s ; Macht 1 Sekunde Pause
ABARBETUNG
bsf PORTA,0 ; Schaltet die Positoinsleuchten ein
bsf PORTA,1
bsf PORTA,2
call PAUSE250ms ; Macht 250ms Pause
bcf PORTA,0 ; Schaltet die Positionsleuchten der Flügel aus
bcf PORTA,1
call PAUSE250ms ; Macht 250ms Pause
bcf PORTA,2 ; Schaltet die Positionsleuchte unten aus
call PAUSE750ms ; Macht 750ms Pause
goto ABARBETUNG ; Geht zum Anfang der abarbeitung
;*************************************************************************
; UNTERPROGRAMM
PAUSE1ms ; Label, wo die Standardwarteschleife beginnt
movlw D'199' ; Dezimalwert für die Zeitkonstante damit PAUSE = 1ms ist
movwf schleife ; Schieben des Wertes 199 in die Variable "schleife"
; Ende der Start-Einstellungen für "PAUSE1ms"
PAUSEE ; Einsprungstelle für Pausenschleifen
nop
nop ; Taste nicht gedrückt, springe zur Marke "HAUPT" DECFSZ schleife,1
decfsz schleife,1 ; Dekrementiere die Variable "schleife" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSEE ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSEE"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 2 und 256 ms
;
PAUSE100ms
movlw D'100'
movwf help
PAUSE100
call PAUSE1ms
decfsz help,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE100 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 2 und 256 ms
;
PAUSE250ms
movlw D'250'
movwf help
PAUSE250
call PAUSE1ms
decfsz help,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE250 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE500ms
movlw D'2'
movwf sekunde
PAUSE500
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE500 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE750ms
movlw D'3'
movwf sekunde
PAUSE750
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE750 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE1s
movlw D'4'
movwf sekunde
PAUSE1
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE1 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE2s
movlw D'8'
movwf sekunde
PAUSE2
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE2 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE3s
movlw D'12'
movwf sekunde
PAUSE3
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE3 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
end ; Ende des Programmes
Lesezeichen