Operácie

Riadenie križovatky: Rozdiel medzi revíziami

Z SensorWiki

 
(10 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 4: Riadok 4:
 
== Zadanie ==
 
== Zadanie ==
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
Cieľom projektu je zostaviť model svetelnej križovatky s dvomi smermi pre motorové vozidlá a jedným priechodom pre chodcov na doske ACROB.
  
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
Riadok 19: Riadok 19:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
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.
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
[[Súbor:semaforluky.jpg|400px|thumb|center| LED semafor]]
  
Nezabudnite doplniť schému zapojenia!
+
Schéma zapojenia
  
[[Súbor:lukyschema1.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[Súbor:lukyschema1.png|400px|thumb|center|Schéma zapojenia LEDiek semafora a tlačidla.]]
  
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
  
Algoritmus programu je....
+
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.
  
  
Riadok 36: Riadok 36:
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
#include <util/delay.h>
  
int main(void)
+
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
{
+
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
  unsigned int measuredValue;
 
  
  while (1)
+
#define ZELENA PD5
  {
+
#define ZLTA PD4
    /*  relax  */ 
+
#define CERVENA PD2
  }
+
#define ZELENA2 PC2
 +
#define ZLTA2 PC1
 +
#define CERVENA2 PC0
 +
#define CERVENA3 PC3
 +
#define ZELENA3 PC4
 +
#define SW PB0
  
  return(0);
+
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);
 
}
 
}
  
</source></tab>
+
ISR(PCINT0_vect) {
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
      while(!(PINB & (1 << PB0))){
#include <avr/io.h>
+
        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);
 +
       
 +
    }
  
void adc_init(void);                                   // A/D converter initialization
+
    return 0;
 
+
}
unsigned int adc_read(char a_pin);
 
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
Zdrojový kód: [[Médiá:projektKudlacLuky.zip|zdrojaky.zip]]
 
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
  
 
=== Overenie ===
 
=== Overenie ===
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.  
+
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.  
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.  
 
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
[[Súbor:lukyyy.jpg|400px|thumb|center|Aplikácia.]]
  
 
'''Video:'''
 
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
+
<center><youtube>https://youtu.be/Nq93dwdAcpc?si=MjijKgg95Q2sI4aE</youtube></center>
 
+
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 08:56, 6. máj 2024

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: