;***************************************************************************************************| ;***************************************************************************************************| ;**************** **************| ;**************** Steuerprogramm für die Stromversorgung des Digitalen Sprachlabors **************| ;**************** **************| ;***************************************************************************************************| ;***************************************************************************************************| ; | ; Beschreibung des Programmablaufes: | ; | ; Der Taster an GPIO 3 wird abgefragt. Den Betriebszustand ermittelt das Programm über das | ; Indikatorbit EINAUS,1 . So wird immer wechselnd geschalten. | ; Im Grundzustand leuchtet nur die rote LED. Wird der Taster gedrückt, so wird das 12V-Relais | ; angezogen, welches das Lastrelais der Stromversorgung schaltet. | ; Dieser Zustand wird durch die grüne LED angezeigt. Danach wird noch zwei Sekunden gewartet, | ; um versehentliche Mehrfachabfrage des Tasters zu vermeiden. | ; Dann gehts zurueck ins Hauptprogramm. | ; Wird der Taster abermals betaetigt, wird die Ausschaltroutine ausgeführt. | ; Die gelbe LED wird aktiv und das PC_PWR-Relais zieht fuer eine Sekunde lang an. | ; In den Rechnern ist eine Schaltung Implementiert, welche das Signal des Relais | ; kurzschluss auf PWR-Jumper) nur bei aktivem PC durchlässt. | ; Es folgt noch eine wartezeit zum runterfahren der Rechner von 5 Sekunden. | ; Dann fällt auch das 12V-Relais ab und die Rote LED wird aktiv. | ; Das Programm befindet sich wieder im Ausgangszustand. | ;--------------------------------------------------------------------------------------------------- ;--------------------------------Konfiguration------------------------------------------------------- list p=12F675 ;Prozessortyp angeben #include ;Iclude Datei für Controllervariablen einfügen ;Config-Bits __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF Errorlevel -302 ;BANKSEL-Meldungen abschalten ;---------------------------------------------------------------------------------------------------- ;---------------------------------Initialisierung---------------------------------------------------- org 0x000 ; Starte in Programmadresse 0 call 0x3FF ; Laden des Kalibrierungswertes aus der letzten Speicherstele movwf OSCCAL ; Den Wert in OSCCAL schieben (OSCilatorCALibrierung) EINAUS EQU 0x20 ; Die Variable für Schaltzustand wird deklariert sekunden EQU 0x21 ; Zählschleifenvariable 1. Zeit in Sekunden loops2 EQU 0x22 ; Zählschleifenvariable 2 loops3 EQU 0x23 ; Zählschleifenvariable 3 loops4 EQU 0x24 ; Zählschleifenvariable 4 bsf CMCON, CM0 ; Die ADC-Wandler werden auf Digitale IO's umgeschaltet bsf CMCON, CM1 ; bsf CMCON, CM2 ; bsf STATUS, RP0 ; Statusregister: Setze bit RP0 == Auswahl Bank 1 ; ; ; Pinbelegung 12F675 ; ___ ; 5V VDD---- | | ----VSS 0V ; Relais 12V GP5---- | | ----GP0 Relais PC-PWR ; LED rot GP4---- | | ----GP1 LED gruen ; Taster GP3---- |___| ----GP2 LED gelb ; ; ; movlw B'00001000' ; MSB nicht implementiert. GPIO 5, 4, 2, 1, 0 = Outputs ; GPIO 3 = Input movwf TRISIO ; Konfig-Wert ind TRIS-Input/Output schieben clrf ANSEL ; A-D Wandler abschalten bcf STATUS, RP0 ; Statusregister: Loesche RP0 wieder == Auswahl Bank 0 clrf INTCON ; Interupts abschalten movlw B'00101111' ; geschalet wird immer negativ. LED rot ist als einziges an movwf GPIO; clrf EINAUS ; EINAUS auf 0 setzen ;--------------------------------------------------------------------------------------------------- ;----------------------------------------Hauptprogramm---------------------------------------------- ; Label MAIN = Hauptprogrammschleife MAIN btfsc GPIO, 3 ; überspringe nächsten Befehl wenn schalterbit NICHT gesetzt ist ; (Im Ruhezustand ist Bit gesetzt) goto MAIN ; Wenn Schalter in Ruhezustand frage weiter ab btfss EINAUS, 1 ; Wenn Bit EINAUS, 1 NICHT gesetzt ist, gehe zu Label EINSCHALTEN ; Befehl heisst: wenn bit gesetzt ist Überspringe naechsten Befehl goto EINSCHALTEN ;-------------------------------------Ausschaltroutine----------------------------------------------- ; Label ausschalten, wird nach Tastendruck aufgerufen, wenn ; EINAUS-bit 1 gesetzt ist AUSSCHALTEN movlw B'00011010' ; neue Pinwerte. jetzt sind beide Relais angezogen movwf GPIO ; und die gelbe LED aktiv bcf EINAUS, 1 ; Das Indikatorbit für den Betriebszustand wird gelöscht movlw D'1' ; 1 Sekunde Wartezeit movwf sekunden ; diese Sekunde lang zieht das PC-PWR Relais an call WAIT ; Warteprozedur mit 1 Sekunde aufrufen movlw B'00011011' ; Nur noch die gelbe LED leuchtet und das 12V-Realsi ist aktiv movwf GPIO ; movlw D'5' ; Zeitwert 5 Sekunden movwf sekunden ; call WAIT ; Warteprozedur mit 5 Sekunden aufrufen movlw B'00101111' ; Das 12V-Relais fällt ab und die rote LED wird aktiv goto MAIN ; und wieder zurück in die Hauptfunktion ;---------------------------------------------------------------------------------------------------- ;-------------------------------------Einschaltroutine----------------------------------------------- ; Label EINSCHALTEN EINSCHALTEN movlw B'00011101' ; Neue Pinbeschaltung GPIO. Jetzt sind Relais 12V und LED gruen an movwf GPIO; bsf EINAUS, 1 ; jetzt wird das EINAUS bit auf 1 gesetzt movlw D'2' ; Die Verzögerungsschleife wird auf 2s gesetzt, um versehentliches movwf sekunden ; mehrfacheinlesen zu vermeiden call WAIT ; Zeitschleife durchlaufen, bevors wieder ins Hauptprogramm geht goto MAIN ; Und zurück zum Anfang ;---------------------------------------------------------------------------------------------------- ;------------------------------------Warteschleife--------------------------------------------------- ; Die Größe der Variablen "Sekunden" gibt die Durchläufe an. ; Ein Gesamtdurchlauf ist ca 1 Sekunde WAIT movlw D'4' ; 4x250ms =1s movfw loops2 W2 movlw D'250' ; 250ms -Teil movwf loops3 W3 movlw D'110'; ; 110mal wird die Schleife durchlaufen um movwf loops4; ; 1ms zu ergeben W4 nop nop nop nop nop nop decfsz loops4, F ; Überprüfung ob 1 ms vorbei goto W4 ; noch nicht? dann nochmal ab W4 decfsz loops3, F ; 250ms vorbei? goto W3 ; noch nicht? dann nochmal ab W3 decfsz loops2, F ; 1s vorbei? goto W2 ; noch nicht? dann nochmal ab W3 decfsz sekunden ; wert sekunden abgelaufen? goto WAIT ; noch nicht? dann nochmal ab WAIT retlw 0 ; gehe zurück ins Programm mit '0' im Akku ;----------------------------------------------------------------------------------------------------- END