;**************************************************************
;*
;* Tee O Matic Steuerung
;*
;* zur Vermitlung zwischen "Teesiebheber" und wmTea "Computer Tee Timer"
;* Kommunikation erfolgt ueber RS232
;*
;* Thomas "tseiman" Schmidt
;*
;*
;* Prozessortakt: 4 MHz
;* RS232-Baudrate: 2400 Baud
;*
;*
;* $Id$
;*
;*
;**************************************************************
;*
;* Pinbelegung
;* ----------------------------------
;*
;* PORTA:
;*
;* 0 OK1 (Optokoppler) angeschlossen an Aktor
;* 1 OK2 (Optokoppler) N.C.
;* 2 Eingang, Sensor HAL (Magnetsensor) zur Endlagenaufnahme
;* 3 Eingang, Sensor HAL (Magnetsensor) zur Endlagenaufnahme
;* 4 Taster S2 "Function"
;* 5 Taster S1 "Reset"
;* 6 Taktgeber
;* 7 Taktgeber
;*
;* PORTB:
;* 0 RS232
;* 1 RS232
;* 2 RS232
;* 3 RS232
;* 4 LED IN2
;* 5 LED IN1
;* 6 LED OUT2
;* 7 LED OUT1
;*
;**********************************************************
; Includedatei für den 16F84 einbinden
list
p=16f628
#include <P16f628.INC1>
; __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES
;**********************************************************
; Variablennamen vergeben
w_temp equ
0x20
status_temp equ
0x21
Zeichen equ
0x22
DatenSindDa equ
0x24
loops equ
0x25 ; Zähler für Warteschleife
loops2 equ
0x26 ; Zähler für Warteschleife
inputLen equ
0x27
strAddr equ
0x28
FSR_temp equ
0x29
INDF_temp equ
0x30
cmdBuffer equ
0x60
cmdBuffer1 equ
0x61
cmdBuffer2 equ
0x62
cmdBuffer3 equ
0x63
cmdBuffer4 equ
0x64
cmdBuffer5 equ
0x65
cmdBuffer6 equ
0x66
cmdBuffer7 equ
0x67
cmdBuffer8 equ
0x68
cmdBuffer9 equ
0x69
cmdBuffer10 equ
0x6a
cmdBuffer11 equ
0x6b
cmdBuffer12 equ
0x6c
cmdBuffer13 equ
0x6d
cmdBuffer14 equ
0x6e
cmdBuffer15 equ
0x6f
cmdBuffer16 equ
0x70
cmdBuffer17 equ
0x71
cmdBuffer18 equ
0x72
cmdBuffer19 equ
0x73
cmdBuffer20 equ
0x74
;**********************************************************
; daten ins EEPROM legen
startMsg equ
d'8448'-d'8448'
org
d'8448' ; H'2100' das EEPROM beginnt hier
de
"Tee O Matic V0.1 (c) 2004,5 by Thomas Schmidt",0
statusMsg equ
d'8500'-d'8448' ; Status String
org
d'8500'
de
"Status",0
portMsg equ
d'8507'-d'8448' ; Status String
org
d'8507'
de
"Port",0
okMsg equ
d'8512'-d'8448' ; Befehl korrekt
org
d'8512'
de
"OK",0
errMsg equ
d'8515'-d'8448' ; Befehl fehlerhaft, fehler bei ausfuehrung
org
d'8515'
de
"ERR",0
atrsMsg equ
d'8519'-d'8448' ; Lese Sensor (<n>)
org
d'8519'
de
"ATRS",0
atwaMsg equ
d'8524'-d'8448' ; Schreibe Wert (<n>) auf Aktor
org
d'8524'
de
"ATWA",0
atdtMsg equ d'8529'-d'8448' ; Start Tee brüh Sequenz
org
d'8529'
de
"ATDT",0
atzMsg equ d'8534'-d'8448' ; beende Teebrüh Sequenz - mit schwenken
org
d'8534'
de
"ATZ",0
atstaMsg equ
d'8538'-d'8448' ; Status ausgeben
org
d'8538'
de
"ATSTA",0
atresetMsg equ
d'8545'-d'8448' ; Gerät zurücksetzen
org
d'8545'
de
"ATRESET",0
atxzMsg equ
d'8554'-d'8448' ; Tee Sieb - auf ohne schwenken
org
d'8554'
de
"ATXZ",0
err1Msg equ
d'8559'-d'8448'
org
d'8559'
de
"ERR1",0
err2Msg equ
d'8564'-d'8448'
org
d'8564'
de
"ERR2",0
atvMsg equ
d'8569'-d'8448'
org
d'8569'
de
"ATV",0
;**********************************************************
; Programmcode
org
0
goto
init
;**********************************************************
; Interruptroutine für RS232-Empfang
org
4 ; Interrupt beginnt immer bei Adresse 4
int
movwf
w_temp ; status retten
swapf
STATUS,w
movwf
status_temp
; RS232-Empfänger-Interupt?
btfss
PIR1,RCIF
goto
intEnde ; Interrupt kam von wo anders
movf
w
RCREG ; RS232-Register auslesen
movwf
Zeichen ; und in den Speicher nach 'Zeichen' schreiben
; movwf
PORTB ; Zeichen am PortB anzeigen
bsf
DatenSindDa,0 ; Kennzeichen für gültige Daten setzen
bcf
PIR1,RCIF ; interrupt-Flag löschen
intEnde ; geretteten Status wieder zurückschreiben
swapf
status_temp,w
movwf
STATUS
swapf
w_temp,f
swapf
w_temp,w
retfie
;**********************************************************
; Anfangsinitialisierung
init
; Alle Komperator Eingaenge auf Digital umschalten
bcf
STATUS, RP0 ; auf Bank 0 umschalten
bsf
CMCON, CM0
bsf
CMCON, CM1
bsf
CMCON, CM2
; port A Eingaenge konfigurieren
bsf
STATUS, RP0 ; auf Bank 1 umschalten
movlw
B'00111100' ; Die ersten beiden Ports sind am Optokoppler
; Dann kommen die beiden Sensoren & die Taster
; und die letzten beiden sind fuer den Taktgeber
movwf
TRISA
bsf
PORTB,2 ; RB2, TX auf high
; port B Eingaenge konfigurieren
movlw
B'00000011' ; PortB alle output RB0 - RB3 sind USART, wobei RB0+1 = RTS und RX - deshalb Eingang,
; RB4-RB7 sind die LEDs
movwf
TRISB
bcf
STATUS, RP0 ; auf Bank 0 zurückschalten
bcf
PORTA,1 ; Auf jedenfall den Aktor Ausgang 0-en
; Variablen initialisieren
clrf
DatenSindDa
; clrf
inputLen
movlw
cmdBuffer
movwf
FSR
call
bufferLoeschen
; USART initialisieren
bsf
STATUS,RP0 ; Bank1
movlw
0x20 ; Sender: RS232
movwf
TXSTA ;
bcf
STATUS,RP0 ; Bank 0
movlw
0x90 ; Empfänger: RS232
movwf
RCSTA ;
; USART Baudrate einstellen
bsf
STATUS,RP0 ; Bank1
movlw
D'25' ; Baudrate = 2400 Baud
movwf
SPBRG
bcf
TXSTA, BRGH ; BRGH=0
bcf
STATUS,RP0 ; Bank 0
;Interrupts vorbereiten
bsf
STATUS,RP0 ; Bank1
bsf
PIE1,RCIE ; Enable receive interrupts
bcf
STATUS,RP0 ; Bank 0
clrf
PIR1 ; Interruptflag löschen
; clrf
PIR2
bsf
INTCON,GIE ; generell Interrupts erlauben
bsf
INTCON,PEIE ; Interrupts von Peripheriegeräten erlauben
; **********************************************************
; nen bischen startup show
call
startupLED
; **********************************************************
; meldung über RS232 ausgeben
call
termStartMsg
; **********************************************************
; 3sec warten bis sich alles beruhigt hat
call
wait3sec
btfss
PORTA,2 ; ist der Aktor ausgefahren ?
call
AktorImpuls ; wenn nicht dann machen wir das jetzt !
; Startup Squenz END
; **********************************************************
; **********************************************************
; Hauptschleife
; Einen Teil der Zustaende Pollen wir (leider sind nicht alle Ports)
; faehig interrupts auszulösen
Loop ; <<<<<<<<<<<<<<<< PROGRAMM HAUPTSCHLEIFE BEGIN
call
sensorLedSet ; die Signal LEDs setzen (geben Auskunft über den Sensor Zustand)
btfss
PORTA,4 ; ist S2 (Function) betätigt
call
AktorImpuls ; - betätige auch den Aktor
; *****************************************
; RS232 Behandlung (Ausgabe)
btfsc
DatenSindDa, 0
call
reciveData
; goto
Loop
; *****************************************
goto
Loop ; <<<<<<<<<<<<<<<< PROGRAMM HAUPTSCHLEIFE END
#include
<aktor.inc>
#include
<time.inc>
#include
<string.inc>
#include
<terminal.inc>
#include
<cmd.inc>
end
|