]> cloudbase.mooo.com Git - avrcpm.git/blame - cpm/utils/RTCDEMO.PAS
* cpm/BIOS.MAC
[avrcpm.git] / cpm / utils / RTCDEMO.PAS
CommitLineData
d8fa6a36
L
1program RTCDemo;\r
2{$C- } {Sonst funktioniert 'keypressed' nicht}\r
3\r
4{---------------------------------------------------------------------\r
5 AVRCPM \r
6 Test und Demonstration des I2C-Interface\r
7 I2C Uhrenchip PCF8583 \r
8 Zeit und Datum lesen und schreiben\r
9\r
10 Moegliche Erweiterung (TODO:):\r
11 - Control/Status-Register und Alarmregister lesen/schreiben\r
12 - RAM lesen/schreiben\r
13\r
14 $Id$\r
15----------------------------------------------------------------------}\r
16 \r
17const\r
18 I2CCMD = 5; {adr of I2C Command Port (1=read, 2=write)}\r
19 I2CMSGLEN = 6; {Transferpuffergroesse}\r
20 I2CADRL = 7; {Transferpufferadresse low/high}\r
21 I2CADRH = 8;\r
22\r
23 I2C_CMD_Read = 1; {I2C Read Command}\r
24 I2C_CMD_Write = 2; {I2C Write Command}\r
25\r
26 { TP Delay Loop }\r
27 T100ms = 100; {20MHz AVR + Config fuer 3 MHz Z80 (TINST)}\r
28 {T100ms = 75;} {20MHz AVR + Config fuer 4 MHz Z80 (TINST default)}\r
29\r
30type\r
31 I2CBufLen = 0..16;\r
32\r
33 CalTime = record\r
34 sec: 0..59;\r
35 min: 0..59;\r
36 hrs: 0..23;\r
37 day: 1..31;\r
38 month: 1..12;\r
39 year: integer;\r
40 end;\r
41\r
42 DTinput = array [1..3] of integer;\r
43\r
44var\r
45 msgbuf : array[0..16] of Byte; {TODO: Transferbuffer nicht global}\r
46\r
47 Time : CalTime;\r
48 Done: boolean;\r
49\r
50{---------------------------------------------------------------------\r
51 Debugging: Print 16 byte RAM ab adr \r
52----------------------------------------------------------------------}\r
53procedure hexdump(adr: integer);\r
54var\r
55 i: integer;\r
56 c: byte;\r
57\r
58 function hexdigit(c: byte): char;\r
59 begin\r
60 if c < 10 then\r
61 hexdigit := char(c + $30)\r
62 else\r
63 hexdigit := char(c - 10 + $41);\r
64 end;\r
65\r
66{TODO: print adr }\r
67begin\r
68 for i := 0 to 15 do\r
69 begin\r
70 c := Mem[adr+i];\r
71 write(hexdigit(c shr 4), hexdigit(c and $f), ' ');\r
72 end;\r
73 writeln;\r
74end;\r
75\r
76{---------------------------------------------------------------------\r
77 I2C - Routinen\r
78----------------------------------------------------------------------}\r
79procedure i2c_init;\r
80var\r
81 i: integer;\r
82begin\r
83 msgbuf[0] := $A0; {I2C-Adresse des RTC-Chips}\r
84\r
85 Port[I2CADRH] := Hi(Addr(msgbuf));\r
86 Port[I2CADRL] := Lo(Addr(msgbuf));\r
87end;\r
88\r
89procedure i2c_write(len:Byte);\r
90begin\r
91 Port[I2CMSGLEN] := len;\r
92 Port[I2CCMD] := I2C_CMD_Write;\r
93end;\r
94\r
95procedure i2c_read(len:Byte);\r
96begin\r
97 Port[I2CMSGLEN] := len;\r
98 Port[I2CCMD] := I2C_CMD_Read;\r
99end;\r
100\r
101\r
102function BCDtoBINbyte(i: byte): byte;\r
103begin\r
104 BCDtoBINbyte := (i div 16) * 10 + (i and $F);\r
105end;\r
106\r
107function BINtoBCDbyte(i: byte): byte;\r
108begin\r
109 BINtoBCDbyte := (i div 10) * 16 + (i mod 10);\r
110end;\r
111\r
112procedure ReadRTC(var t: CalTime);\r
113begin\r
114 msgbuf[1] := 2;\r
115 i2c_write(2);\r
116 i2c_read(6);\r
117 with t do\r
118 begin\r
119 sec := BCDtoBINbyte(msgbuf[1]);\r
120 min := BCDtoBINbyte(msgbuf[2]);\r
121 hrs := BCDtoBINbyte(msgbuf[3] and $3F);\r
122 end;\r
123 msgbuf[1] := $10;\r
124 i2c_write(2);\r
125 i2c_read(3);\r
126 with t do\r
127 begin\r
128 day := BCDtoBINbyte(msgbuf[4] and $3F);\r
129 month:= BCDtoBINbyte(msgbuf[5] and $1F);\r
130 year := msgbuf[1] + 256*msgbuf[2];\r
131 while Lo(year) and $3 <> (msgbuf[4] shr 6) do\r
132 year := year + 1;\r
133 end;\r
134end;\r
135\r
136\r
137procedure WriteRTC(t: CalTime);\r
138begin\r
139 with t do begin\r
140 msgbuf[1] := 1; {register address}\r
141 msgbuf[2] := 0; {hundredth of sec}\r
142 msgbuf[3] := BINtoBCDbyte(sec);\r
143 msgbuf[4] := BINtoBCDbyte(min);\r
144 msgbuf[5] := BINtoBCDbyte(hrs);\r
145 msgbuf[6] := BINtoBCDbyte(day) + (Lo(year) shl 6);\r
146 msgbuf[7] := BINtoBCDbyte(month); {TODO: weekdays}\r
147 end;\r
148 i2c_write(8);\r
149\r
150 msgbuf[1] := $10; {register address}\r
151 with t do begin\r
152 msgbuf[2] := Lo(year);\r
153 msgbuf[3] := Hi(year);\r
154 end;\r
155 i2c_write(4);\r
156end;\r
157\r
158{---------------------------------------------------------------------\r
159 Dialog Routinen\r
160----------------------------------------------------------------------}\r
161\r
162procedure PrintTime(t: CalTime);\r
163begin\r
164 with t do {TODO: Fuehrende '0' statt ' '}\r
165 begin\r
166 write('Zeit: ', hrs:2, ':',min:2, ':',sec:2, ' ',\r
167 'Datum: ', day, '.', month, '.', year);\r
168 end;\r
169end;\r
170\r
171procedure PrintMenu;\r
172begin\r
173 ClrScr;\r
174 writeln('Menu:');\r
175 writeln(' T) Zeit setzen');\r
176 writeln(' D) Datum setzen');\r
177 writeln(' Q) Quit');\r
178 writeln('> ');\r
179end;\r
180\r
181function GetKey: char;\r
182var\r
183 c: char;\r
184begin\r
185 Read(Kbd, c);\r
186 GetKey := c;\r
187end;\r
188\r
189{Daemliche input routine ohne Fehlerpruefung (TODO:)}\r
190procedure GetDateTime(var a: DTinput; sep: char);\r
191var\r
192 line: String[80];\r
193 s: String[4];\r
194 i,j,k: integer;\r
195 rc: integer;\r
196\r
197begin\r
198 readln(line);\r
199 line := line + sep;\r
200 j := 1;\r
201 for i := 1 to 3 do\r
202 begin\r
203 k := 1;\r
204 while line[k+j] in ['0'..'9'] do\r
205 k := k + 1;\r
206 s := Copy(line, j, k);\r
207 val(s, a[i], rc);\r
208 j := j + k + 1;\r
209 end;\r
210end;\r
211\r
212procedure SetTime;\r
213var\r
214 a: DTinput;\r
215\r
216begin\r
217 write('Zeit (hh:mm:ss): ');\r
218 a[1] := -1;\r
219 GetDateTime(a, ':');\r
220{ writeln('intime:', a[1], ':', a[2], ':', a[3]);\r
221}\r
222 if (a[1] in [0..24]) and (a[2] in [0..59]) and (a[3] in [0..59]) then\r
223 begin\r
224 ReadRTC(Time);\r
225 Time.hrs := a[1];\r
226 Time.min := a[2];\r
227 Time.sec := a[3];\r
228 WriteRTC(Time);\r
229 end else\r
230 begin\r
231 writeln('Fehler in Eingabe.');\r
232 end;\r
233end;\r
234\r
235procedure SetDate;\r
236var\r
237 a: DTinput;\r
238\r
239begin\r
240 write('Datum (TT.MM.JJJJ): ');\r
241 a[1] := -1;\r
242 GetDateTime(a, '.');\r
243{ writeln('indate:', a[1], '.', a[2], '.', a[3]);\r
244}\r
245 if (a[1] in [1..31]) and (a[2] in [1..12]) and (a[3] > 0) and (a[3] <= 2076) then\r
246 begin\r
247 ReadRTC(Time);\r
248 Time.day := a[1];\r
249 Time.month:= a[2];\r
250 Time.year := a[3];\r
251 WriteRTC(Time);\r
252 end else\r
253 begin\r
254 writeln('Fehler in Eingabe.');\r
255 end;\r
256end;\r
257\r
258procedure CleanConsolebuffer;\r
259var\r
260 c: char;\r
261begin\r
262 while keypressed do c := GetKey;\r
263end;\r
264\r
265{---------------------------------------------------------------------\r
266 main\r
267----------------------------------------------------------------------}\r
268\r
269begin\r
270 PrintMenu;\r
271 i2c_init;\r
272\r
273 writeln;\r
274 Done := False;\r
275 repeat\r
276 Delay(T100ms);\r
277 ReadRTC(Time);\r
278 GotoXY(35,1); PrintTime(Time); ClrEol;\r
279 gotoXY(2,5); ClrEol;\r
280\r
281 if keypressed then\r
282 begin\r
283 gotoXY(1,7); ClrEol;\r
284 gotoXY(1,6); ClrEol;\r
285 case UpCase(GetKey) of\r
286 'T': SetTime;\r
287 'D': SetDate;\r
288 'Q': Done := True;\r
289 end;\r
290 end;\r
291 until Done;\r
292 CleanConsolebuffer;\r
293end.\r
294\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a