Forum: Mikrocontroller und Digitale Elektronik Ansteuerung RTC 72421


von blutengel (Gast)


Lesenswert?

Hallo,

nach längerer Zeit bräuchte ich mal wieder Hilfe.

Ich versuche nun schon seit 2 Tagen den RTC 72421 ans laufen zu 
bekommen.

Was ich leider nicht verstehe ist der Rd und der Wr Pin.
Wenn ich z.B eine Adresse anliegen habe, und auf dem Datenbus ein Signal 
habe, was mache ich dann mit den beiden Rd und Wr? Wird der Wr auf 1 
gesetzt und dann werden alle Daten nacheinander mit den passenden 
Adressen auf den Bus gelegt. Oder Müssen Adresse und Daten anliegen und 
Und beide Pin´s werden einmal an und aus geschaltet. Leider verstehe ich 
das nicht ganz. Im Datenblatt steht leider nicht viel darüber drin.


MFG

blutengel

von hp-freund (Gast)


Lesenswert?

http://s100computers.com/My%20System%20Pages/PIC&RTC%20Board/Epson%2072421%20manual.pdf

Page-5/6

Ist so wie es früher war.

Adresse, Daten anlegen -> Schreibpuls

bzw.

Adresse anlegen -> Lesepuls -> Daten

von hp-freund (Gast)


Lesenswert?

Und ALE nicht vergessen bzw. an VDD.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

blutengel schrieb:
> Und beide Pin´s werden einmal an und aus geschaltet. Leider verstehe ich
> das nicht ganz. Im Datenblatt steht leider nicht viel darüber drin.

 Adresse anlegen, Daten anlegen, RD=HI, WR auf LOW - Daten
 reinschreiben.

 Adresse anlegen, Daten als Eingang, WR=HI, RD auf LOW - Daten
 rauslesen.

 Und RD und WR immer auf HI wenn IDLE.

: Bearbeitet durch User
von blutengel (Gast)


Lesenswert?

Hi,

danke schon mal für die schnelle Antwort.
Wenn ich das richtig verstehe läuft es also so ab:

Daten schreiben

Rd auf H und Rd auf H.

A0,A1,A2,A3 Adresse anlegen
D0,D1,D2,D3 Daten anlegen

Rd auf H und Wr auf L

dann

Rd auf L und Wr auf H

und danach

Rd auf H und Rd auf H.


Daten lesen

Rd auf H und Rd auf H.

A0,A1,A2,A3 Adresse anlegen

Rd auf L und Wr auf H

dann

Rd auf H und Wr auf L

Daten von D0,D1,D2,D3 lesen

und danach

Rd auf H und Rd auf H.

Im datenbaltt steht ja sogar High Impedance (RTC not used)
Rd und Wr auf H oder L. Aber in der Zeile von Wr und Rd steht extra 
"Make sure that Rd and Wr are never low at the same Time. Das 
wiederspricht sich doch oder,

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

blutengel schrieb:
> Daten schreiben
 Falsch. So:
1
Rd auf Hi und Wr auf Hi.    // IDLE
2
A0,A1,A2,A3 anlegen         // Adresse anlegen
3
D0,D1,D2,D3 als Ausgang     // Und natürlich entsprechend Data anlegen
4
Wr auf Lo
5
Daten werden geschrieben
6
Wr auf Hi                   // Fertig, IDLE
7
D0,D1,D2,D3 als Eingang     // Zur Sicherheit

> Daten lesen
 Falsch. So:
1
Rd auf Hi und Wr auf Hi.    // IDLE
2
A0,A1,A2,A3 anlegen         // Adresse anlegen
3
D0,D1,D2,D3 als Eingang  
4
Rd auf Lo
5
Daten lesen
6
Rd auf Hi

> "Make sure that Rd and Wr are never low at the same Time. Das
> wiederspricht sich doch oder,

 Nein, CS0 ist auch auf H, RTC ist nicht selected.

von blutengel (Gast)


Lesenswert?

Cool Danke. Jetzt habe ich es verstanden. Eine Sache frag ich mich aber 
noch. Muss ich jedes mal die 4 Pins D0-D3 als Eingan bzw als Ausgang 
umschalten über das Datenrichtungsregister?

von Georg (Gast)


Lesenswert?

blutengel schrieb:
> Muss ich jedes mal die 4 Pins D0-D3 als Eingang bzw als Ausgang
> umschalten über das Datenrichtungsregister?

Ja, wenn du sie zum Schreiben UND zum Lesen benutzen willst, das ist 
praktisch ein bidirektionaler Datenbus.

Der inaktive Zustand ist Ax output, Dx input, /RD,/WR,/CS0 hi,
ALE und CS1 braucht man nicht und müssen dann immer hi sein.

Lesen: Ax setzen, /CS0 lo, /RD lo, Dx lesen, /RD hi, /CS0 hi, fertig

Schreiben: Ax setzen, Dx output und setzen, /CS0 lo, /WR lo, /WR hi, 
/CS0 hi, Dx wieder input, fertig

Georg

von blutengel (Gast)


Lesenswert?

CS0 ist bei mir fest auf GND. Müsste doch auch gehen oder?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

blutengel schrieb:
> CS0 ist bei mir fest auf GND. Müsste doch auch gehen oder?

 Wenn CS1 auf Hi ist oder durch einen Pin auf Hi gesetzt werden
 kann, ja.

von blutengel (Gast)


Lesenswert?

Zwar blicke ich jetzt durch, aber leider funktioniert gar nichts. An der 
Hardware kann es nicht liegen. Habe alles durchgemessen. Auch die Ports 
sind alles Ok. Hier mal mein Programm:
1
$regfile = "m64def.dat"                                     ' ATmega168
2
$crystal = 16000000
3
$hwstack = 16
4
$swstack = 128
5
$include "GLCD_VDI/GLCD_VDI_INIT.BAS"
6
7
8
9
'Variablen*************************************
10
Dim H1 As Byte
11
Dim H10 As Byte
12
Dim M1 As Byte
13
Dim M10 As Byte
14
Dim S1 As Byte
15
Dim S10 As Byte
16
17
Dim H1_str As String * 2
18
Dim H10_str As String * 2
19
Dim M1_str As String * 2
20
Dim M10_str As String * 2
21
Dim S1_str As String * 2
22
Dim S10_str As String * 2
23
24
'Variablen Zuweisung*************************
25
H1 = 0
26
H10 = 0
27
M1 = 0
28
M10 = 0
29
S1 = 0
30
S10 = 0
31
32
'Config**************************************
33
Declare Sub Lcd_ausgabe()
34
Declare Sub Convert_to_string()
35
Declare Sub Init_rtc()
36
Declare Sub Rtc_bereit()
37
Declare Sub Rtc_lesen()
38
Declare Sub Rtc_not_selected()
39
Declare Sub Rtc_write()
40
Declare Sub Rtc_read()
41
Declare Sub Change_port_b_input()
42
Declare Sub Change_port_b_output()
43
Config Portb.0 = Output
44
Config Portb.1 = Output
45
Config Portb.2 = Output
46
Config Portb.3 = Output
47
Config Portb.4 = Output
48
Config Portb.5 = Output
49
Config Portb.6 = Output
50
Config Portb.7 = Output
51
52
Config Portd.0 = Output
53
Config Portd.1 = Output
54
55
'Aliasse***************************************
56
57
A0 Alias Portb.0
58
A1 Alias Portb.1
59
A2 Alias Portb.2
60
A3 Alias Portb.3
61
D0 Alias Portb.4
62
D1 Alias Portb.5
63
D2 Alias Portb.6
64
D3 Alias Portb.7
65
W_r Alias Portd.0
66
R_d Alias Portd.1
67
68
'**********************************************
69
Lcd_font = Loadlabel(font8x8tt)                             ' Anpassung der Ports/Pins darin vornehmen!
70
Lcd_cls
71
Lcd_draw
72
Waitms 200
73
74
Call Init_rtc
75
76
77
Do
78
79
80
Call Rtc_lesen
81
Call Convert_to_string
82
Call Lcd_ausgabe
83
Waitms 100
84
85
86
87
Loop
88
End
89
90
91
92
'Hauptprogramm Ende****************************
93
94
'Subroutinen RTC*******************************
95
96
Sub Rtc_write()
97
98
Waitus 1000
99
   Reset W_r
100
   Waitus 120
101
   Set W_r
102
End Sub
103
104
Sub Rtc_read()
105
106
   Reset R_d
107
   Waitus 120
108
   S1 = Portb
109
   Set R_d
110
111
112
113
End Sub
114
115
Sub Rtc_not_selected()
116
117
   Set R_d
118
   Set W_r
119
120
End Sub
121
122
Sub Rtc_lesen()                                             'Zum Testen nur Sekunde 1er Stelle auslesen
123
124
125
   Call Change_port_b_input()
126
   Portb = &B00000000            'Adresse Sekunde 1er Stelle
127
   Call Rtc_read
128
129
130
End Sub
131
132
Sub Init_rtc()
133
134
   Call Rtc_not_selected
135
   Call Change_port_b_output
136
137
138
139
   Portb = &B01001111                                       'Adresse REG F Daten ausgeben Test=0 24h,Uhr Start,Reset inaktiv
140
   Call Rtc_write
141
   Portb = &B00001110                                       'Adresse REG E Daten ausgeben
142
   Call Rtc_write
143
   Portb = &B00001101                                       'Adresse REG D Daten ausgeben Hold auf 0
144
   Call Rtc_write
145
146
   Call Rtc_bereit                                          'Abfrage Busy Bit
147
148
   Portb = &B01111111                                       'Adresse REG F Daten ausgeben Test=0 24h,Uhr Stop,Reset aktiv
149
   Call Rtc_write
150
   Portb = &B01101110                                       'Adresse REG F Daten ausgeben Test=0 24h,Uhr Stop,Reset inaktiv
151
   Call Rtc_write
152
   Portb = &B00000000                                       'Adresse Sekunden 1er Stelle  Sekunden Wert bei 0
153
   Call Rtc_write
154
   Portb = &B00000001                                       'Adresse Sekunden 10er Stelle Sekunden Wert bei 0
155
   Call Rtc_write
156
   Portb = &B00000010                                       'Adresse Minuten 1er StelleM inuten Wert bei 0
157
   Call Rtc_write
158
   Portb = &B00000011                                       'Adresse Minuten 10er Stelle Minuten Wert bei 0
159
   Call Rtc_write
160
   Portb = &B00000100                                       'Adresse Stunden 1er Stelle Stunden Wert bei 0
161
   Call Rtc_write
162
   Portb = &B00000101                                       'Adresse Stunden 10er Stelle Stunden Wert bei 0
163
   Call Rtc_write
164
   Portb = &B01001111                                       'Adresse REG F Daten ausgeben Test=0 24h,Uhr aktiv,Reset inaktiv
165
   Call Rtc_write
166
   Portb = &B00001110                                       'Adresse REG E Daten ausgeben
167
   Call Rtc_write
168
   Portb = &B01001101                                       'Adresse REG D Daten ausgeben Hold auf 0
169
   Call Rtc_write
170
171
   Call Change_port_b_input
172
173
End Sub
174
175
176
177
Sub Rtc_bereit()
178
179
180
   Waitus 250
181
182
183
End Sub
184
'Subroutinen allgemein*************************
185
186
Sub Change_port_b_input()
187
188
   Config Pinb.4 = Input
189
   Config Pinb.5 = Input
190
   Config Pinb.6 = Input
191
   Config Pinb.7 = Input
192
193
End Sub
194
195
Sub Change_port_b_output()
196
197
   Config Portb.4 = Output
198
   Config Portb.5 = Output
199
   Config Portb.6 = Output
200
   Config Portb.7 = Output
201
202
End Sub
203
204
Sub Convert_to_string()
205
206
   H1_str = Str(h1)
207
   H10_str = Str(h10)
208
   M1_str = Str(m1)
209
   M10_str = Str(m10)
210
   S1_str = Str(s1)
211
   S10_str = Str(s10)
212
End Sub
213
214
Sub Lcd_ausgabe()
215
216
   Lcd_text 20 , 1 , 1 , 0 , "Aktuelle Uhrzeit"
217
   Lcd_text 7 , 12 , 1 , 0 , H1_str
218
   Lcd_text 0 , 12 , 1 , 0 , H10_str
219
   Lcd_text 13 , 12 , 1 , 0 , ":"
220
   Lcd_text 17 , 12 , 1 , 0 , M10_str
221
   Lcd_text 28 , 12 , 1 , 0 , ":"
222
   Lcd_text 32 , 12 , 1 , 0 , S10_str
223
   Lcd_text 40 , 12 , 1 , 0 , S1_str
224
   Lcd_draw
225
226
227
End Sub
228
229
230
231
'Subroutinen Ende******************************
232
233
$include "GLCD_VDI/GLCD_VDI_MAIN.BAS"
234
$data
235
'Fonts Einbinden
236
$include "font8x8tt.font"
237
'$include "font16x16.font"


Es passier mal so rein gar nichts.
Wenn ich die Adresse für die Sekunde 1er Stelle ausgebe, und den Lese 
Impuls aktiviere kommt leider nichts dabei raus. Auch eine änderung ist 
nicht festzustellen. Sollte die Uhr laufen müsste sich der Wert ja 
irgendwann ändern. Ich weiss einfach nicht mehr weiter. Vielleicht bin 
ich auch auf dem total falschen Weg. Vielleicht findet von euch jemand 
was.

von Georg (Gast)


Lesenswert?

blutengel schrieb:
> Es passier mal so rein gar nichts.

CS ignorierst du völlig?

Georg

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

blutengel schrieb:
> irgendwann ändern. Ich weiss einfach nicht mehr weiter. Vielleicht bin
> ich auch auf dem total falschen Weg. Vielleicht findet von euch jemand
> was.

 Also:
 1) Lesen tut man mit PinB und nicht mit PortB.
 2) So etwas nennt man Spaghetti Code. Versuche mal irgendwie Blocks
    mit zusammenhängenden Code zu bilden.

 Hier, deine LCD-Routinen kannst du selber dazuschreiben:
1
$regfile = "m64def.dat"                                     ' ATmega168
2
$crystal = 16000000
3
$hwstack = 16
4
$swstack = 128
5
6
Dim Rbyt As Byte , Wbyt As Byte
7
Dim La As Byte , Lb As Byte
8
9
'Config**************************************
10
Declare Sub Setup_rtc()
11
Declare Sub Rtc_write(byval Adr As Byte , Byval Daten As Byte)
12
Declare Function Rtc_read(byval Adr As Byte) As Byte
13
14
'Aliasse***************************************
15
W_r Alias Portd.0
16
R_d Alias Portd.1
17
18
Const Dmask = $f0
19
Const Amask = $0f
20
21
'Hauptprogramm ****************************
22
Call Setup_rtc
23
Waitms 200
24
25
Do
26
  For Wbyt = 0 To 11
27
    Rbyt = Rtc_read(wbyt)
28
'    Call Convert_to_string
29
'    Call Lcd_ausgabe
30
'    Call Rtc_write(wbyt , Wbyt)
31
    Waitms 100
32
  Next
33
Loop
34
End
35
36
'Subroutinen RTC*******************************
37
Sub Setup_rtc()
38
   Ddrb = Amask
39
   Portb = Dmask
40
   DDRD = $03
41
   Set R_d
42
   Set W_r
43
End Sub
44
45
Sub Rtc_write(adr As Byte , Daten As Byte)
46
   Ddrb = $ff
47
   La = Adr And Amask
48
   Lb = Daten
49
   Shift Lb , Left , 4
50
   La = La Or Lb
51
   Portb = La
52
   Waitus 1
53
   Reset W_r
54
   Waitus 1
55
   Set W_r
56
   Ddrb = Amask
57
End Sub
58
59
Function Rtc_read(byval Adr As Byte) As Byte
60
   La = Adr And Amask
61
   La = La Or Dmask
62
   Portb = La
63
   Waitus 1
64
   Reset R_d
65
   Waitus 1
66
   La = Pinb
67
   Shift La , Right , 4
68
   Set R_d
69
   Rtc_read = La
70
End Function

 Nicht ausprobiert, sollte aber OK sein.

EDIT:
Georg schrieb:
> CS ignorierst du völlig?

 Vorausgesetzt, die Steuerleitungen stimmen.

: Bearbeitet durch User
von blutengel (Gast)


Lesenswert?

Cs1 liegt bei mir dauerhaft auf High. Das hätte ich erwähnen sollen

von blutengel (Gast)


Lesenswert?

Super danke funktioniert auf Anhieb. Ist auch leicht verständlich. 
Manchmal hat man ein Brett vorm Kopf. An den Shift Befehl habe ich gar 
nicht gedacht. Benutzte ich so gut wie gar nicht

von blutengel (Gast)


Lesenswert?

EIn kleines Problem habe ich da noch. Ich möchte das ganze für einen 
Countdown Timer nutzen bzw. für einen Belichtungstimer. Wie bekomme ich 
es hin das die Zeit von einer eingestellten Zeit auf Null läuft. Ich 
dachte da an sowas wie umkehren sowie z.B 10 - die 1er Sekunde.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

blutengel schrieb:
> EIn kleines Problem habe ich da noch. Ich möchte das ganze für einen
> Countdown Timer nutzen bzw. für einen Belichtungstimer. Wie bekomme ich
> es hin das die Zeit von einer eingestellten Zeit auf Null läuft. Ich
> dachte da an sowas wie umkehren sowie z.B 10 - die 1er Sekunde.

 So viel ich gesehen habe, kann man es nur als Uhr laufen lassen, also
 Zeit auf 00:00:00 setzen und den gewünschten Period abwarten.

 Beim auslesen der Zeit immer zuerst Busy in Register 0x0D abfragen.

 Hast du es schon geschafft, Zeit bzw. Datum zu stellen ?

von Georg (Gast)


Lesenswert?

blutengel schrieb:
> Wie bekomme ich
> es hin das die Zeit von einer eingestellten Zeit auf Null läuft

Wieviel Zeit? Sekunden oder ganze Jahre?

Da die Uhr nur vorwärts zählt, brauchst du eine Zeit-Arithmetik - du 
ziehst die aktuelle Zeit ab vom Zielzeitpunkt.

Wenn du z.B. 100 Sek belichten willst, rechnest du zum Start JETZT + 100 
Sek und merkst dir diesen Wert. Davon subtrahierst du jede Sekunde JETZT 
und zeigst den Wert an. So kann der Chip auch weiterhin als Echtzeituhr 
dienen, ihn auf 0 zurückzustellen lohnt sich nicht, rechnen musst du so 
oder so, also lieber gleich einmal richtig, d.h. eine Routine schreiben, 
die 2 Zeiten addiert oder subtrahiert.

Georg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.