[C#] Timer durch externe Interrupts

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von mukmuk, 16. Oktober 2009 .

  1. 16. Oktober 2009
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Timer durch externe Interrupts

    hi,

    hab ne Aufgabe für das Fach Digital Microprozessortechnik und um nicht lange drum reden zu müssen habe ich die Aufgabenstellung gescannt

    Bild
    {img-src: http://s4.directupload.net/images/091016/3aab7h3u.jpg}


    Bild
    {img-src: http://s2.directupload.net/images/091016/r6ifjs5w.jpg}







    Hier das was ich bis jez Programmiert habe

    Code:
    
    # pragma noaregs
    # pragma artificial
    # pragma model = large
    # define TRUE 1
    # define FALSE 0 
    # define ENDLOS 1 
     
     
    int sec,frac;
    
    
    void inctimer(void) interrupt TIMER0
    {
    if (frac++==24000)
     {
    sec++;
    frac = 0;
    P4.0 = !P4.0;
    
    } 
    }
    
    void main(void)
    {
    sec = 0;
    TR0 = TRUE;
    ET0 = TRUE;
    TMOD = 2;
    TH0 = 6;
    EA = TRUE;
    
    
    
    
    
     do
     {
    //Haupt Grün
    
    P1.0 = 0;
    P1.1 = 0;
    P1.2 = 1;
    P1.3 = 1;
    P1.4 = 0;
    P1.5 = 0;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; 
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0;
    
    
    
    //Haupt gelb
     
    P1.0 = 0;
    P1.1 = 0;
    P1.2 = 1;
    P1.3 = 0;
    P1.4 = 1;
    P1.5 = 0;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; 
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    
    //Haupt rot
     
    P1.0 = 0;
    P1.1 = 0;
    P1.2 = 1;
    P1.3 = 0;
    P1.4 = 0;
    P1.5 = 1;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; 
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    
     
    //Neben rot/gelb
     
    P1.0 = 0;
    P1.1 = 1;
    P1.2 = 1;
    P1.3 = 0;
    P1.4 = 0;
    P1.5 = 1;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; 
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    
    //Neben grün / Fuß grün
     
    P1.0 = 1;
    P1.1 = 0;
    P1.2 = 0;
    P1.3 = 0;
    P1.4 = 0;
    P1.5 = 1;
    P1.6 = 1;
    P1.7 = 0;
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; //
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    //Neben gelb / Fuß rot
     
    P1.0 = 0;
    P1.1 = 1;
    P1.2 = 0;
    P1.3 = 0;
    P1.4 = 0;
    P1.5 = 1;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; //
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    
     //Neben rot
     
    P1.0 = 0;
    P1.1 = 0;
    P1.2 = 1;
    P1.3 = 0;
    P1.4 = 0;
    P1.5 = 1;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; //
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
    //Haupt rot/gelb
     
    P1.0 = 0;
    P1.1 = 0;
    P1.2 = 1;
    P1.3 = 0;
    P1.4 = 1;
    P1.5 = 1;
    P1.6 = 0;
    P1.7 = 1; 
    
     
    //Lesen
    
    P3.5 = 1;
    P3.4 = 0;
    P3.3 = 1;
    P3.2 = 1; //
    
    //Schreiben
     
    P3.5 = 0;
    P3.4 = 1;
    P3.3 = 0;
    P3.2 = 0; 
    
     
     }while(ENDLOS);
     }
    
    Der Interrupt ist schon drin aber Ich habe echt keine Ahnung wie ich die Timer einbauen soll kann mir vllt jemand helfen? bin schon am verzweifeln

    mfg mukmuk
     
  2. 16. Oktober 2009
    AW: Timer durch externe Interrupts

    Hab sowas noch nie gemacht aber ich versuch mal Hilfestellung zu leisten.

    Die Länge der einzelnen Intervalle ist eine Viellfache von 1/2 also würde ich den Timer 1/2 Sekündig Zählen lassen, so kann man dann später per if-Abfrage besser die Zeit Abfragen.
    Die gessamt länge würde dann nach den Anlagen 19s betragen, da wir nun in 1/2 sekunden zählen heißt das wir bei 38 Halsekunden wieder von vorne Anfangen zu zählen:

    Code:
    int halfsec=0, frac=0; //Mann sollte Variablen immer vor benutzung Initializieren (kp ob man es in deinem Fall nun kann/darf)
    
    void inctimer(void) interrupt TIMER0
    {
     if (frac++==12000)
     {
     halfsec++;
     frac = 0;
     P4.0 = !P4.0;
     if (halfsec==38) // Zeit nach 38/2 = 19 sec wieder zurücksetzen
     {
     halfsec = 0;
     }
     } 
    }
    
    Jetzt kann man bequem die Zeit (halfsec) per If-Abfrage abfragen und so die Ampeldaten steuern (do-Schleife)(pseudo-code):

    Code:
    [COLOR="Green"]//Phase 1/8[/COLOR]
    if ((halfsec >=0) && (halfsec<12)) [COLOR="Green"]// >=0/2sec && <12/2sec [/COLOR]
    {
    [COLOR="Green"] // Neben Straße (grün, gelb, rot) => (0, 0, 1)
     // Hauptstraße (grün, gelb, rot) => (1, 0, 0)
     // Fußgänger (grün, rot) => (0, 1)[/COLOR]
    }
    else 
    [COLOR="Green"]//Phase 2/8[/COLOR]
    if ((halfsec >12) && (halfsec<15)) [COLOR="Green"]// >12/2sec && <15/2sec [/COLOR]
    {
    [COLOR="Green"] // Neben Straße (grün, gelb, rot) => (0, 0, 1)
     // Hauptstraße (grün, gelb, rot) => (0, 1, 0)
     // Fußgänger (grün, rot) => (0, 1)[/COLOR]
    }
    [COLOR="Green"]// usw...[/COLOR]
    
    Hoffe ich konnte dir Helfen.

    Mfg Rushh0ur
     
  3. 16. Oktober 2009
    AW: Timer durch externe Interrupts

    danke du hast mir schon sehr geholfen bw hast du =)

    weißt du vllt auch wie ich das mit dem Signalwechseln an den tastern s1 und s2 realisieren könnte?
     
  4. 16. Oktober 2009
    AW: Timer durch externe Interrupts

    Hmm, ich verstehe nicht ganz den Sinn des Signalwechsel bzw. was damit gemeint ist.

    Und wie man die Interuppts der Schalter abfängt kann ich dir auch nicht wirklich sagen,
    dafür gibts bestimmt auch eine INTERUPT KONSTANTE.

    Ansonsten wenn eine Tasteninteruptfunktion aufgerufen wird in dieser ein bzw. zwei weitere Variable setzen einmal das der Knopf gedrückt wurde und/oder eine weitere mit der Timerzeit um die Reaktionsdifferenz (5s) auszurechnen und nach gegebener Zeit eine Reaktion auszulösen.

    Mfg Rushh0ur
     
  5. 17. Oktober 2009
    AW: Timer durch externe Interrupts

    Je mehr Infos du gibst, desto besser kann man dir helfen. Z.B. was für einen Microcontoller nutzt du? Welche Entwicklungsumgebung, etc, etc.

    Bei Tastern musste z.B. aufpassen, dass du sie entprellst (falls sie es nicht schon hardwaremäßig sind).

    mfg r90
     
  6. 17. Oktober 2009
    AW: Timer durch externe Interrupts

    microcontroller

    80535

    Programmierumgebung hatten wir in der schule iwas mit sys weiß ich leider nicht mehr genau.
    Zuhause benutze ich Visual Studio
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.