Operácie

SOS maják: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
 
Riadok 9: Riadok 9:


'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [https://cs.wikipedia.org/wiki/Morseova_abeceda]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
* [https://ru.wikipedia.org/wiki/%D0%90%D0%B7%D0%B1%D1%83%D0%BA%D0%B0_%D0%9C%D0%BE%D1%80%D0%B7%D0%B5]
 




Riadok 125: Riadok 126:


Funkčnosť som overil vizuálnou kontrolou:
Funkčnosť som overil vizuálnou kontrolou:
Vizuálny test: Po nahratí kódu LED dióda na breadboarde správne cykluje sekvenciu SOS (3x krátky, 3x dlhý, 3x krátky blik).
Blikanie LED diódy (resp. výstupný signál) som nahral a následne spomalil presne 10-krát. Vďaka tomuto spomaleniu sa pôvodný čas 100 ms predĺžil na 1 sekundu a čas 300 ms na 3 sekundy.Následne som dĺžku impulzov meral manuálne pomocou stopiek. Som si vedomý, že pri manuálnom meraní vzniká chyba spôsobená reakčnou dobou človeka . Avšak vzhľadom na to, že meraný čas bol vďaka spomaleniu omnoho dlhší, táto odchýlka bola v celkovom pomere minimálna a úspešne som tak overil, že pomer dĺžky impulzu a pauzy naozaj zodpovedá nastaveniu T a 3T.
Časovanie: Overil som, že pauzy medzi písmenami a dĺžka impulzov zodpovedajú nastaveným časom T a 3T.
Hardvér: Zapojenie s 220om rezistorom je stabilné a LED pracuje bez chýb.
Hardvér: Zapojenie s 220om rezistorom je stabilné a LED pracuje bez chýb.


Riadok 132: Riadok 132:
'''Video:'''
'''Video:'''
<center><youtube>QpGNhgCLjSs</youtube></center>
<center><youtube>QpGNhgCLjSs</youtube></center>
<center><youtube>n4Hu9H41fpA</youtube></center>


== Čo by som urobil inak ==
== Čo by som urobil inak ==

Aktuálna revízia z 13:05, 7. jún 2026

Záverečný projekt predmetu MIPS / LS2026 - Rostyslav Fursov


Zadanie

Cieľom úlohy bolo vytvoriť program v jazyku C pre mikroprocesor ATmega328P, ktorý simuluje optický maják vysielajúci medzinárodný núdzový signál SOS (... --- ...). Program musí bežať v nekonečnej slučke a dodržiavať štandardizované časové intervaly pre Morseovu abecedu.


Literatúra:


Analýza a opis riešenia

Teoretický rozbor (Pravidlá morzeovky)

Základom riešenia je dodržanie medzinárodného štandardu pre Morseovu abecedu. Aby bol signál SOS čitateľný pre kohokoľvek, musí program striktne dodržiavať pomery medzi svetelným impulzom a tichom.

Definoval som základnú časovú jednotku T = 100 ms. Všetky ostatné intervaly sú násobkom tejto jednotky:

• Bodka (dot): trvá presne 1T (100 ms).

• Čiarka (dash): trvá presne 3T (300 ms).

• Medzera medzi prvkami (v rámci jedného písmena): trvá 1T (100 ms).

• Medzera medzi písmenami (S a O): trvá 3T (300 ms).

• Medzera medzi slovami (koniec sekvencie SOS): trvá 7T (700 ms).

Hardvérová konfigurácia

Mikrokontrolér: ATmega328P (16 MHz)

• Svetelný výstup: Modrá LED dióda.

• Prepojenie: Nepájivé kontaktné pole (breadboard), prepojovacie vodiče a USB kábel pre napájanie a sériový prenos.

• Ochranný prvok: Rezistor s odporom 220 omov.

Algoritmus a program

Riadiaci program je implementovaný v jazyku C pre architektúru AVR. Logika programu je postavená na nekonečnej slučke while, ktorá cyklicky vykonáva sekvenciu medzinárodného núdzového signálu SOS. Technické detaily implementácie:

• Konfigurácia portov: Vo funkcii inicializacia() som nastavil pin PB5 ako výstupný pomocou registra smeru dát DDRB. Ostatné piny portu ostali nezmenené.

• Práca s bitmi: Pre manipuláciu s jednotlivými bitmi som použil makrá set_bit a clear_bit. Tento spôsob zabezpečuje bezpečnú zmenu stavu pinu bez ovplyvnenia zvyšku registra PORTB.

• Štruktúra cyklov: Jednotlivé znaky SOS sekvencie som rozdelil do cyklov for. Každý cyklus zodpovedá jednému písmenu, čo zjednodušuje úpravu počtu impulzov.

• Časovanie: Použil som knižnicu <util/delay.h> s konštantou T = 100ms. Výsledné pauzy medzi písmenami 3T a slovami 7T som vyskladal kombináciou základného oneskorenia v cykloch a doplnkových pauz za nimi.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) // Nastaví konkrétny bit na 1 (Log 1)
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) // Vynuluje konkrétny bit na 0 (Log 0)

// Zabudovana dioda pre Arduino Uno)
#define LED_PIN PB5

// Zvolil som základnu časovu jednotku Morseovej abecedy (1T = 100ms)
#define T 100

void inicializacia() {
    // Nastavenie pinu LED_PIN ako výstupného
    set_bit(DDRB, LED_PIN);
}

int main(void) {
    inicializacia();

    while (1) {
        // Písmeno S (. . .) 
        for (int i = 0; i < 3; i++) {
            set_bit(PORTB, LED_PIN);   // LED zapne
            _delay_ms(T);              // Trvanie bodky (1T)
            clear_bit(PORTB, LED_PIN); // LED vypne
            _delay_ms(T);              // Medzera medzi prvkami (1T)
        }
        
        // Medzera medzi písmenami (3T celkovo, 1T už máme z cyklu, pridáme 2T)
        _delay_ms(2 * T); 

        // Písmeno O (_ _ _)
        for (int i = 0; i < 3; i++) {
            set_bit(PORTB, LED_PIN);   // LED zapne
            _delay_ms(3 * T);          // Trvanie čiarky (3T)
            clear_bit(PORTB, LED_PIN); // LED vypne
            _delay_ms(T);              // Medzera medzi prvkami (1T)
        }

        // Medzera medzi písmenami (3T celkovo, 1T už máme z cyklu, pridáme 2T)
        _delay_ms(2 * T);

        // Písmeno S (. . .) 
        for (int i = 0; i < 3; i++) {
            set_bit(PORTB, LED_PIN);   // LED zapne
            _delay_ms(T);              // Trvanie bodky (1T)
            clear_bit(PORTB, LED_PIN); // LED vypne
            _delay_ms(T);              // Medzera medzi prvkami (1T)
        }

        // Medzera medzi SOS sekvenciami (7T celkovo, 1T už máme, pridáme 6T)
        _delay_ms(6 * T); 
    }

    return 0;
}

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: zdrojaky.zip

Overenie

Funkčnosť som overil vizuálnou kontrolou: Blikanie LED diódy (resp. výstupný signál) som nahral a následne spomalil presne 10-krát. Vďaka tomuto spomaleniu sa pôvodný čas 100 ms predĺžil na 1 sekundu a čas 300 ms na 3 sekundy.Následne som dĺžku impulzov meral manuálne pomocou stopiek. Som si vedomý, že pri manuálnom meraní vzniká chyba spôsobená reakčnou dobou človeka . Avšak vzhľadom na to, že meraný čas bol vďaka spomaleniu omnoho dlhší, táto odchýlka bola v celkovom pomere minimálna a úspešne som tak overil, že pomer dĺžky impulzu a pauzy naozaj zodpovedá nastaveniu T a 3T. Hardvér: Zapojenie s 220om rezistorom je stabilné a LED pracuje bez chýb.


Video:


Čo by som urobil inak

Použitie časovačov: Namiesto funkcie _delay_ms, ktorá blokuje procesor, by som využil hardvérové časovače a prerušenia. To by umožnilo mikrokontroléru vykonávať iné úlohy počas čakania na ďalší blik. Nastaviteľná rýchlosť: Pridal by som potenciometer na analógový vstup, ktorým by bolo možné plynule meniť dĺžku základnej časovej jednotky T (rýchlosť vysielania).