Hiho, ich brauch einen Framebegrenzer für ein Pacman mit dem Atmega8. Also ich dachte mir sowas mach man sicher mit nem Timer oder nem Counter oder sowas. Aber wie kann man diesen unter WinAvr (also mit der Sprache "C") nutzen? Und wieviel Zeit darf denn dann so nen Frame haben? Ich glaube 40ms oder?
Gast
#779944
Die Dauer eines Frames hängt von der Bildwiederholrate ab. Aber was meinst Du mit einem Framebegrenzer?
Der sorgt dafür, dass nur 25 Bilder pro Sekunde gemalt werden. In meinem Fall ist das egal, aber es sollen halt auch die Berechnungen begrenzt werden. Also z.B. soll Pacman nur 25 mal pro Sekunde seine Position aktualisieren. Es soll eine Schleife da sein, die nur alle 40ms einmal durchläuft oder auch anders, da gibt es ja mehrere Möglichkeiten. Mich interessiert halt wie man die Timer nutzt oder ob das anders besser zu machen ist.
Keiner eine Idee?
Timerinterrupt: 25Hz In diesem eine Variable auf 1 setzen, und irgendwo im Spielablauf dann die Abfrage: while (!wait40ms); wait40ms=0;
:) danke so in etwa hatte ich mir das auch gedacht, aber mein Problem ist eher wie man das auf nem Atmega8 in "C" Programmiert. Also wie man den Timer einstellt und aktiviert.
Daniel Kehr wrote: > :) danke so in etwa hatte ich mir das auch gedacht, aber mein Problem > ist eher wie man das auf nem Atmega8 in "C" Programmiert. Also wie man > den Timer einstellt und aktiviert. Sei mir nicht böse, aber ist dein Problem WIRKLICH das, dass du nicht weist, wie man in C den Timer etc. konfigurierst, oder ist es eher, dass du garnicht weist, wie man den Timer etc. konfiguriert?
Hmm, wo ist da der Unterschied? Ich programmier den Controller nunmal in C und da weis ich nicht wie das geht. Wie es in einer anderen Programmiersprache geht weis ich dementsprechend auch nicht.
>Hmm, wo ist da der Unterschied?
Ich könnte dir das z.B. nur in ASM und anhand des Datenblattes erklären
- C müsste ich mir zusammenkratzen.
Naja, Assembler ist doch auch schonmal was. Ich denke ich werd es schon halbwegs übersetzen können.
Schau dir das mal an: AVR-Tutorial: Timer Fehlt dir da noch was für die Umsetzung?
Gast
#780735
Wie jetz? Pacman für nen AVR gestrickt aber keine Ahnung von C? Datenblatt, AVR-Tutorials hier in der Artikelsammlung und ein Hauch Eigeninitiative. Mehr brauchts nicht.
Daniel Kehr wrote: > Hmm, wo ist da der Unterschied? Ich programmier den Controller nunmal in > C und da weis ich nicht wie das geht. Timer gehören nicht zum C-Sprachumfang und daher gibt es auch keine Timerfunktionen in C. Du hast auf dem AVR auch kein OS, welches Dir Systemcalls zur Verfügung stellt. Timer sind als Hardware im AVR ausgeführt, d.h. um sie anzusprechen, mußt Du das Datenblatt lesen und dann auf die entsprechenden IO-Register zugreifen. Peter
@Karl: Welchen Sinn hatte der Beitrag. Es gibt sicher auch SpamForen für solch nutzlose Beiträge. @Kai: Danke. Ich werde es mir mal anschauen. @Peter: Danke, dann brauch ich ja danach nichtmehr zu suchen. Gibt es denn keine INCLUDE-Datei für die Timer? Nagut, trotzdem danke.
Daniel Kehr wrote: > @Karl: Welchen Sinn hatte der Beitrag. Es gibt sicher auch SpamForen für > solch nutzlose Beiträge. Jaja, sei mal lieber nicht so frech ;) > Gibt es denn keine INCLUDE-Datei für die Timer? Nagut, trotzdem danke. Nein, das braucht es auch nicht. Wofür sollte es denn Funktionen/Datentypen/Macros/whatever für den Timer geben?
Warum fällt mir dazu immer der blöde Witz aus den 1950er Jahren ein: Mutter: "Fritzchen, was wünscht Du Dir zu Weihnachten?" Fritzchen: "OB!" ... Mutter: "Ja, warum das denn?" Fritzchen: "Weil man damit schwimmen und Schlittschuh laufen und Fahrrad fahren kann!" Q: "Warum willst Du C programmieren?" A: "Weil man damit PACMAN, Windows, Linux machen kann!" kopfschüttelnd Bernhard
:) Hätte ja sein können. Hab das mal grob überflogen, kann man denn den Vorteiler beliebig wählen oder muss der 1,8,64,256 oder 1024 sein?
Gast
#780771
Hallo, was ist eigentlich das Ziel? Hast du auf einem AVR Pacman programmiert? Oder willst du ein externes Gerät begrenzen? Sorry für die dumme Frage. Steffen.
Gast
#780773
Der Beitrag von Kai Giebeler war noch nicht da, als ich meinen geschrieben habe. Der Sinn des Beitrags: Die immer wieder auftauchende Frage nach Timer und Co. auf das Tutorial lenken, falls du das noch nicht kanntest. Dazu die Aufforderung, dir das Datenblatt durchzulesen. Da steht beinahe alles drin, was du wissen musst. Der Wink mit der Eigeninitiative sollte wohl die Frage verhindern, welchen wert du nun in welches Register zu welchem Zeitpunkt schreiben musst.
Gast
#780774
>Hab das mal grob überflogen, kann man denn den Vorteiler beliebig wählen >oder muss der 1,8,64,256 oder 1024 sein? Da ist es schon. Datenblatt!
@Bernhard Reichenbach: Also ein eigenes kleines Betriebssystem hab ich schon programmiert. Das ist ja nicht so extrem schwer. Warum programmierst du denn C? @Steffen: Naja, ich hab hier nen Display und den Mega8 verbunden und möchte ganz einfach wie bei jedem Spiel, welches ich bisher auf dem Rechner programmiert habe auch hier eine Framebremse.
Gast
#780897
Ein Betriebssystem programmiert ohne den Haus einer Ahnung wie man
Hardware (Timer) anspricht. Das muss ein tolles System sein, oder
meintest du "while(1){}" mit Betriebssystem ??
Mal Spass beiseite, wie willst du jemals auf dem Display was sehen
können wenn du nicht mal die Hardware ansprechen kannst ? Alleine die
Frage nach dem beliebigen Vorteiler disqualifiziert dich hier....
Leute gibt's (kopfschüttel....)
@Daniel Kehr: Hic Rhodos, hic salta! Bitte den Source-Code vom Betriebssystem! Und "Warum" fragen Kindergarten-Kinder.
Sorry, das ist der einzige Code den ich noch finden konnte, da ist allerdings einiges nicht von mir(alles was hinter dem Code noch kommentiert ist ist nicht von mir :) ). Es handelt sich dabei um die Interupt Routine 21. Ich weis nicht wo die Endversion hin ist, sorry. Bootloader und Kernel hab ich natürlich auch noch. So, hier:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
Des weiteren hab ich die komplette Ausgabe auf dem Display schon, ich will ganz einfach nur die Häufigkeit der Berechnungen begrenzen.
Gast
#781043
>ganz einfach nur die Häufigkeit der Berechnungen begrenzen.
Dann verwende das Zeitschlitzverfahren!
(Codeauzugaus einem meiner Projekte)1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
So arbeiten auch SPS'en.. Die verschiedenen Tasks werden einfach alle x Millisekunden aufgerufen..
Sorry, aber das hätte ich hinbekommen, zwar hätte ich es ein bissle anders gemacht, aber es kommt aufs gleiche raus. Was mir fehlt ist nur der Teil, der sich hinter init_timebase (); verbirgt. Bei mir ist es halt der Timer0 und nicht der Timer1, aber ich nehm auch gerne den Timer1, hab ich nichts dagegen. Bei mir sieht das gerade so aus. Aber das funktioniert nicht so recht.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Gast
#781290
sorry, hatte ich vergessen reinzukopieren:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Danke, aber er macht trotzdem nicht was er soll. Ich hab CS10 auf 1 gesetzt und lass immer eine Variable bis 240 Zählen und dann wird ein Ereignis aus ausgelöst. Mein Mega8 läuft auf 16 MHz. Somit sollte doch eigentlich rund jede Sekunde einmal dieses Ereignis ausgelöst werden, oder?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.