SOS maják: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
| (6 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 6: | Riadok 6: | ||
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. | ||
'''Literatúra:''' | '''Literatúra:''' | ||
| Riadok 21: | Riadok 21: | ||
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. | 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 = | 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). | • Bodka (dot): trvá presne 1T (100 ms). | ||
• Čiarka (dash): trvá presne 3T ( | • Č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 === | === Hardvérová konfigurácia === | ||
Mikrokontrolér: ATmega328P (16 MHz) | 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 === | === 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. | |||
<tabs> | <tabs> | ||
| Riadok 122: | Riadok 120: | ||
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'': | 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á: | Zdrojový kód: [[Médiá:MIPS_Projekt_Rostyslav_Fursov.zip | zdrojaky.zip]] | ||
=== Overenie === | === Overenie === | ||
Funkčnosť | 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). | |||
Č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. | |||
'''Video:''' | '''Video:''' | ||
<center><youtube> | <center><youtube>QpGNhgCLjSs</youtube></center> | ||
== Čo by som urobil inak == | == Č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). | |||
Aktuálna revízia z 16:21, 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 = 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: 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). Č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.
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).
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.