Hallo zusammen, Ich habe mir heute eine Uhr für den ATmega8 programmiert, die den 16-Bit Timer (Timer1) benutzt. Die Uhrzeit soll immer um 2 10tel Sekunden erhöht werden. Dies wird auf einem LCD ausgegeben. Der Takt des ATmega beträgt 16MHZ, ich verwende den Prescaler 64, Takt ist also 250.000 Hertz. Jetzt lasse ich über die Timer Compare Funktion bei jedem 50.0000 sten Takt ein Interrupt ausgeben, d.h. 5 Interrupts/sek ==> 1 Interrupt pro 2 10tek sek. Das Hochzählen und die Ausgabe am Bildschirm funktioniert soweit. Mein Problem: Das Hochzählen geht viel zu langsam, die Zehntel Sekunden Stelle wir nur etwa alle 4 Sekunden erhöht. Im Anhang befindet sich mein Programm. Findet vielleicht jemand einen Fehler? Danke schon mal im Voraus mfg Philipp
Läuft wahrscheinlich immer noch mit Int-RC Osc. Fuses falsch programmiert.
Hier stimmt was nicht
1 | Overflow: cpi tel10, 8 |
2 | breq sekErhoehen |
3 | add tel10, r28 |
4 | reti
|
5 | sekErhoehen: clr tel10 |
6 | cpi sek,6 |
7 | breq sek10Erhoehen |
8 | inc sek |
9 | reti
|
10 | sek10Erhoehen: clr sek |
11 | cpi sek10, 6 |
12 | breq minErhoehen |
13 | inc sek10 |
14 | reti
|
15 | minErhoehen: inc min |
16 | clr sek10 |
17 | reti
|
Der erste cpi Warum 8? Ich denke du kriegst den Interrupt alls 2/10 Sekunden. Dann brauchst aber 5 Interrupts bis eine Sekunde um ist. sekErhoehen Warum vergleichst du mit 6? Die Einerstelle muss bis 10 laufen, ehe der Übertrag in die nächste Stelle erfolgt. Überhaupt: deine Technik des zuerst Vergleichens und dann mglw. Erhöhen ist nicht koscher. Edit: Hab jetzt erst gesehen, dass du tel10 immer um 2 erhöhst, das machts zwar auch nicht richtiger aber zumindest nahe dran. Koscher ist die Sequenz trotzdem nicht.
moin erstmal beim Eintritt in den IRQ das Statusregister sichern ! und das andere dann zB. so (für 5ms Int.) Die Zeile cpi tock,200 musst du anpassen
1 | tick:
|
2 | in status,SREG ;preserve status register |
3 | |
4 | inc tock ;add one to 5 ms 'tock' counter |
5 | cpi tock,200 ;is one second up? |
6 | breq onesec ;yes, add one to seconds |
7 | nop ;balance interrupt time |
8 | nop
|
9 | rjmp nosecond ;no, escape |
10 | onesec: inc second ;add one to seconds |
11 | mov timer,second ; wegen cpi -geht nur in den oberen registern |
12 | cpi timer,60 ; is min. full |
13 | brne clsecond ;no |
14 | clr second ;yes,clear second |
15 | inc minute ;add one to minute |
16 | mov timer,minute |
17 | cpi timer,60 ;is 1 hour |
18 | brne clsecond ;no |
19 | clr minute ;yes |
20 | inc hour ;inc hour |
21 | mov timer,hour |
22 | cpi timer,24 ;24 hour |
23 | brne clsecond ;no |
24 | clr hour ;yes 24 full |
25 | clr minute |
26 | clr second |
27 | clsecond: clr tock ;clear 5 ms counter |
28 | |
29 | nosecond: |
30 | out SREG,status ;restore status register |
31 | reti ;return to main |
Ich überprüfe zuerst auf 8, weil wenn ich zu 8 2 addiere muss danach die nächste Stelle auch erhöht werden. Bei sek erhöhen muss ich aber dann auch auf 8 überprüfen, da diese ja bis 10 (also 0) gehen sollen. An der Zählroutine muss ich noch eine kleine Änderung vornehmen. Mein Hauptproblem ist, dass mein ATmega8 noch den internen Takt nimmt. Jetzt muss ich mich erstmal belesen, wie ich das ganze mit den Fuse Bits auf 16 MHZ External Quarz Resonator umstelle.
ldi temp, 0b00001000 ; CTC Modus aktivieren out TCCR1B, temp ???????? ldi temp, 0b00010000 ; Interrupt on Compare out TIMSK, temp ldi temp, 0b00000011 ; Prescaler 64 (250KHZ) out TCCR1B, temp ???????? wenn du das TCCR1B mit 0b00000011 ladest überschreibst du den CTC wert
Philipp wrote: > Mein Hauptproblem ist, dass mein ATmega8 noch den internen Takt nimmt. Das ist wohl war. Icke hat ja schon das nächste Problem aufgezeigt (das erklärt aber auch noch nicht deinen Faktor 4) > Bei sek erhöhen muss ich aber dann auch auf 8 überprüfen, da diese ja > bis 10 (also 0) gehen sollen. Du bist gerade drauf und drann, dich selbst auszutricksen :-)
Stimmt, du hast natürlich recht, werde das gleich mal ändern. Kann mir vielleicht jemand sagen, wie ich die Fuse Bits einstellen muss, damit der Controller auf 16 MHZ läuft? Habe beim googlen noch nichts hilfreiches gefunden.
Du musst auf 'external crystal' fusen. Details finden sich in deinem Datenblatt http://www.mikrocontroller.net/articles/AVR_Fuses
Habe ich auch schon gelesen. Leider gibt es für den ATmega8-16PU scheinbar kein Separates Datenblatt, es gibt nur das vom normalen ATmega8 und in diesem stehen die Fuse-Bit Einstellungen nur bis 8MHZ.
Philipp wrote: > Habe ich auch schon gelesen. > Leider gibt es für den ATmega8-16PU scheinbar kein Separates Datenblatt, > es gibt nur das vom normalen ATmega8 und in diesem stehen die Fuse-Bit > Einstellungen nur bis 8MHZ. Nö. Es gibt eine Einstellung (nämlich mit CKOPT programmiert), die für alle Frequenzen gilt, die nicht in der Tabelle explizit aufgeführt sind...
Ok, vielen Dank für eure Hilfe, ich habe die Einstellungen gefunden. Die Einstellungen für 16MHZ: CKSEL0 - CKSEL3: 1111 SUT0 - SUT1: 11 CKOPT: 0 Wichtig: In Ponyprog sind die Haken Invertiert, also wo eine Eins steht keinen Haken setzen!!! Das Programm funktioniert jetzt wie es soll Vielen Dank nochmal für eure Hilfe. Im Anhang ist noch das verbesserte, Endgültige Programm
Kann jemand von den Regulars mal da drüber schaun. Ich bin der Ansicht, dass die Uhr in der Sekundenanzeige nicht von 0 bis 59 sondern von 1 bis 69 zählt. Kanns aber im Moment nicht ausprobieren.
@Philipp: Du solltest zumindest das Statusregister retten da cpi einige Flaggen ändert.
@ Karl heinz Buchegger Jepp! Und die Anzahl der Zehntel (tel10) stimmt auch nicht Testprogramm in Python
1 | #!/path/to/python
|
2 | import time |
3 | |
4 | """
|
5 | Overflow: cpi tel10, 8
|
6 | breq sekErhoehen
|
7 | inc tel10
|
8 | reti
|
9 | sekErhoehen: clr tel10
|
10 | cpi sek,9
|
11 | breq sek10Erhoehen
|
12 | inc sek
|
13 | reti
|
14 | sek10Erhoehen: clr sek
|
15 | cpi sek10, 6
|
16 | breq minErhoehen
|
17 | inc sek10
|
18 | reti
|
19 | minErhoehen: clr sek10
|
20 | cpi min, 9
|
21 | breq min10Erhoehen
|
22 | inc min
|
23 | reti
|
24 | min10Erhoehen: clr min
|
25 | inc min10
|
26 | reti
|
27 | """
|
28 | |
29 | def Overflow(): |
30 | global tel10 |
31 | if tel10 == 8: |
32 | sekErhoehen() |
33 | else: |
34 | tel10 = tel10 + 1 |
35 | return
|
36 | |
37 | def sekErhoehen(): |
38 | global tel10 |
39 | global sek |
40 | tel10 = 0 |
41 | if sek == 9: |
42 | sek10Erhoehen() |
43 | else: |
44 | sek = sek + 1 |
45 | return
|
46 | |
47 | def sek10Erhoehen(): |
48 | global sek |
49 | global sek10 |
50 | sek = 0 |
51 | if sek10 == 6: |
52 | minErhoehen() |
53 | else: |
54 | sek10 = sek10 + 1 |
55 | return
|
56 | |
57 | def minErhoehen(): |
58 | global sek10 |
59 | global min1 |
60 | sek10 = 0 |
61 | if min1 == 6: |
62 | min10Erhoehen() |
63 | else: |
64 | min1 = min1 + 1 |
65 | return
|
66 | |
67 | def min10Erhoehen(): |
68 | global min1 |
69 | global min10 |
70 | min1 = 0 |
71 | min10 = min10 + 1 |
72 | return
|
73 | |
74 | def main(): |
75 | for i in range(0,36000): |
76 | print "%d%d:%d%d.%d" % (min10, min1, sek10, sek, tel10), |
77 | Overflow() |
78 | # time.sleep(0.1)
|
79 | return
|
80 | |
81 | if __name__ == "__main__": |
82 | tel10 = 0 |
83 | sek = 0 |
84 | sek10 = 0 |
85 | min1 = 0 |
86 | min10 = 0 |
87 | main() |
Ausgabe:
1 | 00:00.0 00:00.1 00:00.2 00:00.3 00:00.4 00:00.5 00:00.6 00:00.7 00:00.8 |
2 | 00:01.0 00:01.1 00:01.2 00:01.3 00:01.4 00:01.5 00:01.6 00:01.7 00:01.8 |
3 | 00:02.0 00:02.1 00:02.2 00:02.3 00:02.4 00:02.5 00:02.6 00:02.7 00:02.8 |
4 | 00:03.0 00:03.1 00:03.2 00:03.3 00:03.4 00:03.5 00:03.6 00:03.7 00:03.8 |
5 | 00:04.0 00:04.1 00:04.2 00:04.3 00:04.4 00:04.5 00:04.6 00:04.7 00:04.8 |
6 | 00:05.0 00:05.1 00:05.2 00:05.3 00:05.4 00:05.5 00:05.6 00:05.7 00:05.8 |
7 | 00:06.0 00:06.1 00:06.2 00:06.3 00:06.4 00:06.5 00:06.6 00:06.7 00:06.8 |
8 | 00:07.0 00:07.1 00:07.2 00:07.3 00:07.4 00:07.5 00:07.6 00:07.7 00:07.8 |
9 | 00:08.0 00:08.1 00:08.2 00:08.3 00:08.4 00:08.5 00:08.6 00:08.7 00:08.8 |
10 | 00:09.0 00:09.1 00:09.2 00:09.3 00:09.4 00:09.5 00:09.6 00:09.7 00:09.8 |
11 | 00:10.0 00:10.1 00:10.2 00:10.3 00:10.4 00:10.5 00:10.6 00:10.7 00:10.8 |
12 | 00:11.0 00:11.1 00:11.2 00:11.3 00:11.4 00:11.5 00:11.6 00:11.7 00:11.8 |
13 | 00:12.0 00:12.1 00:12.2 00:12.3 00:12.4 00:12.5 00:12.6 00:12.7 00:12.8 |
14 | 00:13.0 00:13.1 00:13.2 00:13.3 00:13.4 00:13.5 00:13.6 00:13.7 00:13.8 |
15 | 00:14.0 00:14.1 00:14.2 00:14.3 00:14.4 00:14.5 00:14.6 00:14.7 00:14.8 |
16 | 00:15.0 00:15.1 00:15.2 00:15.3 00:15.4 00:15.5 00:15.6 00:15.7 00:15.8 |
17 | 00:16.0 00:16.1 00:16.2 00:16.3 00:16.4 00:16.5 00:16.6 00:16.7 00:16.8 |
18 | 00:17.0 00:17.1 00:17.2 00:17.3 00:17.4 00:17.5 00:17.6 00:17.7 00:17.8 |
19 | 00:18.0 00:18.1 00:18.2 00:18.3 00:18.4 00:18.5 00:18.6 00:18.7 00:18.8 |
20 | 00:19.0 00:19.1 00:19.2 00:19.3 00:19.4 00:19.5 00:19.6 00:19.7 00:19.8 |
21 | 00:20.0 00:20.1 00:20.2 00:20.3 00:20.4 00:20.5 00:20.6 00:20.7 00:20.8 |
22 | 00:21.0 00:21.1 00:21.2 00:21.3 00:21.4 00:21.5 00:21.6 00:21.7 00:21.8 |
23 | 00:22.0 00:22.1 00:22.2 00:22.3 00:22.4 00:22.5 00:22.6 00:22.7 00:22.8 |
24 | 00:23.0 00:23.1 00:23.2 00:23.3 00:23.4 00:23.5 00:23.6 00:23.7 00:23.8 |
25 | 00:24.0 00:24.1 00:24.2 00:24.3 00:24.4 00:24.5 00:24.6 00:24.7 00:24.8 |
26 | 00:25.0 00:25.1 00:25.2 00:25.3 00:25.4 00:25.5 00:25.6 00:25.7 00:25.8 |
27 | 00:26.0 00:26.1 00:26.2 00:26.3 00:26.4 00:26.5 00:26.6 00:26.7 00:26.8 |
28 | 00:27.0 00:27.1 00:27.2 00:27.3 00:27.4 00:27.5 00:27.6 00:27.7 00:27.8 |
29 | 00:28.0 00:28.1 00:28.2 00:28.3 00:28.4 00:28.5 00:28.6 00:28.7 00:28.8 |
30 | 00:29.0 00:29.1 00:29.2 00:29.3 00:29.4 00:29.5 00:29.6 00:29.7 00:29.8 |
31 | 00:30.0 00:30.1 00:30.2 00:30.3 00:30.4 00:30.5 00:30.6 00:30.7 00:30.8 |
32 | 00:31.0 00:31.1 00:31.2 00:31.3 00:31.4 00:31.5 00:31.6 00:31.7 00:31.8 |
33 | 00:32.0 00:32.1 00:32.2 00:32.3 00:32.4 00:32.5 00:32.6 00:32.7 00:32.8 |
34 | 00:33.0 00:33.1 00:33.2 00:33.3 00:33.4 00:33.5 00:33.6 00:33.7 00:33.8 |
35 | 00:34.0 00:34.1 00:34.2 00:34.3 00:34.4 00:34.5 00:34.6 00:34.7 00:34.8 |
36 | 00:35.0 00:35.1 00:35.2 00:35.3 00:35.4 00:35.5 00:35.6 00:35.7 00:35.8 |
37 | 00:36.0 00:36.1 00:36.2 00:36.3 00:36.4 00:36.5 00:36.6 00:36.7 00:36.8 |
38 | 00:37.0 00:37.1 00:37.2 00:37.3 00:37.4 00:37.5 00:37.6 00:37.7 00:37.8 |
39 | 00:38.0 00:38.1 00:38.2 00:38.3 00:38.4 00:38.5 00:38.6 00:38.7 00:38.8 |
40 | 00:39.0 00:39.1 00:39.2 00:39.3 00:39.4 00:39.5 00:39.6 00:39.7 00:39.8 |
41 | 00:40.0 00:40.1 00:40.2 00:40.3 00:40.4 00:40.5 00:40.6 00:40.7 00:40.8 |
42 | 00:41.0 00:41.1 00:41.2 00:41.3 00:41.4 00:41.5 00:41.6 00:41.7 00:41.8 |
43 | 00:42.0 00:42.1 00:42.2 00:42.3 00:42.4 00:42.5 00:42.6 00:42.7 00:42.8 |
44 | 00:43.0 00:43.1 00:43.2 00:43.3 00:43.4 00:43.5 00:43.6 00:43.7 00:43.8 |
45 | 00:44.0 00:44.1 00:44.2 00:44.3 00:44.4 00:44.5 00:44.6 00:44.7 00:44.8 |
46 | 00:45.0 00:45.1 00:45.2 00:45.3 00:45.4 00:45.5 00:45.6 00:45.7 00:45.8 |
47 | 00:46.0 00:46.1 00:46.2 00:46.3 00:46.4 00:46.5 00:46.6 00:46.7 00:46.8 |
48 | 00:47.0 00:47.1 00:47.2 00:47.3 00:47.4 00:47.5 00:47.6 00:47.7 00:47.8 |
49 | 00:48.0 00:48.1 00:48.2 00:48.3 00:48.4 00:48.5 00:48.6 00:48.7 00:48.8 |
50 | 00:49.0 00:49.1 00:49.2 00:49.3 00:49.4 00:49.5 00:49.6 00:49.7 00:49.8 |
51 | 00:50.0 00:50.1 00:50.2 00:50.3 00:50.4 00:50.5 00:50.6 00:50.7 00:50.8 |
52 | 00:51.0 00:51.1 00:51.2 00:51.3 00:51.4 00:51.5 00:51.6 00:51.7 00:51.8 |
53 | 00:52.0 00:52.1 00:52.2 00:52.3 00:52.4 00:52.5 00:52.6 00:52.7 00:52.8 |
54 | 00:53.0 00:53.1 00:53.2 00:53.3 00:53.4 00:53.5 00:53.6 00:53.7 00:53.8 |
55 | 00:54.0 00:54.1 00:54.2 00:54.3 00:54.4 00:54.5 00:54.6 00:54.7 00:54.8 |
56 | 00:55.0 00:55.1 00:55.2 00:55.3 00:55.4 00:55.5 00:55.6 00:55.7 00:55.8 |
57 | 00:56.0 00:56.1 00:56.2 00:56.3 00:56.4 00:56.5 00:56.6 00:56.7 00:56.8 |
58 | 00:57.0 00:57.1 00:57.2 00:57.3 00:57.4 00:57.5 00:57.6 00:57.7 00:57.8 |
59 | 00:58.0 00:58.1 00:58.2 00:58.3 00:58.4 00:58.5 00:58.6 00:58.7 00:58.8 |
60 | 00:59.0 00:59.1 00:59.2 00:59.3 00:59.4 00:59.5 00:59.6 00:59.7 00:59.8 |
61 | 00:60.0 00:60.1 00:60.2 00:60.3 00:60.4 00:60.5 00:60.6 00:60.7 00:60.8 |
62 | 00:61.0 00:61.1 00:61.2 00:61.3 00:61.4 00:61.5 00:61.6 00:61.7 00:61.8 |
63 | 00:62.0 00:62.1 00:62.2 00:62.3 00:62.4 00:62.5 00:62.6 00:62.7 00:62.8 |
64 | 00:63.0 00:63.1 00:63.2 00:63.3 00:63.4 00:63.5 00:63.6 00:63.7 00:63.8 |
65 | 00:64.0 00:64.1 00:64.2 00:64.3 00:64.4 00:64.5 00:64.6 00:64.7 00:64.8 |
66 | 00:65.0 00:65.1 00:65.2 00:65.3 00:65.4 00:65.5 00:65.6 00:65.7 00:65.8 |
67 | 00:66.0 00:66.1 00:66.2 00:66.3 00:66.4 00:66.5 00:66.6 00:66.7 00:66.8 |
68 | 00:67.0 00:67.1 00:67.2 00:67.3 00:67.4 00:67.5 00:67.6 00:67.7 00:67.8 |
69 | 00:68.0 00:68.1 00:68.2 00:68.3 00:68.4 00:68.5 00:68.6 00:68.7 00:68.8 |
70 | 00:69.0 00:69.1 00:69.2 00:69.3 00:69.4 00:69.5 00:69.6 00:69.7 00:69.8 |
71 | 01:00.0 01:00.1 01:00.2 01:00.3 01:00.4 01:00.5 01:00.6 01:00.7 01:00.8 |
72 | 01:01.0 01:01.1 01:01.2 01:01.3 01:01.4 01:01.5 01:01.6 01:01.7 01:01.8 |
73 | 01:02.0 01:02.1 01:02.2 01:02.3 01:02.4 01:02.5 01:02.6 01:02.7 01:02.8 |
Ja, ihr habt natürlich recht, habe noch vergessen, bei den 10 tel Sekunden die 8 zu einer 9 zu ändern. Hier im Anhang nochmal der endgültige, funktionierende Code. Jetzt stimmt die Zeit auch, habe es mit einer Uhr verglichen. gruß Philipp
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.