Was ist den hier kurioses passiert? Ich hab es endlich geschafft den rtc auszulesen, jeodoch: gibt dieser die Zahlen von 0-90 aus, springt von 9 auf 16, 25 auf 32, 57 auf 64 usw... habt Ihr`ne Idee woran das liegen könnte? vielen Dank füür eure Hilfe!
1 | .include "m32def.inc" |
2 | |
3 | .equ XTAL = 3686400 |
4 | .equ LCD_PORT = PORTD |
5 | .equ LCD_Com = PortB |
6 | .equ PIN_RS = PB0 |
7 | .equ PIN_RW = PB1 |
8 | .equ PIN_E = PB2 |
9 | .equ RTCs = PC5 |
10 | .equ RTCi = PC3 |
11 | .equ RTCr = PC1 |
12 | .def temp1 = r16 |
13 | .def temp2 = r17 |
14 | .def temp3 = r18 |
15 | .def dat0 = r19 |
16 | .def adr0 = r20 |
17 | |
18 | |
19 | .org 0x0000 |
20 | rjmp main |
21 | .org OVF0addr |
22 | rjmp Overflow0 |
23 | |
24 | main: |
25 | ldi r16, LOW(RAMEND) |
26 | out SPL, r16 |
27 | ldi r16, HIGH(RAMEND) |
28 | out SPH, r16 |
29 | |
30 | ldi r16, (1<<CS02) |
31 | out TCCR0, r16 |
32 | ldi r16, (1<<TOIE0) |
33 | out TIMSK, r16 |
34 | sei |
35 | |
36 | ldi r16, 255 |
37 | out DDRB, r16 |
38 | |
39 | out DDRD, r16 |
40 | |
41 | rcall lcd_init |
42 | rcall rtc_init |
43 | |
44 | |
45 | ldi r19, 0b10000000 |
46 | rcall lcd_command |
47 | ldi r19, 0 |
48 | rcall lcd_data |
49 | |
50 | |
51 | loop: |
52 | |
53 | ldi adr0, 0b10000001 |
54 | rcall RtcReadCommand |
55 | rcall akt_uhr |
56 | rjmp loop |
57 | |
58 | akt_uhr: |
59 | mov temp2, dat0 |
60 | ldi temp3, '0'-1 |
61 | check_s10: |
62 | inc temp3 |
63 | subi temp2, 10 |
64 | brcc check_s10 |
65 | subi temp2, -10 |
66 | ldi r19, 0b10001011 |
67 | rcall lcd_command |
68 | mov r19, temp3 |
69 | rcall lcd_data |
70 | std_01: |
71 | ldi temp3, '0' |
72 | check_s01: |
73 | add temp3, temp2 |
74 | mov r19, temp3 |
75 | rcall lcd_data |
76 | ret |
77 | |
78 | lcd_init: |
79 | cbi PortB, 1 |
80 | ldi temp3,6 |
81 | powerupwait: |
82 | rcall delay5ms |
83 | dec temp3 |
84 | brne powerupwait |
85 | ldi temp1, 0b00110000 |
86 | out PortD, temp1 |
87 | rcall lcd_enable |
88 | rcall delay5ms |
89 | rcall lcd_enable |
90 | rcall delay5ms |
91 | rcall lcd_enable |
92 | rcall delay5ms |
93 | ldi temp1, 0b00111000 |
94 | out PortD, temp1 |
95 | rcall lcd_enable |
96 | rcall delay50us |
97 | ldi temp1, 0b00001100 |
98 | out PortD, temp1 |
99 | rcall lcd_enable |
100 | rcall delay50us |
101 | ldi r19, 0b00000001 |
102 | rcall lcd_command |
103 | rcall delay5ms |
104 | Charakter: |
105 | ldi r19, 0b01000000 |
106 | rcall lcd_command |
107 | |
108 | ldi ZL, LOW(CG00*2) |
109 | ldi ZH, HIGH(CG00*2) |
110 | ldi temp3, 8 |
111 | cg00loop: |
112 | lpm r19, z+ |
113 | rcall lcd_data |
114 | dec temp3 |
115 | brne cg00loop |
116 | ldi r19, 0b10000000 |
117 | rcall lcd_command |
118 | ret |
119 | |
120 | lcd_data: |
121 | sbi PortB, 0 |
122 | out LCD_PORT, r19 |
123 | rcall lcd_enable |
124 | cbi PortB, 0 |
125 | ret |
126 | |
127 | lcd_command: |
128 | cbi PortB, 0 |
129 | out LCD_Port, r19 |
130 | rcall lcd_enable |
131 | sbi PortB, 0 |
132 | ret |
133 | |
134 | |
135 | lcd_enable: |
136 | sbi PortB,2 |
137 | rcall delay50us |
138 | cbi PortB, 2 |
139 | ret |
140 | |
141 | delay50us: |
142 | ldi temp1, ( XTAL * 50 / 3 ) / 1000000 |
143 | delay50us_: |
144 | dec temp1 |
145 | brne delay50us_ |
146 | ret |
147 | |
148 | delay5ms: |
149 | ldi temp1, ( XTAL * 5 / 607 ) / 1000 |
150 | WGLOOP0: |
151 | ldi temp2, $C9 |
152 | WGLOOP1: |
153 | dec temp2 |
154 | brne WGLOOP1 |
155 | dec temp1 |
156 | brne WGLOOP0 |
157 | ret |
158 | |
159 | rtc_init: |
160 | ldi temp2, 255 |
161 | out DDRC, temp1 |
162 | clr temp2 |
163 | out PORTC, temp1 |
164 | ldi adr0, 0x8E |
165 | clr dat0 |
166 | rcall RtcWriteCommand |
167 | ldi adr0, 0x90 |
168 | ldi dat0, 0xA0 |
169 | rcall RtcWriteCommand |
170 | |
171 | ldi adr0, 0x80 |
172 | ldi dat0, 45 |
173 | rcall RtcWriteCommand |
174 | |
175 | ldi adr0, 0x8E |
176 | ldi dat0, 0x80 |
177 | rcall RtcWriteCommand |
178 | ret |
179 | |
180 | RtcWriteCommand: |
181 | sbi DDRC, 3 |
182 | sbi PortC, 1 |
183 | push dat0 |
184 | mov dat0, adr0 |
185 | rcall CeClkSetupTime |
186 | rcall RtcWriteByte |
187 | pop dat0 |
188 | rcall RtcWriteByte |
189 | cbi PortC, 1 |
190 | ret |
191 | |
192 | RtcWriteByte: |
193 | ldi temp1, 8 |
194 | RtcWriteByte2: |
195 | rcall ClkDataDelayTime |
196 | lsr dat0 |
197 | brcs RtcWriteByte3 |
198 | cbi PortC, 3 |
199 | rjmp RtcWriteByte4 |
200 | RtcWriteByte3: |
201 | sbi PortC, 3 |
202 | RtcWriteByte4: |
203 | nop |
204 | sbi PortC, 5 |
205 | rcall ClkLoHiTime |
206 | cbi PortC, 5 |
207 | rcall ClkLoHiTime |
208 | dec temp1 |
209 | brne RtcWriteByte2 |
210 | ret |
211 | |
212 | RtcReadCommand: |
213 | cbi DDRC, 3 |
214 | cbi PortC, 3 |
215 | sbi PortC, 1 |
216 | rcall CeClkSetupTime |
217 | mov dat0, adr0 |
218 | rcall RtcWriteByte |
219 | ldi temp1, 8 |
220 | RtcReadCmd1: |
221 | clc |
222 | sbic PinC, 3 |
223 | sec |
224 | sbi PortC, 5 |
225 | ror dat0 |
226 | rcall ClkLoHiTime |
227 | cbi PortC, 5 |
228 | rcall ClkLoHiTime |
229 | dec temp1 |
230 | brne RtcReadCmd1 |
231 | cbi PortC, 1 |
232 | ret |
233 | |
234 | |
235 | ClkLoHiTime: |
236 | ClkDataDelayTime: |
237 | ldi temp2, 1 |
238 | ClkLoHiTime1: |
239 | nop |
240 | dec temp2 |
241 | brne ClkLoHiTime1 |
242 | ret |
243 | |
244 | CeClkSetupTime: |
245 | ldi temp2,5 |
246 | nop |
247 | CeCLKSetupTime1: |
248 | dec temp2 |
249 | brne CEClkSetupTime1 |
250 | ret |
251 | |
252 | Overflow0: |
253 | |
254 | reti |
255 | |
256 | CG00: |
257 | .db 0x00, 0x04, 0x0A, 0x0A, 0x0A, 0x1F, 0x04, 0x00 |
Na Super! Vielen Dank :( Da hock ich hier die halbe Nacht und grübel was da falsch gelaufen sein könnte und du zauberst mir innherhalb von Sekunden die Antwort schäm
Daniel_HH schrieb: > .include "m32def.inc" > .equ XTAL = 3686400 > ... Geht soetwas nicht als Anhang???
..geht sicherlich auch als Anhang, war ich grad aber zu doof für -ich bite um eine harte und gerechte Bestrafung!
Leute ich hoffe, Ihr habt spontan `ne Idee: ich verwende die freien Register des DS1302 um andere Daten zu sichern und zu lesen, diese werden ständig aktualisiert. Wenn jedoch Daten geschrieben werden, kann es passieren, dass andere Register urplötzlich Ihre Daten verlieren -beim auslesen bekomme ich nur noch sinnloses raus... Ich habe das write Protection Bit natürlich nicht gesetzt da ich mit gesetzten WPB keine Daten übertragen kann... Habt Ihr`ne Idee woran`s liegen kann?
Du hast ausversehen das *.hex gepostet. Poste mal das *.c bzw. *.asm. Peter
...jetzt hab ich mal ein wenig rum probiert: Der Fehler tritt nicht auf wenn ich den Timer deaktiviere. Ich kann es mir zwar nicht plausibel erklären aber ich denke, dass das Carry-Flag aus dem cpi Vergleich wohl irgendwie einfluss auf das Hauptprogramm nehmen muß...
Kleiner Tip Du machst dir viel zu viel Arbeit. Häng deinen Source Code ganz einfach einfach nur an. Die Forensoftware weiß schon, was sie damit machen muss und welcher Syntax Highlighter dafür vernünftig ist.
Daniel_HH schrieb: > ...jetzt hab ich mal ein wenig rum probiert: Der Fehler tritt nicht auf > wenn ich den Timer deaktiviere. Ich kann es mir zwar nicht plausibel > erklären aber ich denke, dass das Carry-Flag aus dem cpi Vergleich wohl > irgendwie einfluss auf das Hauptprogramm nehmen muß... Na ja. Wenn du in einer ISR nicht automatisch und im Schlaf sofort erst mal das SREG sicherst und als letztes in der ISR wiederherstellst, sollte man dir sowieso mit dem nassen Fetzen eine überbraten
1 | Overflow0: |
2 | cpi MenuDelay, 0 |
3 | breq Overflow0_Out |
4 | dec MenuDelay |
5 | |
6 | Overflow0_Out: |
7 | reti |
Fehler. Schwerer Fehler!
"SREF Sichern" hört sich interessant an :) Für den Spruch: Mit nassen Fetzten einen überbraten, bekommst du direkt`nen Oskar von mir :)) Genial -den werd ich mir merken lach
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.