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).
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:
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.
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.
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 wywietlacz 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
;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)
;stae 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
;stae 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 prawidowo ustawione w banku 0 READ_DAY: LCALL LCD_CLR
MOV A,#CLR_RD ;zdj©cie sygnau 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 wysanie 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 wywoujĄ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 ;obsuga 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©toci MOVX A,@R1 JNB ACC.1,WAIT_BUSY
BANK0 ;odczyt daty i czasu i wywietlenie 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->poniedziaek 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 wywietlacz LCD dat© i czas ;taktuje BUZZERem co 1 sek
;************************************** INT55 EQU P1.1 BUZ EQU P1.5 LED EQU P1.7 GODZ 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)
;stae 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
;stae 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 prawidowo 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 sygnau 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 wysanie 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 ;obsuga przerwania z wejcia INT1 - sterownik przerwaä
PUSH ACC ;przechowanie rejestr˘w PUSH PSW
BANK1 ;obsuga 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©toci MOVX A,@R1 JNB ACC.1,WAIT_BUSY
BANK0 ;odczyt daty i czasu i wywietlenie 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 wywoujĄ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->poniedziaek 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