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
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.
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,
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?
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
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.
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
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.
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:
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
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.
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 ?
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