Forum: Mikrocontroller und Digitale Elektronik Timer mit Interupts funktioniert das so??


von MasterG (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

Wieso willst du soviele Timer für eine "simple" Ampel verschwenden?

von MasterG (Gast)


Lesenswert?

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!!!

von crazy horse (Gast)


Lesenswert?

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;

von MasterG (Gast)


Lesenswert?

Flag??

von peter dannegger (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von MasterG (Gast)


Lesenswert?

Danke werde jetzt gleich alles ausprobieren.
Stell den Quelltext gleich rein!!
Bin mal gespannt!
Gruß

von MasterG (Gast)


Angehängte Dateien:

Lesenswert?

So habe ich es ausprobiert!!
Schaut es euch mal an!!!
Bin offen für Verbesserungsvorschläge bzw. Vorschläge das es überhaupt
funktioniert!!

von MasterG (Gast)


Lesenswert?

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

von MasterG (Gast)


Lesenswert?

Der Quelltext bezieht sich auf GPT2 ist ja fast kein Unterschied!!!

von Sascha S. (sascha)


Lesenswert?

Hm,

coole Dokumentation.........

Mfg sascha

von peter dannegger (Gast)


Lesenswert?

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
Grn =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

von peter dannegger (Gast)


Lesenswert?

@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

von Rahul (Gast)


Lesenswert?

Die Kommentare im Programm sind wirklcih aussagekräftig.

von MasterG (Gast)


Lesenswert?

@peter dannegger

das funktioniert so nicht!! Ich arbeite mit keil@Vision!!
Hab noch ne andere Idee stell sie in en paar Tagen rein!!

von peter dannegger (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.