Riadenie križovatky: Rozdiel medzi revíziami
Z SensorWiki
(9 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 4: | Riadok 4: | ||
== Zadanie == | == Zadanie == | ||
− | Cieľom projektu je zostaviť model svetelnej križovatky s dvomi smermi pre motorové vozidlá a jedným priechodom pre chodcov. | + | 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 == | ||
− | + | 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: | + | [[Súbor:semaforluky.jpg|400px|thumb|center| LED semafor]] |
− | + | Schéma zapojenia | |
− | [[Súbor:lukyschema1.png|400px|thumb|center|Schéma zapojenia | + | [[Súbor:lukyschema1.png|400px|thumb|center|Schéma zapojenia LEDiek semafora a tlačidla.]] |
=== Algoritmus a program === | === 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. | |
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> | ||
− | + | #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; | |
− | + | } | |
− | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
− | + | Zdrojový kód: [[Médiá:projektKudlacLuky.zip|zdrojaky.zip]] | |
− | |||
− | Zdrojový kód: [[Médiá: | ||
=== Overenie === | === 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. | |
− | |||
− | [[Súbor: | + | [[Súbor:lukyyy.jpg|400px|thumb|center|Aplikácia.]] |
'''Video:''' | '''Video:''' | ||
− | <center><youtube> | + | <center><youtube>https://youtu.be/Nq93dwdAcpc?si=MjijKgg95Q2sI4aE</youtube></center> |
− | + | ||
− | |||
[[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.
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.
Schéma zapojenia
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.
Video: