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
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
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
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,
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.
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 |
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.