sitemap link mailform link home

Software

Hier nun das komplette Programm für den Pollin-Bausatz "Ampelsteuerung"

Es wurde eine Tag/Nacht-Umschaltung mit einem Kippschalter am Eingang "Taster 1" realisiert.
Der Eingang "Taster 2" wird nur im Nachtbetrieb verwendet.

Im Tagbetrieb werden alle Ampelphasen ohne Unterbrechung kontinuierlich abgearbeitet. Das Überfahren der Induktionsschleifen bewirkt keine Veränderung der Ampelphasen.

Im Nachtbetrieb schaltet die Ampelsteuerung die Autoampeln der Hauptfahrbahn auf "Dauer-Grün" zusammen mit den entsprechenden Fußgänger-Ampeln. Erst bei Betätigung der Taste "Taster 2" am Bedienpult (Fußgänger-Ampel-Anforderung) oder beim Befahren einer oder beider Induktionsschleifen wird die Ampelsteuerung kurzzeitig in den Tagbetrieb versetzt. Das bedeutet, dass die Nebenfahrbahn zusammen mit den entsprechenden Fußgänger-Ampeln eine Grünphase bekommt.

Danach schaltet die Ampelsteuerung wieder in den Nachtbetrieb.

 


 

Programmlisting:

// Software für Pollins "Ampelsteuerung"

#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>

#define TRUE 1
#define FALSE 0
#define ZYKLUSZEIT1 2 // Sekunden - Umschaltphasen GRUEN-GELB usw.
#define ZYKLUSZEIT2 12 // Sekunden - lange Wartezeit - GRUEN/ROT-Phasen
#define ZYKLUSANZAHL_TAG 8 // Tagschaltung
#define GELBBLINKANZAHL 4 // Blinken nach dem Start der Ampel
#define GELBMASKE 0b01001000
#define GELBBLINKZEIT 1 // Sekunde Blinkzeit

#define ZYKLUSZEIT1_MASKE 0b00000001 // zur Prüfung, ob lange oder kurze Wartezeit

// PORTB - 8Bit: AUTO1_ROT,AUTO1_GELB,AUTO1_GRUEN,AUTO2_ROT,AUTO2_GELB,AUTO2_GRUEN,FUSS1_ROT,FUSS1_GRUEN
// Alles auf ROT: 0b10010010
// Alles auf GRUEN: 0b00100101
// Nur GELB: 0b01001000

// PORTD - nicht alle 8 Bit verwendet: FREI, FUSS2_ROT,FUSS2_GRUEN, SCHWEISSLICHT, BLINK1, BLINK2, ZYKLUSZEIT2, ZYKLUSZEIT1
// Fußgängerampel 2 auf ROT:   0b01000000
// Fußgängerampel 2 auf GRUEN: 0b00100000


uint8_t Tag_Flag=TRUE; // Tagbetrieb
uint8_t Zykluszaehler=0; // Zeiger Zyklustabelle

// Die Ampelphasen als Arrays aus 8-Bit-Werten:
uint8_t Zyklustabelle_PortB[ZYKLUSANZAHL_TAG] = {0b01110010, 0b00110001, 0b01110001, 0b01010010, 0b10001110, 0b10000110, 0b10001110, 0b10001010};
uint8_t Zyklustabelle_PortD[ZYKLUSANZAHL_TAG] = {0b01000001, 0b01000010, 0b01000001, 0b01000001, 0b01000001, 0b00100010, 0b00100011, 0b01000001};

//Funktion zum abfragen des Zustands des Tasters1 - Tag-Nacht-Umschaltung
//TRUE = Tag; FALSE = NACHT
int tag_schalter(void)
{
 

    if (PINA & (1<<PINA0))
        {
            return TRUE; // Tag = eingeschaltet
        }
        else
        {
            return FALSE;
        }
   
}

//Funktion zum abfragen des Zustands des Tasters2
// Anforderung durch Fußgänger oder Induktionsschleifen
int anforderungs_schalter(void)
{
 

    if (PINA & (1<<PINA1))
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
   
}

//Funktion für Sekunden-Verzögerung
int delay_sec(int Sekunden)
{
    for (int i=0; i<Sekunden; i++)
    {
        _delay_ms(4000);
    }
    return 0;
}


int main (void) {

    // Initialisierung
    DDRD = 0xFF; // alles Auswgänge
    DDRB = 0xFF; // alles Auswgänge
    DDRA &= ~((1 << DDB0) | (1 << DDB1)); // Pin4 und Pins5 (Taster 1 und 2) als Eingänge setzen
   
    // Am Anfang GELB-Blinken
    for (int i= 0; i<GELBBLINKANZAHL; i++)
        {
        if ((i%2) == 0)
            {
            PORTB = GELBMASKE;
            delay_sec(GELBBLINKZEIT);
            }
            else
            {
            PORTB = 0;
            delay_sec(GELBBLINKZEIT);
            }
        }
       
    // GELB bleibt NUN einige Sekunden an:
        PORTB = GELBMASKE;
        delay_sec(ZYKLUSZEIT1);
       
    // Beginn der Endlosschleife: 
   
    while (1)
        {
        if (Tag_Flag == TRUE)
            {
                PORTD = Zyklustabelle_PortD[Zykluszaehler];
                PORTB = Zyklustabelle_PortB[Zykluszaehler];
               
                if ((Zyklustabelle_PortD[Zykluszaehler] & ZYKLUSZEIT1_MASKE) == TRUE)
                {
                    delay_sec(ZYKLUSZEIT1); // kurze wartezeit - Umschaltphasen GRUEN-GELB usw.
                }
                else
                {
                    delay_sec(ZYKLUSZEIT2); // lange Wartezeit - GRUEN/ROT-Phasen
                }
                Zykluszaehler++;
                if (Zykluszaehler == ZYKLUSANZAHL_TAG)
                {
                    Zykluszaehler = 0;
                }
               
            }
            else
            {
                // Im Nachtbetrieb wird Phase 1 eingefroren:
                PORTD = Zyklustabelle_PortD[1];
                PORTB = Zyklustabelle_PortB[1];
                //delay_sec(ZYKLUSZEIT1);
            }
           
        if ((tag_schalter() == FALSE) && (Tag_Flag == TRUE))
            {
                if (Zykluszaehler == 2)
                {
                    Tag_Flag = FALSE;
                }
               
            }
           
        if ((tag_schalter() == TRUE) && (Tag_Flag == FALSE))
            {
                if (Zykluszaehler == 2)
                {
                    Tag_Flag = TRUE;
                }
               
            }
       
        // Bei Fußgänger-Anforderung oder Anforderung durch Induktionsschleife
        // wird für einen kompletten Ampelzyklus auf Tagbetrieb umgeschaltet
        if (anforderungs_schalter() == TRUE)
            {
                    Tag_Flag = TRUE;   
            }

        }
    return 0;
}

 


 

.

Flaschenverschluss

Letzte Änderung:
March 23. 2023 21:04:40
«    top    »