(* Uebertragungsparameter fuer Kanal 2 und 3 (SCC) setzen *)
(* Vers. 1.2 : 'setup'-Prozedur / 03.02.86, M.Staubermann *)
PACKET scc DEFINES baudrate,
setup ,
channel a,
channel b,
no parity,
even parity,
odd parity,
read port,
write port,
register,
quartz :
BOOL CONSTchannel a :: TRUE ,
channel b :: FALSE ;
INT CONST no parity :: 0,
even parity :: 3,
odd parity :: 1;
REAL VAR clk frequency := 12288000.0 ; (* Oszillatorfrequenz *)
LET offset = 0 ;
PROC quartz (REAL CONST wert) :
clk frequency := wert
ENDPROC quartz ;
REAL PROC quartz :
clk frequency
ENDPROC quartz ;
PROC setup (BOOL CONST channel, INT CONST parity,
REAL CONST stopbits, INT CONST bits,
BOOL CONST dtr, rts, auto dtr, auto cts) :
(* Parameter müssen zusammen gesetzt werden, da die Register keine
Read-Register sind. Alte Werte müssen ausserhalb des SCC's gespeichert
werden. *)
INT VAR value := 64 ;
value INCR parity value ;
value INCR stopbit value ;
register (channel, 3, 0) ;
register (channel, 5, 32 * bits value) ;
register (channel,14, 2) ;
register (channel, 4, value) ;
register (channel, 5, 8 + dtr value + rts value + 32 * bits value) ;
register (channel,14, 3 + auto dtr value) ;
register (channel, 3, 1 + 64 * bits value + auto cts value) .
bits value :
IF bits <= 5 THEN 0
ELIF bits >= 8 THEN 3
ELIF bits = 6 THEN 2
ELSE 1
FI .
parity value :
IF parity >= 0 AND parity <= 3 THEN parity ELSE 0 FI .
stopbit value :
IF stopbits = 1.0 THEN 4
ELIF stopbits = 1.5 THEN 8
ELIF stopbits = 2.0 THEN 12
ELSE 4
FI .
dtr value :
IF dtr THEN 128 ELSE 0 FI .
rts value :
IF rts THEN 2 ELSE 0 FI .
auto cts value :
IF auto cts THEN 32 ELSE 0 FI .
auto dtr value :
IF auto dtr THEN 4 ELSE 0 FI .
ENDPROC setup ;
PROC baudrate (BOOL CONST channel, REAL CONST rate) :
INT CONST time constant :: int (clk frequency / (64.0 * rate) + 0.5) - 2 ;
register (channel, 13, time constant DIV 256) ;
register (channel, 12, time constant AND 255)
ENDPROC baudrate ;
REAL PROC baudrate (BOOL CONST channel) :
INT CONST time constant ::
register (channel, 12) + 256 * register (channel, 13) ;
round (clk frequency / (real (time constant + 2) * 64.0), 1)
ENDPROC baudrate ;
(*********************************************************************)
(********* S C C - Z u g r i f f s p r o z e d u r e n ********)
(*********************************************************************)
INT PROC read port (INT CONST port) :
INT VAR value ;
control (-1, offset + port, -1, value) ;
IF value = -1 THEN errorstop ("SCC - Read failed") ; 0
ELSE value
FI .
ENDPROC read port ;
PROC write port (INT CONST port, value) :
INT VAR rcode, my channel := channel ;
continue (32) ;
control (-1, offset + port, value, r code) ;
continue (my channel) ;
IF r code = -1 THEN errorstop ("SCC - Write failed") FI
ENDPROC write port ;
INT PROC register (BOOL CONST is channel a, INT CONST register x) :
INT VAR value ;
IF is channel a
THEN write port (1, registerx) ;
read port (1)
ELSE write port (0, registerx) ;
read port (0)
FI
ENDPROC register ;
PROC register (BOOL CONST is channel a, INT CONST register x, wert):
IF is channel a
THEN write port (1, register x) ;
write port (1, wert)
ELSE write port (0, register x) ;
write port (0, wert)
FI
ENDPROC register ;
ENDPACKET scc ;