Operácie

SOS maják

Zo stránky SensorWiki

Verzia z 11:21, 29. apríl 2026, ktorú vytvoril StudentMIPS (diskusia | príspevky)

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 (200 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

• 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.

Algoritmus a program

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


#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

// Definícia LED na porte B, pin 5 
#define LED_PIN PB5

int main(void)
{
    // Nastavenie pinu PB5 ako výstup 
    DDRB |= (1 << LED_PIN);

    while (1) 
    {
        // Písmeno S (3 krát krátky impulz)
        for (int i = 0; i < 3; i++) {
            PORTB |= (1 << LED_PIN);   // LED zapne
            _delay_ms(200);            // oneskorenie
            PORTB &= ~(1 << LED_PIN);  // LED vypne
            _delay_ms(200);
        }

        _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 (3 krát dlhý impulz) 
        for (int i = 0; i < 3; i++) {
            PORTB |= (1 << LED_PIN);   // LED zapne
            _delay_ms(600);            // 3 * T
            PORTB &= ~(1 << LED_PIN);  // LED vypne
            _delay_ms(200);
        }

        _delay_ms(400); // Pauza medzi písmenami

        // Písmeno S (3 krát krátky impulz) 
        for (int i = 0; i < 3; i++) {
            PORTB |= (1 << LED_PIN);   // LED zapne
            _delay_ms(200);            // oneskorenie
            PORTB &= ~(1 << LED_PIN);  // LED vypne
            _delay_ms(200);
        }

        _delay_ms(1200);    // Pauza medzi SOS sekvenciami (píšem 1200 ms, pretože 200 ms už máme z predchádzajúceho cyklu)

    }

    return 0;
}
#ifndef UART_H_
#define UART_H_

void uart_init( void );     
void uart_putc( char c );
void uart_puts( const char *s );
char uart_getc( void );

#endif

unsigned int adc_read(char a_pin);

</syntaxhighlight ></tab> <tab name="uart.c"><syntaxhighlight lang="c++" style="background: LightYellow;">

  1. include <avr/io.h>
  2. include <util/setbaud.h>
  3. include "uart.h"

void uart_init( void ) {

   UBRR0H = UBRRH_VALUE;
   UBRR0L = UBRRL_VALUE;
  1. if USE_2X
   UCSR0A |= _BV(U2X0);
  1. else
   UCSR0A &= ~(_BV(U2X0));
  1. endif
   UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
   UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */

}

void uart_putc(char c) {

  if (c == '\n') 
    {
      uart_putc('\r');
   }
  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
  UDR0 = c;

}

// Реализация вывода строки (твоя задача выполнена) void uart_puts(const char *s) {

   while (*s) {
       uart_putc(*s++);
   }

}

char uart_getc(void) {

   loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
   return UDR0;

}


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

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. Na konci uvádzame fotku hotového zariadenia.

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.