Operácie

Riadenie križovatky

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2024 - Lukáš Kudláč


Zadanie

Cieľom projektu je zostaviť model svetelnej križovatky s dvomi smermi pre motorové vozidlá a jedným priechodom pre chodcov na doske ACROB.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Každú LEDku a aj tlačidlo som pripojil na samostatný pin mikroprocesora. Prvý semafor som zapojil do pinov ako výstup nasledovne:PD5 zelená LED, PD3 žltá LED, PD2 červená LED.Druhý semafor som zapojil do pinov ako výstup nasledovne:PC2 zelená LED, PC1 žltá LED, PC0 červená LED. Semafor pre chodcov som zapojil ako dve samostatné LEDky. Červenú ako výstup pinu PC3 a zelenú ako výstup PC4.Tlačidlo je zapojené ako vstup do pinu PB0. Všetky komponenty sú zapojené na zem aby mohol pretekať elektrický prúd.

LED semafor

Schéma zapojenia

Schéma zapojenia LEDiek semafora a tlačidla.


Algoritmus a program

Budeme používať dve ďalšie knižnice a to <avr/interrupt.h> na prerušenia a <util/delay.h> na oneskorenia. Priradíme si každú jednu LED samostatne k jednému pinu. Funkciou volatile hovoríme kompilátoru o neskoršom prerušení v programe pri stlačení tlačidla. Potom sme si incializovali piny na LED ako výstupné a na tlačidlo ako vstupné. Mimo mainu sme si ešte napísali algoritmus nočného režimu pri stlačení tlačidla. V maine na začiatku máme ešte funkcie prerušenia, potom tam je algoritmus pre riadenie križovatky s dvomi trojLED semaformi a jedným dvojLED semaforom.


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

#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))

#define ZELENA PD5
#define ZLTA PD4
#define CERVENA PD2
#define ZELENA2 PC2
#define ZLTA2 PC1
#define CERVENA2 PC0
#define CERVENA3 PC3
#define ZELENA3 PC4
#define SW PB0

volatile uint8_t buttonPressed = 0;

void inicializacia() {
    // Nastavenie LED pinov ako výstupných
    set_bit(DDRD, ZELENA);
    set_bit(DDRD, ZLTA);
    set_bit(DDRD, CERVENA);
    set_bit(DDRC, ZELENA2);
    set_bit(DDRC, ZLTA2);
    set_bit(DDRC, CERVENA2);
    set_bit(DDRC, ZELENA3);
    set_bit(DDRC, CERVENA3);
    // Nastavenie pinu SW ako vstupu s pull-up rezistorom
    set_bit(PORTB, SW);  
}

ISR(PCINT0_vect) {
       while(!(PINB & (1 << PB0))){ 
        clear_bit(PORTD, CERVENA);
        clear_bit(PORTD, ZELENA);
		clear_bit(PORTC, CERVENA2);
        clear_bit(PORTC, ZELENA2);
         clear_bit(PORTC, CERVENA3);
        clear_bit(PORTC, ZELENA3);
		set_bit(PORTD, ZLTA);
        set_bit(PORTC, ZLTA2);
        _delay_ms(1000);
        clear_bit(PORTD, ZLTA);
        clear_bit(PORTC, ZLTA2);
        _delay_ms(1000);
}
}
int main() {
    inicializacia();
     PCMSK0 |= (1<<PCINT0);
     PCICR |= (1<<PCIE0);
     sei();   
 
        while(1) {
            set_bit(PORTD, ZELENA);
            set_bit(PORTC, CERVENA2);
             set_bit(PORTC, CERVENA3);
            _delay_ms(3500);
            set_bit(PORTD, ZLTA);
            clear_bit(PORTD, ZELENA);
            _delay_ms(1000);
            set_bit(PORTC, ZLTA2);
            set_bit(PORTD, CERVENA);
            clear_bit(PORTD, ZLTA);
            _delay_ms(1000);
             set_bit(PORTC, ZELENA3);
            clear_bit(PORTC, CERVENA3);
            set_bit(PORTC, ZELENA2);
            clear_bit(PORTC, CERVENA2);
            clear_bit(PORTC, ZLTA2);
            _delay_ms(3500);
             set_bit(PORTC, CERVENA3);
            clear_bit(PORTC, ZELENA3);
            set_bit(PORTC, ZLTA2);
            clear_bit(PORTC, ZELENA2);
            _delay_ms(1000);
            set_bit(PORTD, ZLTA);
            set_bit(PORTC, CERVENA2);
            clear_bit(PORTC, ZLTA2);
            _delay_ms(1000);
            set_bit(PORTD, ZELENA);
            clear_bit(PORTD, CERVENA);
            clear_bit(PORTD, ZLTA);
        
    }

    return 0;
}

Zdrojový kód: zdrojaky.zip


Overenie

Po spustení, na základe vizuálneho pozorovania program funguje ako sme očakávali. Po stlačení tlačidla sa spustí nočný režim pri ktorom blikajú súčasne obe žlté LEDky.

Aplikácia.

Video: