Operácie

SOS maják

Zo stránky SensorWiki

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.

Vývojová doska ACROB.

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 = 200 ms. Všetky ostatné intervaly sú násobkom tejto jednotky:

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

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

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

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

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

Technický prístup

• Pre komunikáciu s PC som implementoval UART rozhranie s rýchlosťou 9600 baud.

• Riadenie portov: Využívam register smeru dát DDRB a výstupný register PORTB. Nastavenie pinu PB5 na logickú jednotku aktivuje vstavanú LED diódu.

• Bitová manipulácia: Namiesto prepisovania celého registra používam bitové masky (|= a &= ~). To zaručuje, že ovplyvňujem iba pin LED diódy a ostatné piny procesora zostávajú nezmenené.

• Časovanie: Na generovanie presných páuz využívam funkciu _delay_ms() z knižnice <util/delay.h>. Frekvencia procesora je definovaná na 16 MHz (F_CPU), čo zabezpečuje, že reálny čas zodpovedá vypočítaným intervalom.

Hardvérová konfigurácia

Mikrokontrolér: ATmega328P (16 MHz)

• Výstup: Vstavaná LED dióda na porte PB5 (digitálny pin 13).

• Komunikačné rozhranie: UART (Universal Asynchronous Receiver-Transmitter).

• Prepojenie: USB kábel.

Algoritmus a program

Algoritmus programu pracuje v nekonečnej slučke (while(1)), ktorá postupne volá sekvencie pre jednotlivé písmená "S" a "O". Hlavná logika spočíva v ovládaní LED diódy a odosielaní dát cez UART.

<tabs> <tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;">

  1. define F_CPU 16000000UL
  2. include <avr/io.h>
  3. include <util/delay.h>

// Макросы для работы с битами (как в твоем примере)

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

// Zabudovana dioda pre Arduino Uno)

  1. define LED_PIN PB5

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

  1. 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ť systému som overil kombináciou vizuálnej kontroly a digitálnej diagnostiky cez sériovú linku.

Metodika overovania:

Fyzická kontrola: Po nahratí programu do mikrokontroléra som sledoval vstavanú LED diódu na pine PB5. Potvrdil som, že sekvencia troch krátkych bliknutí, troch dlhých bliknutí a následnej pauzy presne zodpovedá medzinárodnému štandardu SOS.

Sériová diagnostika: Zariadenie som ponechal pripojené k PC cez USB kábel. Pomocou terminálového programu PuTTY nastaveného na rýchlosť 9600 baud som sledoval textový výstup.

Výsledok testu: Pri každom zapnutí LED na krátky čas sa v termináli objavila bodka, pri dlhom bliknutí čiarka.

Aplikácia.

Video:


Čo by som urobil inak

Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.