m4


P O L I T E C H N I K A L U B E L S K A

w Lublinie

SPRAWOZDANIE

LABORATORIUM Z TECHNIK MIKROPROCESOROWYCH

Ćwiczenie nr 4

TEMAT: Zegar czasu rzeczywistego.

Data:

2008-03-10

RACHWAŁ MAREK ID6.3

Budowa i zasada działania

Model M-04 jest przystawką sytemu DSM - 51 pełniącą funkcję zegara czasu rzeczywistego. Zegar czasu rzeczywistego (Real Time Clock - RTC) jest układem systemu mikroprocesorowego, którego zadaniem jest podawanie mikroprocesorowi aktualnego czasu. Zegar ten powinien prawidłowo liczyć czas nawet po wyłączeniu zasilania systemu mikroprocesorowego, tak by po jego ponownym włączeniu procesor mógł się od razu dowiedzieć o aktualny czas (rok, miesiąc, dzień, godzina, minuta, sekunda, setna część sekundy).

0x01 graphic

Układ RTC 58321 w modelu M-04 zasilany jest z systemu DSM - 51. W przypadku braku tego napięcia zasilanie przejmuje bateria. Zastosowana bateria zapewnia nieprzerwaną pracę układu przez ponad rok. RTC 58321 zawiera szereg rejestrów. Funkcje rejestrów zebrano w poniższej tabeli:

0x01 graphic

Komunikacja systemu DSM-51 z układem RTC 58321 odbywa się po 4-bitowej dwukierunkowej szynie danych, po której przesyłane są adresy i dane. Jest to zupełnie inna szyna niż w mikrokontrolerze 8051, dlatego model jest podłączony do złącza wejść / wyjść cyfrowych.

Do wystawienia danych na szynę wykorzystuje się port A układu 8255, a do odczytu port B. Oba te porty powinny pracować w trybie 0 - port A jako wyjście, port B jako wejście. Bit 4 portu A ustawiony na 0 powoduje wysterowanie szyny przez młodszą część tego portu, natomiast ustawiony na 1 pozwala na wysterowanie szyny przez zegar czasu rzeczywistego. Starsza część portu C powinna być wystawiona jako wyjście (linia sterująca do układu

RTC 58321), natomiast młodsza część jako wejście - pozwala to na wykorzystanie systemu przerwań w DSM - 51.

Sygnały CS1 i CS2 uaktywniają komunikację z układem. Oba te sygnały muszą być w stanie 1, aby możliwe było zapisanie i odczytywanie rejestrów układu zegara.

0x01 graphic

Cykl zapisu danych (rys. 2.) do rejestru układu składa się z dwu operacji:

- zapis adresu,

- zapis danych.

Adres rejestru podany na linie D0...D3 jest wpisywany do układu stanem wysokim linii „Adres WR”. Następnie dane, podane również na linie D0...D3, są wpisywane do wybranego rejestru stanem wysokim linii WR.

0x01 graphic

Cykl odczytu zawartości rejestru (rys. 3.) przebiega również dwuetapowo:

- zapis adresu,

- odczyt danych.

Zapis adresu przebiega identycznie jak w cyklu zapisu danych, natomiast do odczytu danych służy linia RD. Stan wysoki na tej linii powoduje podanie przez układ zegara zawartości wybranego rejestru na szynę danych.

Zadanie 1.

Wyświetlenie godziny bez daty.

;TITLE 'ZEGAR CZASU RZECZYWISTEGO' - ODCZYT

;**************************************

;program odbiera przerwania co 1 sek z RTC

;wypisuje na wy˜wietlacz LCD dat© i czas

;taktuje BUZZERem co 1 sek

;**************************************

INT55 EQU P1.1

BUZ EQU P1.5

LED EQU P1.7

GODZ EQU 00000000B

MIN EQU 00000000B

;Ukad 8255

;PORT A - WYJ—CIE MOD 0

;PORT B - WEJ—CIE MOD 0

;PORT CA (4..7) - WYJ—CIE

;PORT CB (0..3) - WEJ—CIE

SET_8255 EQU 10000011B

;PA0..PA3 - szyna danych OUT

;PA4 - 0 - DANE OUT

; 1 - DANE IN

;PA5 - 1 - CS

;PA6 - 1 - STOP

;PC4 - 1 - RD

;PC5 - 1 - WR

;PC6 - 1 - AWR

;PC7 - 1 - TEST

;PB0..PB3 - szyna danych IN

;PC0 - (IPB) impulsy 1024Hz

;PC3 - (IPA) impulsy 1Hz

;PC1 - BUSY

;wykorzystanie rejestr˘w z portu 0

;R0 - PA (PB)

;R1 - PD,set PCx (PD)

;staˆe sterujĄce RTC do wystawiania na port A

DATA_IN EQU 00110000B ;dane odczytywane-RTC moľe wystawia†

DATA_OUT EQU 00100000B ;dane podane do RTC

DATA_OUT_STOP EQU 01100000B

CS_OFF EQU 00010000B ;odˆĄczenie RTC

STOP EQU 01110000B

;staˆe sterujĄce RTC do ustawiania pojedyäczych bit˘w w porcie C

;poprzez wpisywanie ich pod adres CS55D

CLR_RD EQU 4*2

SET_RD EQU 4*2+1

SET_WR EQU 5*2+1

SET_AWR EQU 6*2+1

;adresy rejestr˘ww RTC

SEC EQU 0

SEC_10 EQU 1

MIN EQU 2

MIN_10 EQU 3

HOUR EQU 4

HOUR_10 EQU 5

WEEK EQU 6

DAY EQU 7

DAY_10 EQU 8

MON EQU 9

MON_10 EQU 10

YEAR EQU 11

YEAR_10 EQU 12

RESET EQU 13

SIGNAL EQU 14

STOS EQU 60H

BANK0 MACRO

ACALL ADR_WR ;zegarowych do szyny

MOV A,#DATA_IN ;przestawienie szyny na odczyt

MOVX @R0,A

MOV A,#SET_RD ;odczyt z RTC - podˆĄczenie do szyny

MOVX @R1,A

BANK1

;rejestry R0 i R1 banku 1 sĄ wykorzystywane w przerwaniach

;ustawienie adresu sterownika przerwaä w rejestrze R0

MOV R0,#CSIC

;zerowanie sterownika przerwań

MOV R1,#CSAD

MOVX A,@R1

CLR A

MOVX @R0,A

INC A

MOVX @R0,A

INC A

MOVX @R0,A

INC A

MOVX @R0,A

;ustawienie adresu portu C 8255 w rejestrze R1

MOV R1,#CS55C

BANK0

SETB EA ;uaktywnienie przerwań og˘lne

SETB EX1 ;uaktywnienie przerwania INT1

CLR INT55 ;uaktywnienie sterownika na przerwania z 8255

;zatrzymanie programu gˆ˘wnego

SJMP $

;**************************************

;odczytanie daty i czasu z RTC i wypisanie na LCD

;rejestry R0 i R1 prawidˆowo ustawione w banku 0

READ_DAY:

LCALL LCD_CLR

MOV A,#CLR_RD ;zdj©cie sygnaˆu RD do RTC

MOVX @R1,A

MOV A,#DAY_10 ;odczytanie dnia miesiĄca

ACALL READ

ANL A,#03H

ACALL WRITE_LCD

MOV A,#DAY

ACALL READ

ACALL WRITE_LCD

MOV A,#'.'

LCALL WRITE_DATA

MOV A,#MON_10 ;odczytanie miesiĄca

ACALL READ

ACALL WRITE_LCD

MOV A,#MON

ACALL READ

ACALL WRITE_LCD

MOV A,#'.'

LCALL WRITE_DATA

MOV A,#19H ;odczytanie roku

LCALL WRITE_HEX

;******************

;zamiana cyfry na jej kod i wysˆanie na LCD

WRITE_LCD:

ADD A,#30H

LCALL WRITE_DATA

RET

;******************

;odczyt rejestru z RTC

;adres w akumulatorze 0..0fh

READ:

ACALL ADR_WR ;wpisanie do RTC adresu ľĄdanego rejestru

DATA_RD:

MOV A,#DATA_IN ;ustawienie RTC na odczyt

MOVX @R0,A

MOV A,#SET_RD

MOVX @R1,A

INC R0 ;odczyt danej z rejestru RTC

MOVX A,@R0 ;przez port B 8255

DEC R0

MOV B,A

MOV A,#CLR_RD ;odˆĄczenie RTC od szyny

MOVX @R1,A

MOV A,#CS_OFF

MOVX @R0,A

MOV A,B ;zwrot do programu wywoˆujĄcego danej

ANL A,#0FH ;4 bitowej z odpowiedniego rejestru

RET

CLR RS0

MACEND

BANK1 MACRO

SETB RS0

MACEND

;**************************************

LJMP START

;**************************************

ORG 0013H

;obsˆuga przerwania z wej˜cia INT1 - sterownik przerwaä

PUSH ACC ;przechowanie rejestr˘w

PUSH PSW

BANK1 ;obsˆuga przerwania w banku 1

;adresy w R0 i R1 sĄ odpowiednio ustawione

MOVX A,@R0 ;odczyt przerwania

ANL A,#3

MOVX @R0,A ;skasowanie przerwania

CJNE A,#2,INT_END ;inne przerwanie - nie odbieram

;przerwanie IPA - min©ˆa 1 sekunda

;odczytanie nowego czasu

CLR BUZ ;zaˆĄczenie BUZZERAa

WAIT_BUSY: ;czekanie na koniec zaj©to˜ci

MOVX A,@R1

JNB ACC.1,WAIT_BUSY

BANK0 ;odczyt daty i czasu i wy˜wietlenie na LCD

ACALL ONLY_LOW ; ODŚWIERZENIE CZASU

BANK1

MOV A,#2 ;skasowanie przerwania 2 ze sterownika przerwaä

MOVX @R0,A ;odczyt odbywaˆ si© po tych samych liniach

;co idĄ impulsy zegarowe

SETB BUZ ;wyˆĄczenie BUZZERa

INT_END: ;zakoäczenie przerwania

POP PSW

POP ACC

RETI

;**************************************

ORG 0100H

START:

MOV SP,#STOS

;inicjalizacja 8255

MOV R0,#CS55A

MOV R1,#CS55D

MOV A,#SET_8255

MOVX @R1,A

;ustawienie neutralnego stanu dla RTC

MOV A,#CS_OFF

MOVX @R0,A

MOV A,#SIGNAL ;wpisanie adresu podĄczenia impuls˘w

MOV A,#YEAR_10

ACALL READ

ACALL WRITE_LCD

MOV A,#YEAR

ACALL READ

ACALL WRITE_LCD

MOV A,#'r'

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#WEEK ;odczytanie dnia tygodnia

ACALL READ

ANL A,#07H ;zamiana numeru dnia tygodnia

RL A ;na trzyliterowy ciĄg znak˘w

RL A

MOV DPTR,#WEEK_DAY

ADD A,DPL

MOV DPL,A

JNC ONLY_LOW

INC DPH

ONLY_LOW: ;ODŚWIERZENIE CZASU

LCALL LCD_CLR

LCALL WRITE_TEXT

MOV A,#HOUR_10 ;odczytanie godziny

ACALL READ

ANL A,#03H

ACALL WRITE_LCD

MOV A,#HOUR

ACALL READ

ACALL WRITE_LCD

MOV A,#':'

LCALL WRITE_DATA

MOV A,#MIN_10 ;odczytanie minuty

ACALL READ

ACALL WRITE_LCD

MOV A,#MIN

ACALL READ

ACALL WRITE_LCD

MOV A,#':'

LCALL WRITE_DATA

MOV A,#SEC_10 ;odczytanie sekund

ACALL READ

ACALL WRITE_LCD

MOV A,#SEC

ACALL READ

ACALL WRITE_LCD

MOV A,#' '

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#SIGNAL ;przestawienie z powrotem na impulsy

ACALL ADR_WR ;zegarowe z RTC

MOV A,#DATA_IN

MOVX @R0,A

MOV A,#SET_RD

MOVX @R1,A

RET

;******************

ADR_WR:

;wpisanie adresu wybranego rejestru do RTC

;adres w akumulatorze 0..0fh

ORL A,#DATA_OUT ;dodanie sterowania - szyna do RTC

MOVX @R0,A

MOV A,#SET_AWR ;impuls na pinie Adres WRite

MOVX @R1,A

DEC A

MOVX @R1,A

RET

;******************

WEEK_DAY:

;nazwy dni tygodnia przyporzĄdkowane numerom

;0->niedziela, 1->poniedziaˆek itd

DB 'SUN',0

DB 'MON',0

DB 'TUE',0

DB 'WED',0

DB 'THU',0

DB 'FRI',0

DB 'SUT',0

;**************************************

;END

W programie zmieniamy skok etykiety READ_DAY do nowej etykiety ONLY_LOW i pomijamy - komentujemy część kodu odpowiedzialnego za wyświetlanie roku i miesiąca.

Zadanie 2

Budzik

Program sprawdza aktualną godzinę i o podanej godzinie włącza się alarm.

TITLE 'ZEGAR CZASU RZECZYWISTEGO' - ODCZYT

;**************************************

;program odbiera przerwania co 1 sek z RTC

;wypisuje na wy˜wietlacz LCD dat© i czas

;taktuje BUZZERem co 1 sek

;**************************************

INT55 EQU P1.1

BUZ EQU P1.5

LED EQU P1.7

GODZ EQU 00000000B

;Ukˆad 8255

;PORT A - WYJ—CIE MOD 0

;PORT B - WEJ—CIE MOD 0

;PORT CA (4..7) - WYJ—CIE

;PORT CB (0..3) - WEJ—CIE

SET_8255 EQU 10000011B

;PA0..PA3 - szyna danych OUT

;PA4 - 0 - DANE OUT

; 1 - DANE IN

;PA5 - 1 - CS

;PA6 - 1 - STOP

;PC4 - 1 - RD

;PC5 - 1 - WR

;PC6 - 1 - AWR

;PC7 - 1 - TEST

;PB0..PB3 - szyna danych IN

;PC0 - (IPB) impulsy 1024Hz

;PC3 - (IPA) impulsy 1Hz

;PC1 - BUSY

;wykorzystanie rejestr˘w z portu 0

;R0 - PA (PB)

;R1 - PD,set PCx (PD)

;staˆe sterujĄce RTC do wystawiania na port A

DATA_IN EQU 00110000B ;dane odczytywane-RTC moľe wystawia†

DATA_OUT EQU 00100000B ;dane podane do RTC

DATA_OUT_STOP EQU 01100000B

CS_OFF EQU 00010000B ;odˆĄczenie RTC

STOP EQU 01110000B

;staˆe sterujĄce RTC do ustawiania pojedyäczych bit˘w w porcie C 8255

;poprzez wpisywanie ich pod adres CS55D

CLR_RD EQU 4*2

SET_RD EQU 4*2+1

SET_WR EQU 5*2+1

SET_AWR EQU 6*2+1

;adresy rejestr˘ww RTC

SEC EQU 0

SEC_10 EQU 1

MIN EQU 2

MIN_10 EQU 3

HOUR EQU 4

HOUR_10 EQU 5

WEEK EQU 6

DAY EQU 7

DAY_10 EQU 8

MON EQU 9

MON_10 EQU 10

YEAR EQU 11

YEAR_10 EQU 12

RESET EQU 13

SIGNAL EQU 14

MOV A,#SIGNAL ;wpisanie adresu podˆĄczenia impuls˘w

ACALL ADR_WR ;zegarowych do szyny

MOV A,#DATA_IN ;przestawienie szyny na odczyt

MOVX @R0,A

MOV A,#SET_RD ;odczyt z RTC - podˆĄczenie do szyny

MOVX @R1,A

BANK1

;rejestry R0 i R1 banku 1 sĄ wykorzystywane w przerwaniach

;ustawienie adresu sterownika przerwaä w rejestrze R0

MOV R0,#CSIC

;zerowanie sterownika przerwaä

MOV R1,#CSAD

MOVX A,@R1

CLR A

MOVX @R0,A

INC A

MOVX @R0,A

INC A

MOVX @R0,A

INC A

MOVX @R0,A

;ustawienie adresu portu C 8255 w rejestrze R1

MOV R1,#CS55C

BANK0

SETB EA ;uaktywnienie przerwaä og˘lne

SETB EX1 ;uaktywnienie przerwania INT1

CLR INT55 ;uaktywnienie sterownika na przerwania z 8255

;zatrzymanie programu gˆ˘wnego

SJMP $

;**************************************

;odczytanie daty i czasu z RTC i wypisanie na LCD

;rejestry R0 i R1 prawidˆowo ustawione w banku 0

READ_DAY:

LCALL LCD_CLR

PUSH ACC

MOV A,#HOUR_10 ;odczytanie godziny

ACALL READ

ANL A,#03H

SUBB A,GODZ

JNZ NOBUDZ

ACALL READ

MOV A,#MIN_10 ;odczytanie minuty

ACALL READ

SUBB A,MIN

JZ BUDZIK

NOBUDZ:

POP ACC

MOV A,#CLR_RD ;zdj©cie sygnaˆu RD do RTC

MOVX @R1,A

MOV A,#DAY_10 ;odczytanie dnia miesiĄca

ACALL READ

ANL A,#03H

ACALL WRITE_LCD

MOV A,#DAY

ACALL READ

ACALL WRITE_LCD

ACALL WRITE_LCD

MOV A,#' '

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#SIGNAL ;przestawienie z powrotem na impulsy

ACALL ADR_WR ;zegarowe z RTC

MOV A,#DATA_IN

MOVX @R0,A

MOV A,#SET_RD

MOVX @R1,A

RET

;******************

;Włączenie budzika

BUDZIK:

CLR LED

CLR BUZ

MOV A,#10

LCALL DELAY_100MS

SETB LED

SETB BUZ

MOV A,#10

LCALL DELAY_100MS

RET

;******************

;zamiana cyfry na jej kod i wysˆanie na LCD

WRITE_LCD:

ADD A,#30H

LCALL WRITE_DATA

RET

;******************

;odczyt rejestru z RTC

;adres w akumulatorze 0..0fh

READ:

ACALL ADR_WR ;wpisanie do RTC adresu ľĄdanego rejestru

STOS EQU 60H

BANK0 MACRO

CLR RS0

MACEND

BANK1 MACRO

SETB RS0

MACEND

;**************************************

LJMP START

;**************************************

ORG 0013H

;obsˆuga przerwania z wej˜cia INT1 - sterownik przerwaä

PUSH ACC ;przechowanie rejestr˘w

PUSH PSW

BANK1 ;obsˆuga przerwania w banku 1

;adresy w R0 i R1 sĄ odpowiednio ustawione

MOVX A,@R0 ;odczyt przerwania

ANL A,#3

MOVX @R0,A ;skasowanie przerwania

CJNE A,#2,INT_END ;inne przerwanie - nie odbieram

;przerwanie IPA - min©ˆa 1 sekunda

;odczytanie nowego czasu

CLR BUZ ;zaˆĄczenie BUZZERAa

WAIT_BUSY: ;czekanie na koniec zaj©to˜ci

MOVX A,@R1

JNB ACC.1,WAIT_BUSY

BANK0 ;odczyt daty i czasu i wy˜wietlenie na LCD

ACALL READ_DAY ; ODŚWIERZENIE CZASU

BANK1

MOV A,#2 ;skasowanie przerwania 2 ze sterownika przerwaä

MOVX @R0,A ;odczyt odbywaˆ si© po tych samych liniach

;co idĄ impulsy zegarowe

SETB BUZ ;wyˆĄczenie BUZZERa

INT_END: ;zakoäczenie przerwania

POP PSW

POP ACC

RETI

;**************************************

ORG 0100H

START:

MOV SP,#STOS

;inicjalizacja 8255

MOV R0,#CS55A

MOV R1,#CS55D

MOV A,#SET_8255

MOVX @R1,A

;ustawienie neutralnego stanu dla RTC

MOV A,#CS_OFF

MOVX @R0,A

MOV A,#'.'

LCALL WRITE_DATA

MOV A,#MON_10 ;odczytanie miesiĄca

ACALL READ

ACALL WRITE_LCD

MOV A,#MON

ACALL READ

ACALL WRITE_LCD

MOV A,#'.'

LCALL WRITE_DATA

MOV A,#19H ;odczytanie roku

LCALL WRITE_HEX

MOV A,#YEAR_10

ACALL READ

ACALL WRITE_LCD

MOV A,#YEAR

ACALL READ

ACALL WRITE_LCD

MOV A,#'r'

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#' '

LCALL WRITE_DATA

MOV A,#WEEK ;odczytanie dnia tygodnia

ACALL READ

ANL A,#07H ;zamiana numeru dnia tygodnia

RL A ;na trzyliterowy ciĄg znak˘w

RL A

MOV DPTR,#WEEK_DAY

ADD A,DPL

MOV DPL,A

JNC ONLY_LOW

INC DPH

LCALL LCD_CLR

LCALL WRITE_TEXT

MOV A,#HOUR_10 ;odczytanie godziny

ACALL READ

ANL A,#03H

ACALL WRITE_LCD

MOV A,#HOUR

ACALL READ

ACALL WRITE_LCD

MOV A,#':'

LCALL WRITE_DATA

MOV A,#MIN_10 ;odczytanie minuty

ACALL READ

ACALL WRITE_LCD

MOV A,#MIN

ACALL READ

ACALL WRITE_LCD

MOV A,#':'

LCALL WRITE_DATA

MOV A,#SEC_10 ;odczytanie sekund

ACALL READ

ACALL WRITE_LCD

MOV A,#SEC

ACALL READ

DATA_RD:

MOV A,#DATA_IN ;ustawienie RTC na odczyt

MOVX @R0,A

MOV A,#SET_RD

MOVX @R1,A

INC R0 ;odczyt danej z rejestru RTC

MOVX A,@R0 ;przez port B 8255

DEC R0

MOV B,A

MOV A,#CLR_RD ;odˆĄczenie RTC od szyny

MOVX @R1,A

MOV A,#CS_OFF

MOVX @R0,A

MOV A,B ;zwrot do programu wywoˆujĄcego danej

ANL A,#0FH ;4 bitowej z odpowiedniego rejestru

RET

;******************

ADR_WR:

;wpisanie adresu wybranego rejestru do RTC

;adres w akumulatorze 0..0fh

ORL A,#DATA_OUT ;dodanie sterowania - szyna do RTC

MOVX @R0,A

MOV A,#SET_AWR ;impuls na pinie Adres WRite

MOVX @R1,A

DEC A

MOVX @R1,A

RET

;******************

WEEK_DAY:

;nazwy dni tygodnia przyporzĄdkowane numerom

;0->niedziela, 1->poniedziaˆek itd

DB 'SUN',0

DB 'MON',0

DB 'TUE',0

DB 'WED',0

DB 'THU',0

DB 'FRI',0

DB 'SUT',0

;**************************************

;END

Program sprawdza aktualną godzinę i minutę. Jeśli zgadzają się one z czasem wpisanym w programie, następuje skok do etykiety która włącza i wyłącza diodę oraz brzęczyk.

3



Wyszukiwarka

Podobne podstrony:
Podklad przyklad M4
ECCC Sylabus IT M4 B
ARKUSZ DIAGNOSTYCZNY GM M4 125 Nieznany (2)
elektra M4, Studia, SiMR, II ROK, III semestr, Elektrotechnika i Elektronika II, Elektra, Elektronik
KNOCHE GRUBER SG M4
M4 Struktura i wielkosc kapitalow, finanse i rachunkowość przedsiębiorstw
Multitest M4 2009
sprawko M4, AGH Imir materiały mix, Studia
sprawko M4 (1), AGH Imir materiały mix, Studia
elektra M4 obr
pi11-m4, ╔══════════════════════════════════════════════════════════════════════════════╗
M4
Zadania płyny M4 M6
M4 as
089 multitest M4 2007
biofizyka od KACPRA, BIOFIZYKA-M4, UNIWERSYTET MEDYCZNY W ŁODZI
sr13, sr13-m4
ECCC Sylabus IT M4 A
CCNA M4 CCNA Skills Assessment Student Training Exam
Test ECDL V5 M4 3

więcej podobnych podstron