www.mikrocontroller.net

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


Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso willst du soviele Timer für eine "simple" Ampel verschwenden?

Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flag??

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine ideale Aufgabe für einen Scheduler:

http://www.mikrocontroller.net/attachment.php/3134...


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MasterG (Gast)
Datum:

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

Autor: MasterG (Gast)
Datum:
Angehängte Dateien:

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

Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Quelltext bezieht sich auf GPT2 ist ja fast kein Unterschied!!!

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,

coole Dokumentation.........

Mfg sascha

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem Scheduler könnte das so aussehen:
#include "main.h"
#include "schedule.h"


void LED_red_on( void )
{
  LED_PORT &= ~(1<<LED0);
}

void LED_red_off( void )
{
  LED_PORT |= (1<<LED0);
}

void LED_yellow_on( void )
{
  LED_PORT &= ~(1<<LED1);
}

void LED_yellow_off( void )
{
  LED_PORT |= (1<<LED1);
}

void LED_green_on( void )
{
  LED_PORT &= ~(1<<LED2);
}

void LED_green_off( void )
{
  LED_PORT |= (1<<LED2);
}


/*
Rot =20 Sek
Rot/Gelb =5 Sek
Grn =20Sek
Gelb =5 Sek
Rot =20Sek usw!!
*/

void traffic_light( void )
{
  LED_yellow_off();
  LED_red_on();
  timeradd( LED_yellow_on,  SECONDS( 20 ));
  timeradd( LED_red_off,    SECONDS( 20 + 5 ));
  timeradd( LED_yellow_off, SECONDS( 20 + 5 ));
  timeradd( LED_green_on,   SECONDS( 20 + 5 ));
  timeradd( LED_green_off,  SECONDS( 20 + 5 + 20 ));
  timeradd( LED_yellow_on,  SECONDS( 20 + 5 + 20 ));
  timeradd( traffic_light,  SECONDS( 20 + 5 + 20 + 5 )); // and repeat
}


int main(void)
{
  TCCR0 = 1<<CS01^1<<CS00;      // divide by 64 * 256

  LED_DDR = 0xFF;
  LED_PORT = 0xFF;

  timerinit();
  traffic_light();

  for(;;){          // main loop
    if( TIFR & 1<<TOV0 ){
      TIFR = 1<<TOV0;
      timertick();
    }
  }
}


Ich glaub, das ist auch selbst kommentierend.

Man könnte noch die Aktionen bei gleichen Zeiten zusammenfassen, aber
so ist es übersichtlicher.


Peter

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Kommentare im Programm sind wirklcih aussagekräftig.

Autor: MasterG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peter dannegger

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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.