;**************************************************************
;*
;* 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