Operácie

SOS maják: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Balogh (diskusia | príspevky)
 
(27 medziľahlých úprav od jedného ďalšieho 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.


[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 


'''Literatúra:'''  
'''Literatúra:'''  
Riadok 17: Riadok 17:
== Analýza  a opis riešenia ==
== Analýza  a opis riešenia ==


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
=== Teoretický rozbor (Pravidlá morzeovky) ===
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.  
 
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:


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
• Bodka (dot): trvá presne 1T (100 ms).


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
• Čiarka (dash): trvá presne 3T (300 ms).


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
• 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 ===
=== Algoritmus a program ===


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...  
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.
Výpis kódu je nižšie...
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>
<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>


// Definícia LED na porte B, pin 5
#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


int main(void)
// Zvolil som základnu časovu jednotku Morseovej abecedy (1T = 100ms)
{
#define T 100
    // Nastavenie pinu PB5 ako výstup
    DDRB |= (1 << LED_PIN);


     while (1)  
void inicializacia() {
    {
    // Nastavenie pinu LED_PIN ako výstupného
         // Písmeno S (3 krát krátky impulz)
    set_bit(DDRB, LED_PIN);
}
 
int main(void) {
    inicializacia();
 
     while (1) {
         // Písmeno S (. . .)  
         for (int i = 0; i < 3; i++) {
         for (int i = 0; i < 3; i++) {
             PORTB |= (1 << LED_PIN);  // LED zapne
             set_bit(PORTB, LED_PIN);  // LED zapne
             _delay_ms(200);           // oneskorenie
             _delay_ms(T);             // Trvanie bodky (1T)
             PORTB &= ~(1 << LED_PIN); // LED vypne
             clear_bit(PORTB, LED_PIN); // LED vypne
             _delay_ms(200);
             _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);


        _delay_ms(400); // Pauza medzi písmenami (píšem 400 ms, pretože 200 ms už máme z predchádzajúceho cyklu)
         // Písmeno O (_ _ _)
 
         // Písmeno O (3 krát dlhý impulz)  
         for (int i = 0; i < 3; i++) {
         for (int i = 0; i < 3; i++) {
             PORTB |= (1 << LED_PIN);  // LED zapne
             set_bit(PORTB, LED_PIN);  // LED zapne
             _delay_ms(600);           // 3 * T
             _delay_ms(3 * T);         // Trvanie čiarky (3T)
             PORTB &= ~(1 << LED_PIN); // LED vypne
             clear_bit(PORTB, LED_PIN); // LED vypne
             _delay_ms(200);
             _delay_ms(T);             // Medzera medzi prvkami (1T)
         }
         }


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


         // Písmeno S (3 krát krátky impulz)  
         // Písmeno S (. . .)  
         for (int i = 0; i < 3; i++) {
         for (int i = 0; i < 3; i++) {
             PORTB |= (1 << LED_PIN);  // LED zapne
             set_bit(PORTB, LED_PIN);  // LED zapne
             _delay_ms(200);           // oneskorenie
             _delay_ms(T);             // Trvanie bodky (1T)
             PORTB &= ~(1 << LED_PIN); // LED vypne
             clear_bit(PORTB, LED_PIN); // LED vypne
             _delay_ms(200);
             _delay_ms(T);             // Medzera medzi prvkami (1T)
         }
         }


         _delay_ms(1200);    // Pauza medzi SOS sekvenciami (píšem 1200 ms, pretože 200 ms už máme z predchádzajúceho cyklu)
         // Medzera medzi SOS sekvenciami (7T celkovo, 1T už máme, pridáme 6T)
 
        _delay_ms(6 * T);
     }
     }


     return 0;
     return 0;
}
}
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
void adc_init(void);                                  // A/D converter initialization
unsigned int adc_read(char a_pin);
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
</tabs>
</tabs>
Riadok 97: 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á:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zdrojový kód: [[Médiá:MIPS_Projekt_Rostyslav_Fursov.zip | zdrojaky.zip]]


=== Overenie ===
=== Overenie ===


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.  
Funkčnosť som overil vizuálnou kontrolou:
Na konci uvádzame fotku hotového zariadenia.  
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.


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]


'''Video:'''
'''Video:'''
<center><youtube>D0UnqGm_miA</youtube></center>
<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).


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.


[[Category:AVR]] [[Category:MIPS]]
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 11:15, 24. 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).