SOS maják: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
| Riadok 4: | Riadok 4: | ||
== Zadanie == | == 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 | 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. | ||
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | ||
| Riadok 23: | Riadok 23: | ||
Definoval som základnú časovú jednotku T = 200 ms. Všetky ostatné intervaly sú násobkom tejto jednotky: | Definoval som základnú časovú jednotku T = 200 ms. Všetky ostatné intervaly sú násobkom tejto jednotky: | ||
• Bodka (dot): trvá presne 1T ( | • Bodka (dot): trvá presne 1T (100 ms). | ||
• Čiarka (dash): trvá presne 3T (600 ms). | • Čiarka (dash): trvá presne 3T (600 ms). | ||
| Riadok 60: | Riadok 60: | ||
<tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;"> | ||
#define F_CPU 16000000UL | #define F_CPU 16000000UL | ||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.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 | #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) | while (1) { | ||
// Písmeno S (. . .) | |||
// Písmeno S ( | |||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
set_bit(PORTB, LED_PIN); // LED zapne | |||
_delay_ms(T); // Trvanie bodky (1T) | |||
_delay_ms( | clear_bit(PORTB, LED_PIN); // LED vypne | ||
PORTB | _delay_ms(T); // Medzera medzi prvkami (1T) | ||
_delay_ms( | |||
} | } | ||
// Medzera medzi písmenami (3T celkovo, 1T už máme z cyklu, pridáme 2T) | |||
_delay_ms(2 * T); | |||
// Písmeno O (_ _ _) | |||
// Písmeno O ( | |||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
set_bit(PORTB, LED_PIN); // LED zapne | |||
_delay_ms(3 * T); // Trvanie čiarky (3T) | |||
_delay_ms( | clear_bit(PORTB, LED_PIN); // LED vypne | ||
PORTB | _delay_ms(T); // Medzera medzi prvkami (1T) | ||
_delay_ms( | |||
} | } | ||
// Medzera medzi písmenami (3T celkovo, 1T už máme z cyklu, pridáme 2T) | |||
_delay_ms( | _delay_ms(2 * T); | ||
// Písmeno S ( | // Písmeno S (. . .) | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
set_bit(PORTB, LED_PIN); // LED zapne | |||
_delay_ms(T); // Trvanie bodky (1T) | |||
_delay_ms( | clear_bit(PORTB, LED_PIN); // LED vypne | ||
PORTB | _delay_ms(T); // Medzera medzi prvkami (1T) | ||
_delay_ms( | |||
} | } | ||
// Medzera medzi SOS sekvenciami (7T celkovo, 1T už máme, pridáme 6T) | |||
_delay_ms(6 * T); | |||
} | } | ||
return 0; | return 0; | ||
} | } | ||
Verzia z 14:34, 2. máj 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 = 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;">
- 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ť 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.

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.