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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.