Ansteuerung RTC 72421

Gast #4666666
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
Gast #4667604
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,
(Firma: Vescomp) #4667654
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.
Gast #4667719
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
Gast #4667932
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.
(Firma: Vescomp) #4668087
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.
Gast #4672012
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.
(Firma: Vescomp) #4672079
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 ?
Gast #4672139
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren