Bin zurzeit an einem Projekt beschäftigt in dem ich eine Ampelkreuzung mit einem µController C167 steuern soll. Soweit so gut, es funktioniert auch alles nur die Timer nicht, sprich ich will die Phasen zwischen Rot Gelb und Grün mit einer gewissen Zeit wählen. Ich habe auch alles ausgerechnet( T3CON , T2CON Reloadwert usw) Nur es funktioniert nicht... Ich möchte wenn T2 voll ist soll eine LED angehen sprich ich habe einen Interupt. Jetzt möchte ich wissen ob das überhaupt geht das ich T2 überlaufen lass und der dann automatisch T3 hochzählt bis zu einem gewissen Stand und dann soll ein Interupt ausgelöst werden... Ich werde morgen den Quelltext reinstellen denn ich gemacht habe und der nicht funktioniert!! Danke
Wieso willst du soviele Timer für eine "simple" Ampel verschwenden?
Ich will eine Phase von Rot =20 Sek Rot/Gelb =5 Sek Grün =20Sek Gelb =5 Sek Rot =20Sek usw!! Der Timer 3 von der GPT1 kann ja nur wenn er einmal Überlauft nur 3,36 sekunden gehen! Also muss der Timer maximal 7 überlaufen oder nicht?? Kann ich das auch anders machen, ich denke nicht! Da es keine anderen Prescalar faktoren gibt!!!
das macht man doch ganz anders. Programmier dir einen Timer, der sagen wir mal jede Sekunde einen Int auslöst. In der ISR zählst du eine globale Variable hoch, in deinem Fall reichen 8bit. Dazu ein Flag setzen, dass ein neuer Zählerwert vorliegt. Und dann das Hauptprogramm: Flag gesetzt? if Timer<20 rot else if <25 rot_gelb else if <45 grün else if < 50 gelb else timer=0;
Eine ideale Aufgabe für einen Scheduler: http://www.mikrocontroller.net/attachment.php/313478/flasher.zip Aber halte dem 16-Bitter die Hand vorm Mund, der ist nämlich ständig nur am Gähnen bei so einer kleinen Aufgabe :-) "Ich habe auch alles ausgerechnet" Ich rechne nie was aus. Dazu ist doch der Präprozessor da, der soll gefälligst alle Konstanten selber ausrechnen. Von mir gibts nur die Formel und die Quarzfrequenz definiert. Peter
> Flag??
Einfach eine globale Variable.
Flag wie 'Flagge'. Kommt noch aus der Zeit als berittene
Boten unterwegs waren und auf jedem bessern Berg (oder
Turm) ein Mann mit Flaggen postiert wurde, sodass eine Nachricht
ueber Flaggensignale recht schnell von Berg tu Berg
witergeleitet wurden.
Ein Flag zeigt einfach nur an, dass eine Bedingung eingetreten
ist oder eben nicht. Iregendwo im Code wird das Flag gesetzt
(zb von 0 auf 1) und irgend ein anderer Code ueberprueft
dann irgendwann ob der erwartete Zustand (eben eine 1) schon
eingetreten ist, oder eben nicht.
Danke werde jetzt gleich alles ausprobieren. Stell den Quelltext gleich rein!! Bin mal gespannt! Gruß
So habe ich es ausprobiert!! Schaut es euch mal an!!! Bin offen für Verbesserungsvorschläge bzw. Vorschläge das es überhaupt funktioniert!!
Habe was vergessen!!! Der Quelltext funktioniert schon aber nur mit der Simulatuion sprich wenn ich das ganze am µController ausgeben will dann ist mein TCON völlig anders und mein RUN Bit gesetzt obwohl ich das nicht gemacht habe
Der Quelltext bezieht sich auf GPT2 ist ja fast kein Unterschied!!!
Mit dem Scheduler könnte das so aussehen:
1 | #include "main.h" |
2 | #include "schedule.h" |
3 | |
4 | |
5 | void LED_red_on( void ) |
6 | {
|
7 | LED_PORT &= ~(1<<LED0); |
8 | }
|
9 | |
10 | void LED_red_off( void ) |
11 | {
|
12 | LED_PORT |= (1<<LED0); |
13 | }
|
14 | |
15 | void LED_yellow_on( void ) |
16 | {
|
17 | LED_PORT &= ~(1<<LED1); |
18 | }
|
19 | |
20 | void LED_yellow_off( void ) |
21 | {
|
22 | LED_PORT |= (1<<LED1); |
23 | }
|
24 | |
25 | void LED_green_on( void ) |
26 | {
|
27 | LED_PORT &= ~(1<<LED2); |
28 | }
|
29 | |
30 | void LED_green_off( void ) |
31 | {
|
32 | LED_PORT |= (1<<LED2); |
33 | }
|
34 | |
35 | |
36 | /*
|
37 | Rot =20 Sek
|
38 | Rot/Gelb =5 Sek
|
39 | Grn =20Sek
|
40 | Gelb =5 Sek
|
41 | Rot =20Sek usw!!
|
42 | */
|
43 | |
44 | void traffic_light( void ) |
45 | {
|
46 | LED_yellow_off(); |
47 | LED_red_on(); |
48 | timeradd( LED_yellow_on, SECONDS( 20 )); |
49 | timeradd( LED_red_off, SECONDS( 20 + 5 )); |
50 | timeradd( LED_yellow_off, SECONDS( 20 + 5 )); |
51 | timeradd( LED_green_on, SECONDS( 20 + 5 )); |
52 | timeradd( LED_green_off, SECONDS( 20 + 5 + 20 )); |
53 | timeradd( LED_yellow_on, SECONDS( 20 + 5 + 20 )); |
54 | timeradd( traffic_light, SECONDS( 20 + 5 + 20 + 5 )); // and repeat |
55 | }
|
56 | |
57 | |
58 | int main(void) |
59 | {
|
60 | TCCR0 = 1<<CS01^1<<CS00; // divide by 64 * 256 |
61 | |
62 | LED_DDR = 0xFF; |
63 | LED_PORT = 0xFF; |
64 | |
65 | timerinit(); |
66 | traffic_light(); |
67 | |
68 | for(;;){ // main loop |
69 | if( TIFR & 1<<TOV0 ){ |
70 | TIFR = 1<<TOV0; |
71 | timertick(); |
72 | }
|
73 | }
|
74 | }
|
Ich glaub, das ist auch selbst kommentierend. Man könnte noch die Aktionen bei gleichen Zeiten zusammenfassen, aber so ist es übersichtlicher. Peter
@Sascha "coole Dokumentation........." Und ich dachte schon, ich bin zu blöd dazu. Von der Lesbarkeit her ist ein Hex-File auch nicht schlimmer. Peter
Die Kommentare im Programm sind wirklcih aussagekräftig.
@peter dannegger das funktioniert so nicht!! Ich arbeite mit keil@Vision!! Hab noch ne andere Idee stell sie in en paar Tagen rein!!
@MasterG, Warum soll das nicht funktinieren, ist ja schießlich C. Man muß natürlich die Timer- und Portzugriffe entsprechend anpassen und das richtige Includefile nehmen. Den Scheduler habe ich original aufm 8051 entwickelt und eingesetzt. Peter
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.