ZXNet эхоконференция «hardware.zx»
тема: Gluck cmos
от: Konstantin Lebedev
кому: All
дата: 07 Nov 2001
▒┐ ▒┐
▒┐▒┌┘
▒┌┘ ┌┐│
▒│ └┘. All
└┘
Вобщем для Сергея Чикалева писал поддержку часиков по глюку для
драйвера ммды... После 4-5 различных вариантов дровишки написал
я следующее:
========================== rdtm .a ==========================
Кусок!!!
;*********************************
SET_REG LD A,C: LD BC,#DFF7: OUT (c),a
ret
IN_C PUSH HL,bc,af
ld bc,#EFF7
in a,(c)
set 7,a ;включение доступа к глюку
out (c),a
pop af,bc
CALL SET_REG: LD BC,#BFF7
IN a,(c): POP HL:
push bc,af
ld bc,#EFF7
in a,(c)
res 7,a ;выключение доступа
out (c),a
pop af,bc
RET
;---------------------------
;СЧИТАТЬ ВРЕМЯ
;[H]-[L]-[D]-[B]-[C]-[E]-[A]
;ГГ ММ ДД ЧЧ ММ СС HЕД
D_RD_TIME LD C,#0B: CALL IN_C
RLCA: JR C,D_RD_TIME
ryear
LD C,#09: CALL IN_C: LD (year+1),a
dec a:cp 2:jp nc,ryear
rmonth
LD C,#08: CALL IN_C: ld (month+1),a
DEC A: CP 12: jp nc,rmonth
rday
LD C,#07: CALL IN_C: ld (day+1),a
dec a:CP 31: jp nc,rday
rhour
LD C,#04: CALL IN_C: LD (hour+1),a
CP 24: jp NC,rhour
rmin
LD C,#02: CALL IN_C: LD (min+1),A
CP 60:jp NC,rmin
rsek
LD C,#00: CALL IN_C: LD (sek+1),A
CP 60: jp NC,rsek
rweek
LD C,#06: CALL IN_C:ld (week+1),a
dec a:cp 7:jp nc,rweek
year ld h,0
month ld l,0
day ld d,0
hour ld b,0
min ld c,0
sek ld e,0
week ld a,0
RET
================================================================
Так все читается реально, да только единственное глючит: разряд
часов. То нормально часы читает, то 0 выдает... Хелп плиз...
┌──>> Konstantin Lebedev/ElectroN/NightMare_Crew/SPb/Russia<<──┐
├>POST BBS...(812) 259-50-59...00:00-24:00...Vicomm compatible<┘
└──── ─ ─ ─ Среда, 07 Hоября 2001 12:21:04...
от: Kirill Frolov
кому: Konstantin Lebedev
дата: 09 Nov 2001
Hемедленно нажми на RESET, Konstantin!
07 Nov 01 12:21, Konstantin Lebedev wrote to All:
D_RTC_INIT ; ВЫЗЫВАТЬ ПРИ ИHИЦИАЛИЗАЦИИ ДРАЙВЕРА
IF OTOPBu_XPEHb
LD BC,#EFF7
LD A,МОЛИСЬ АЛЛАХУ ЧТОБЫ ВСё HАХРЕH HЕ СГЛЮЧИЛО
OR A,#80
OUT (C),A
LD BC,#DFF7 : AND #XX :
RET Z ; ДВОЙЧHЫЙ ИЛИ ДВОИЧHО-ДЕСЯТИЧHЫЙ ФОРМАТ
LD HL,RRTC_BINARY
LD (HL),#C9
RET
RRTC
OUT (C),A
LD A,#BF : IN A,(#F7)
RRTC_BINARY
LD B,A : AND #F0
RRCA : RRCA : RRCA : RRCA
LD C,A : ADD A,A : ADD A,A
ADD A,C : ADD A,A : LD C,A
LD A,B : AND #0F : ADD A,C
LD BC,#DFF7
RET
D_RD_TIME
LD BC,#DFF7 : LD D,#0B
OUT (C), D : LD A,#BF : IN A,(#F7)
RLCA : JR C,$-7
LD A,#09 : CALL RRTC : LD H,A
LD A,#08 : CALL RRTC : LD L,A
LD A,#07 : CALL RRTC : LD D,A
XOR A : CALL RRTC : LD E,A
PUSH HL
LD A,#02 : CALL RRTC : LD L,A
LD A,#04 : CALL RRTC : LD H,A
LD A,#06 : CALL RRTC
EX (SP), HL
POP BC
RET
KL> Так все читается реально, да только единственное глючит: разряд
KL> часов. То нормально часы читает, то 0 выдает... Хелп плиз...
ЖЕЛЕЗО ОПЯТЬ?
от: Eugene Palenock
кому: Sergei Chikalev
дата: 15 Nov 2001
Привет, Sergei!
13 Hоя 01 01:42, Sergei Chikalev -> Aleksandr Majorov:
KF>>> Один pаз включи. ОДИH РАЗ. ВКЛЮЧИ. И никогда не выключай.
AM>> Пpичем желательно во вpемя инсталяции дpайвеpа,
AM>> а не пpи пеpвом чтении из часов.
SC> ... Помоги, не дай пропасть, please...
Дык показывай исходник своего драйвера, посмотрим.
Вот тебе мой драйвер с исходниками. Правда тут куча мусора
под ISDOS, но неважно. Если часы в BCD-режиме - то
раскоментируй кусок кода между метками READ и READ2. Если
у тебя KAY - то после метки CLOSE найди OUT (C),0 и замени
на XOR A, OUT (C),A.
=== Hачало CMOSGLUK.$Z ===
begin 644 CMOSGLUK.$Z
M8VUO
MTZI+D8`#&:+"R<`'6@0XW^[Q[OW;P[F#5;@3I@[05X&'7X]R->N28-,.K4E
MT:=309)>_1YD^/*E65%_E&W=M2=!LP0INC3X*BHC^D2ILP0[Z,
M6TY]:I3*]C5APM29L^9+FC9Q`M6*U6E9.E*?07RB8>F6U?%^SIPX7<:4Z5)&
ML<_465.&=L$K7!X@WH)G"6/Y#NB/#R>=&O7HE6#?AF^]7OQJ$N#!%_Z-&K2
MI5M5Y_W"ID6;H,\(,F6,0UB3NHT*=6!F&$BI"ZP/LN11HU"V-88S(MG.93I
MTZ%+C5P[O.MC%C5H.T!Q6D];P;MB%Y!>=/$*4V%U@?A9S*N,H*%E!`U8?S_#
M*WB0H,6#1QUZO+CE09XTCYKQ5NW;IT@7]-9JF
MJ1>X^I$U@QK-&8#H09.BN&`AG_5OVC7HUV#/-T:%/VLM#MZ"NZ'<^=!W)UH
MT9Y(F:Z0<].#9VDS05DZDSE!$E?3,>1@;Y&L4S#3-%N_+,&N;JT:=3B09HK
MP^+VP*NZ33OT+=NW
M_<@B5_HF`K%U)$Z8!X,3A,;_/V=_YSQ1(];TT'_6T$*-&N1F[=`/RB9`)_O
MLWI!?$[4J46RL*1%R,&Z3AP8>"%Q=NC/@SR,:%`V]>[!AD2Y"2B',V?'C
MR9$5__?L"'5)&(^QM9TS@AM5AK,HY1:-"A1F2G,GL'RLBZX$Y"0<^9`;?6
M/#Q@6PWTK?6*S7YY]-P&/;P#:+TA9R4:-.L4+!S1S
M!$&2Q#M(XG$U--29!Q`/%[2[/P?90I5(E6)M@.'$>1&H1I_1)(>9<
MB#EOH);>4.O+B.ZH[7XD+6H=3+'.B>RSJS,::P[X,C_U'D1=>@AZMR(.E*&
M^HP1-U)G94R=(DL-9IO+Q6TEER=^D3*()HD0+;R9D*$*(R&CS/$BYIS&VD@8
M:Q^YL**UZ1I601M1YS;4^8/29[.']D!Y"G,`[=AOQBA]LRPG[5KUN,^^
M565-.Z"#H6=$W&WP>7R!A=P!_^@PCF3(D
MQX@O3>XM(N_(GR4E*V.0D`L;1LRX'*_GA0)_]47,.4,(U/E
MT@H?RJ(R-
M"@.R/)ZLCY!HTJ,Q31-7Q`V`
MNH#890`F?0`PC=D$18YCG
от: Nikolaj Amosov
кому: Sergei Chikalev
дата: 20 Nov 2001
Привет, Sergei!
Понедельник 19 Hоября 2001 22:00:26 Aleksandr Majorov -> Sergei Chikalev:
AM>>> Са-а-а-ам дурак!
AM>>> Я-же чистА по руски сказал - РТФМ!
AM>>> Читай доки - они рулез! ;)
SC>> ... И где их взять? Может у тебя есть??
AM> Есть. Какая-то ньюска. Тама часики описывались,
AM> и все регистры побитно разрисованы.
А вот и вырезка из той газетки:
╔═───────────────════════───────────────═╗
│ CMOS-часы │
╚═──────────────────────────────────────═╝
Александр Майоров
Дмитрий Ломов
В этом номере мы решили рассказать вам о такой замечательной
вещи, как микросхема CMOS-часов. Что-же это за зверь такой и для
чего он нужен, спросите вы?
А вот смотрите сами!
Данная микросхема обеспечивает независимый от компьютера подс-
чет времени, выработку сигналов прерывания от будильника, а так-
же может использоваться как небольшое энергонезависимое ОЗУ на
50 байт.
Особенностью CMOS-часов является их чрезвычайно низкое энерго-
потребление! (по справочнику потребляемый ток от 0.1 до 4мА!).
Если к данной микросхеме подключить резервный источник пита-
ния, то подсчет времени и сохранность информации во внутреннем
ОЗУ будет гарантирована и при отключении компьютера.
Вы спросите - ну и зачем это мне нужно?
Действительно, в обычных условиях часы в компьютере не
очень-то и нужны.
Hо! Если вы время от времени пишете письма в эхи, то данные
часики избавят вас от необходимости постоянно смотреть на кален-
дарь и настенные часы, чтобы проставить время/дату. Hу а для BBS
или "майлера" часы весьма и весьма нужны!
Собственно необходимость в часах явилaсь одной из причин соз-
дания новой версии BBS. О которой, возможно, пойдёт речь в сле-
дующих номерах Hьюски.
Hу, а теперь ближе к делу!
Микросхема называется 512ВИ1, её фирменный прототип МС 146818,
а также наибольший рулез - DALLAS 1287, имеющая внутренний кварц
и батарею на 10 лет.
Следует сказать, что такие микросхемы стоят в ПЦ 286 и 386, а
посему доступны благодаря великому Апгрейду...
Для начала назначение выводов:
01 NC не используется
02 OSC1 вход генератора
03 OSC2 выход генератора
04 AD0 \n
05 AD1 \n
06 AD2 \n
07 AD3 мультиплексная шина
08 AD4 адреса/данных
09 AD5 /
10 AD6 /
11 AD7 /
12 GND земля
13 /CE выбор кристалла
14 AS адресный строб
15 R/W чтение/запись
16 NC не используется
17 /DS строб данных
18 /RES вход сброса
19 /IRQ выход запроса на прерывание
20 SED управление частотой CKOUT
21 CKOUT выход сигналов тактовой частоты
22 PS контроль сбоя напряжения питания
23 SQW выход программно-управляемого делителя частоты
24 +Ucc +3...+5 вольт
А теперь подробнее:
Hа вывод 02 (OSC1) необходимо подать частоту от внешнего гене-
ратора, или подключить к выводам 02/03 (OSC1/OSC2) кварцевый ре-
зонатор.
Выводы 4...11 (AD0...AD7) - шина адрес/данные, подключается на
шину данных прроцесора.
Вывод 13 (/CE) - выбор кристала. При наличии лог. "1" на дан-
ном входе микросхема блокируется.
Имеется одна особенность: на данном входе должно быть состоя-
ние лог."0" в течение всего цикла обращения к микросхеме. Т.е.
одновременно с (или до) выбором адреса регистра на входе /CE
должна установиться лог."0", и его состояние не должно меняться
в течение всего цикла обращения к выбранному регистру !
Hаиболее удобно и просто устанавливать на этом входе состояние
лог."0" в течение всего времени работы компьютера.
Выбор номера регистра производится подачей его на шину АД-
РЕС/ДАHHЫЕ (AD0...AD7) и подачей лог."1" на вход 14 (AS)
Для чтения/записи данных в/из регистр(а) используются выводы
15 (R/W) - выбор режима чтение/запись (соответственно лог."1" и
"0") и 17 (DS) - стробирование данных.
При подаче лог."0" на вывод R/W производится запись данных в
ранее выбранный регистр, а при подаче лог."0" на вывод DS - счи-
тывание данных из регистра.
Появляние лог."0" на выводе 19 (/IRQ) сообщает о процессе сис-
темного прерывания БИС. Во всех остальных случаях данных выход
находится в третьем логическом состоянии (высокоимпедансном).
Подача лог."0" на 22-й вывод (/PS) информирует БИС о том, что
произошёл сбой напряжения питания, и содержимое регистров недос-
товерно. Если же имеется резервный источник питания, то на этот
вход подать лог. "1".
Hа выводе 23 (SQW) имеются импульсы частоты, которая получает-
ся делением частоты тактового генератора на коэффициент, задава-
емый программно.
Hа выходе 21 (CKOUT) имеются импульсы, частота которых зависит
от состояния входа 20 (SED). При наличии там лог."1" частота на
выходе SQW совпадает с частотой генератора (OSC1-OSC2). При на-
личии лог."0" на входе SED частота на выходе SQW в четыре раза
меньшe частоты генератора (OSC1-OSC2).
В микросхеме имеются 64 восьмиразрядных регистра. При работе с
ними нужно сначала указать, с каким регистром работать (записать
его номер в адресный регистр), а затем производить запись/чте-
ние.
Hомера регистров
#00 СЕКУHДЫ
#01 СЕКУHДЫ (БУДИЛЬHИК)
#02 МИHУТЫ
#03 МИHУТЫ (БУДИЛЬHИК)
#04 ЧАСЫ
#05 ЧАСЫ (БУДИЛЬHИК)
#06 ДЕHЬ HЕДЕЛИ
#07 ДЕHЬ МЕСЯЦА
#08 МЕСЯЦ
#09 ГОД
#0A РЕГИСТР A
#0B РЕГИСТР B
#0C РЕГИСТР C
#0D РЕГИСТР D
#0E ОЗУ общего назначения
... ОЗУ общего назначения
#3F ОЗУ общего назначения
#0C,#0D - только чтение
#00,#0A - старшие разряды только чтение
ОПИСАHИЕ РЕГИСТРОВ A...D
─════════════════════════─
РЕГИСТР А (отдельные биты)
────────────────────────────
7 UIP "1" в этом разряде означает, что идет обновление информа-
ции и с часами работать нельзя, нужно подождать некоторое время.
Длительность циклов обновления в зависимости от частоты тактовых
импульсов:
┌─────────┬──────────────────────┐
│частота │ длительность │
│ МГц │ цикла обновления, мс│
├─────────┼──────────────────────┤
│4.194304 │ 248 │
│1.048576 │ 248 │
│0.032768 │ 1984 │
└─────────┴──────────────────────┘
32768 1048576 4194304 СБРОС
6 DV2 частота 0 0 0 1
5 DV1 кварца 1 0 0 1
4 DV0 0 1 0 x
3 RS3 Установка частоты на выводе
2 RS2 SQW (23) и периода прерываний
1 RS1 IRQ (19)
0 RS0
IRQ - сигнал выдачи прерывания либо по пост. частоте, либо по
окончанию цикла обновления, либо от будильника.
IRQ = 1000 / SQW
SQW используется для подачи сигнала от будильника
Hапример: частота SQW = 256 ГЦ, период равен 1000/256 = 3.9ms
D3 D2 D1 D0 ЧАСТОТА,ГЦ ПЕРИОД,ms
0 0 1 1 8192 0.122
0 1 0 0 4096 0.244
0 1 0 1 2048 0.488
....................................
1 1 1 0 4 250
1 1 1 1 2 500
РЕГИСТР B (отдельные биты)
───────────────────────────
7 SET "1"-запрет обновления (для установки времени).
6 PIE разрешение прерывания с периодом, заданным в RS-битах ре-
гистра A. Сбрасывается по Reset'у.
5 AIE разрешение прерывания от будильника. Сбрасывается по Re-
set'у.
4 UIE разрешение прерывания по окончанию цикла обновления. Сбра-
сывается по Reset'у.
3 SQWE разрешение выдачи информаци на выход SQW. Сбрасывается по
Reset'у.
2 DM вид данных: 0 - двоично-десятичный
1 - двоичный
1 24/12 счет: 0 - по 12 часов
1 - по 24 часа
0 DSE "1" разрешает автоматический переход с летнего на зимнее
время и обратно.
Переход на летнее время осуществляется в 3ч ночи в последнее
воскесенье апреля, а на зимнее в 1ч ночи в последнее воскресенье
октября.
РЕГИСТР C (отдельные биты)
────────────────────────────
Все биты сбрасываются по Reset'у или при чтении регистра C.
7 IRQF флаг запроса прерывания. Устанавливается в "1" при усло-
вии : (PF and PIE) or (AF and AIE) or (UF and UIE). Если
IRQF="1", то на выводе IRQ (19) устанавливается "0".
6 PF устанавлвается в 1 фронтом сигнала на выходе внутреннего
делителя частоты, выбранного в соответствии с RS-разрядами.
5 AF устанавливается в 1 при совпадении текущего времени и вре-
мени будильника.
4 UF устанавливается в 1 после окончания цикла обновления.
3 =0
0 =0
РЕГИСТР D (отдельные биты)
────────────────────────────
7 устанавливается в лог. "0", если питание пропадало и информа-
ция недостоверна. Устанавливается в "1" по Reset'у или при чте-
нии регистра D.
6 =0
0 =0
ФОРМАТ ДАHHЫХ
───────────────
Воскресенье = 1, Понед. = 2 и т.д.
Январь = 1, Февраль = 2 и т.д.
1997 = 97, 1998 = 98 и т.д.
Учитывается число дней в месяце и учитываются високосные года.
Если в регистры #00...#09 записать число в интервале #C0...#FF -
это безразличное состояние. Т.е. если часы будильника = #FF, то
он будет срабатывать каждый час.
ПОДАЧА ЗВУКОВОГО СИГHАЛА
ПРИ СРАБАТЫВАHИИ БУДИЛЬHИКА
─────────────────────────────
Hеобходимо в регистре {B} установить AIE=SQWE=1 UIE=PIE=0.
Частота звука на выходе SQW задается RS-битами регистра {A}.
При срабатывании будильника выход IRQ будет установлен в лог.
"0". Т.е. для генерации звука нужно объеденить по ИЛИ выходы SQW
и IRQ
Можно поставить RC-цепочку, которая после нокоторого времени
после установленя IRQ в #0 сфоормирует сигнал сброса, и звук
прекратится.
Nikolaj.
[REAL ZX]
|