Sie sind auf Seite 1von 11

RTC Uhr

RTC Uhr

Ein Miniatur Projekt


von
Andreas Gut

Copyright By Andreas Gut Bueno Engineering Seite 1 von 11


RTC Uhr

1 Einleitung.............................................................................................................................3
2 Verbindungs-Protokoll vom PC zum PIC..............................................................................4
3 Belegungs- Tabelle PIC 16F877..........................................................................................4
4 Wichtige Register im RTC....................................................................................................5
4.1 Control Register 0x0D...................................................................................................5
4.2 Control Register 0x0A....................................................................................................5
5 Schema................................................................................................................................6
6 Delphi Software....................................................................................................................6
6.1 Printscreen....................................................................................................................6
6.2 Source Code..................................................................................................................7
7 PIC Software........................................................................................................................8
7.1.1 File Init.asm.............................................................................................................9
7.1.2 File RS232Com.asm.............................................................................................10

Copyright By Andreas Gut Bueno Engineering Seite 2 von 11


RTC Uhr

1 Einleitung
In diesem Mini Projekt geht es darum alte RTC (Real Time Clock) Bausteine die Ich
irgendwo abgelötet hatte wieder in Betreib zu nehmen.

Die Bausteine des Typs DS12B887 und DS12887 die mir zur Verfügung standen sind mit
einer internen Batterie ausgerüstet. So musste zuerst festgestellt werden ob die Batterie
noch in Ordnung ist. Dazu gibt’s eine Controll Register dass man auslesen kann.

Als festgestellt wurde das die Batterien bei beiden Bausteinen in Ordnung ist wurde ein PIC
Programm geschrieben mit welchem die Bausteine via RS232 ausgelesen werden konnten.

Auf dem PC wurde ein Delphi Programm geschrieben das die aktuelle Uhrzeit auslesen
kann.

Das stellen der Uhrzeit , das Lesen und Schreiben von Registern ist mit dem Delphi
Programm nicht möglich. Das wurde direkt mit dem Programm Terminal.exe erledigt.

Zu guter letzt wurden die internen Quarze deaktiviert, so dass die Batterie nicht belastet wird
wenn die Bausteine nicht benutzt werden.

Copyright By Andreas Gut Bueno Engineering Seite 3 von 11


RTC Uhr

2 Verbindungs-Protokoll vom PC zum PIC


Baudrate 9600
Daten Bit 8
Stop Bit 1
Parität Keine

1. Byte 2. Byte 3. Byte

Read / Write Adresse Daten

Im 1. Byte wird nur das Bit 0 benötigt. Dieses Bit Identifiziert den Zugriff als Lesezugriff.
1 = Daten aus dem RTC auslesen.
0 = Daten in den RTC schreiben

Im 2.Byte wird die Adresse eingetragen auf die man zugreifen möchte.

Im 3.Byte werden Die Daten gesendet die geschrieben werden sollen. Dieses Byte wird
jedoch nur dann übertragen wenn das Lese Bit = 0 ist.

3 Belegungs- Tabelle PIC 16F877


RC0 AS auf RTC
RC1 DS auf RTC
RC2 R/W auf RTC
RC6 RS232 TX
RC7 RS232 RX
RD0 - 7 Adress- Datenbus zum RTC

Copyright By Andreas Gut Bueno Engineering Seite 4 von 11


RTC Uhr

4 Wichtige Register im RTC


4.1 Control Register 0x0D
Zeigt den Batterie Status an. nur das Bit 7 in diesem Register wird dazu benötigt. Ist diese
Bit gesetzt so ist die Batterie noch in Ordnung. Alle anderen Bits werden als 0 gelesen.
Dieses Register kann nur gelesen werden.

Siehe Datenblatt Seite 17

4.2 Control Register 0x0A


In diesem Register kann der Quarz abgeschaltet werden. So wird die Batterie nicht belastet
während der RTC Baustein nur gelagert wird.

Dazu muss der Wert 0x04 in diese Register geschrieben werden.


Um Den Quarz wieder einzuschalten muss der Wert 0x24 in das Register geschrieben
werden.

Siehe Datenblatt Seite 18 (Oscilator Controll Bits)

Copyright By Andreas Gut Bueno Engineering Seite 5 von 11


RTC Uhr

5 Schema

6 Delphi Software
Mit der Delphi Software lässt sich die Uhrzeit und das Datum aus dem RTC Baustein
auslesen.

6.1 Printscreen
Hier ist ein Printscreen abgebildet. Das Programm sendet im Sekundentakt eine
Aktualisierungsanfrage an den Pic Prozessor. Die Daten werden dann auf dem Bildschirm
angezeigt. Weitere Funktionen kennt das Programm nicht.

Copyright By Andreas Gut Bueno Engineering Seite 6 von 11


RTC Uhr

6.2 Source Code


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, OoMisc, AdPort;

type
TForm1 = class(TForm)
ComPort: TApdComPort;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure ComPortTriggerAvail(CP: TObject; Count: Word);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
m__Addr : integer;
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);


begin
m__Addr := 0;
ComPort.PutChar(chr(1));
ComPort.PutChar(chr(m__Addr));
end;

procedure TForm1.ComPortTriggerAvail(CP: TObject; Count: Word);


var x, low, hi : Byte;
begin
x := integer(ComPort.GetChar);
low := x and 15;
hi := (x and 240) shr 4;

x := low + 10 * hi;
case m__Addr of
0: Label3.Caption := intToStr(x);
2: Label2.Caption := intToStr(x);
4: Label1.Caption := intToStr(x);
7: Label6.Caption := intToStr(x);
8: Label8.Caption := intToStr(x);
9: Label10.Caption := intToStr(x);
end;
if m__Addr < 9 then
begin
m__Addr := m__Addr + 1;
ComPort.PutChar(chr(1));
ComPort.PutChar(chr(m__Addr));
end;

end;

end.

Copyright By Andreas Gut Bueno Engineering Seite 7 von 11


RTC Uhr

7 PIC Software
File Main.asm

;Version 1.0
;Programed By Andreas Gut

list p=PIC16F877 ;Processor spezifizieren


include p16f877.inc ;Definitionsdatei für Assembler anmelden.
include MyDef.inc ;meine eigenen Definitionen
__config _cp_off & _pwrte_on & _wdt_off & _xt_osc & _debug_off & _lvp_off &
_wrt_enable_on & _cpd_off & _boden_off

include init.asm
include RS232Com.asm

isr call rcIrq


retfie

main
goto main

end

File MyDef.inc
; In diesem File Sollen alle für die verwendung benutzten Register definiert werden.

; Register definitionen

RXCnt EQU H'0020'


DataSta EQU H'0021'
RTCAddr EQU H'0022'
RTCData EQU H'0023'

; DataSta Bits
read EQU H'0000'

;RTC IO Control Flags


AS EQU H'0000'
DS EQU H'0001'
RW EQU H'0002'

Copyright By Andreas Gut Bueno Engineering Seite 8 von 11


RTC Uhr

7.1.1 File Init.asm


org H'0000'
goto start
org H'0004'
goto isr
org H'0010'

; ************************ Prozessor Initialisierung **************************

start bcf status,rp1


;Innterupt configuration löschen damit Prozessor
;die Initsequenz ohne Interupts durlaufen kann.
clrf intcon

; I/O Definitionen
bsf status,rp0
;Port A ->> Ra0, Ra1, Ra2, Ra3, Ra4, Ra5 Input
; ->> ---
Output
movlw B'11111111'
movwf trisa
;Port B ->> Rb0, Rb1, Rb2, Rb3, Rb4, Rb5, Rb6, Rb7 Input
; ->> ---
Output
movlw B'11111111'
movwf trisb
;Port C ->> Rb0, Rb1, Rb2, Rb3, Rb4, Rb5, Rb6, Rb7 Input
; ->> ---
Output
movlw B'11111000'
movwf trisc
;Port D ->> Rb3, Rb4, Rb5, Rb6, Rb7 Input
; ->> Rb0, Rb1, Rb2
Output
movlw B'11111111'
movwf trisd
;Port E ->> Rb0, Rb1, Rb2, Rb3, Rb4, Rb5, Rb6, Rb7 Input
; ->> ---
Output
movlw B'00000111'
movwf trise
;damit Port A und Port E als I/O Ports benutzt werden können.
movlw B'00000110'
movwf adcon1
bcf status,rp0

; RS232 Definitionen
bsf status,rp0
; Baudrate 9600 bei 4.000 MHz
movlw D'25'
movwf spbrg
; Hohe Baudraten aktivieren brgh = 1
; Transmit Aktivieren
clrf txsta
bsf txsta,brgh
bsf txsta,txen
; Recieve Interrupt aktivieren
clrf pie1
bsf pie1,rcie
bcf status,rp0
bsf intcon,peie
; serial Port global aktivieren
clrf rcsta
bsf rcsta,spen
bsf rcsta,cren
; interrupt flags löschen
bcf pir1,rcif
bcf pir1,txif

Copyright By Andreas Gut Bueno Engineering Seite 9 von 11


RTC Uhr

;Timer0
;interrupt aktivieren
;bcf status,rp0
;bsf intcon,t0ie
;bcf status,rp0

;Diverse Definitionen
bsf status,rp0
;Ra4 als Zählereingang
;prescaler auf wdt
;presacler 256
movlw B'00000011'
movwf option_reg
bcf status,rp0

;Programmspezifische Definitionen
clrf portd
clrf RXCnt

; Global Interrupts Aktivieren


bsf intcon,gie

; Hauptprogramm Starten
goto main

7.1.2 File RS232Com.asm


;******************* Interrupt Teil des Receavers *********************
rcIrq movf RXCnt,w
btfsc status,z
goto svSta
movf RXCnt,w
sublw D'1'
btfsc status,z
goto chkRd
movf RXCnt,w
sublw D'2'
btfsc status,z
goto wtRTC
goto err

svSta movf rcreg,w


movwf DataSta
incf RXCnt,f
return

chkRd btfsc DataSta,read


goto rdRTC
movf rcreg,w
movwf RTCAddr
incf RXCnt,f
return

Copyright By Andreas Gut Bueno Engineering Seite 10 von 11


RTC Uhr

wtRTC movf rcreg,w


movwf RTCData
clrf RXCnt
; RTC Schreiben
; vorbereiten damit Portd als Ausgang geschaltet werden darf
bsf portc,DS
bsf portc,RW
bsf portc,AS
; Portd als Ausgang schalten
bsf status,rp0
clrf trisd
bcf status,rp0
; Adresse auf Portd ausgeben
movf RTCAddr,w
movwf portd
; Adresse speichern
bcf portc,AS
;Daten auf Portd Ausgeben
movf RTCData,w
movwf portd
; Daten Speichern
bcf portc,RW
nop
bsf portc,RW
bsf portc,AS
;Portd wieder als Eingang
bsf status,rp0
movlw H'FF'
movwf trisd
bcf status,rp0
; nun ist ein Byte ins RTC geschrieben
return

rdRTC movf rcreg,w


movwf RTCAddr
clrf RXCnt
; RTC Schreiben
; vorbereiten damit Portd als Ausgang geschaltet werden darf
bsf portc,DS
bsf portc,RW
bsf portc,AS
; Portd als Ausgang schalten
bsf status,rp0
clrf trisd
bcf status,rp0
; Adresse auf Portd ausgeben
movf RTCAddr,w
movwf portd
; Adresse speichern
bcf portc,AS
;Portd wieder als Eingang
bsf status,rp0
movlw H'FF'
movwf trisd
bcf status,rp0
; RTC Soll die Daten ausgeben
bcf portc,DS
;Daten von Portd einlesen
movf portd,w
movwf RTCData
; RTC Soll wieder hochomig werden
bsf portc,DS
bsf portc,AS
; nun ist ein Byte vom RTC gelesen
; wir versendens auf RS232
movf RTCData,w
movwf txreg
return

err movf rcreg,w


movlw D'69' ;E
movwf txreg
clrf RXCnt
return

Copyright By Andreas Gut Bueno Engineering Seite 11 von 11