Timer mit Interupts funktioniert das so??

Gast #311469
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
Gast #311471
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!!!
Gast #311472
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;
Gast #311474
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
#311475
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.
Gast #311478
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
Gast #311481
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
Gast #311485
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren