SOS maják: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
| Riadok 126: | Riadok 126: | ||
UCSR0A &= ~(_BV(U2X0)); | UCSR0A &= ~(_BV(U2X0)); | ||
#endif | #endif | ||
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); | UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); | ||
UCSR0B = _BV(RXEN0) | _BV(TXEN0); | UCSR0B = _BV(RXEN0) | _BV(TXEN0); | ||
} | } | ||
| Riadok 135: | Riadok 135: | ||
uart_putc('\r'); | uart_putc('\r'); | ||
} | } | ||
loop_until_bit_is_set(UCSR0A, UDRE0); | loop_until_bit_is_set(UCSR0A, UDRE0); | ||
UDR0 = c; | UDR0 = c; | ||
} | } | ||
void uart_puts(const char *s) { | void uart_puts(const char *s) { | ||
while (*s) { | while (*s) { | ||
| Riadok 147: | Riadok 146: | ||
char uart_getc(void) { | char uart_getc(void) { | ||
loop_until_bit_is_set(UCSR0A, RXC0); | loop_until_bit_is_set(UCSR0A, RXC0); | ||
return UDR0; | return UDR0; | ||
} | } | ||
Verzia z 11:35, 29. apríl 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 (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
#include <avr/io.h>
#include <util/setbaud.h>
#include "uart.h"
void uart_init( void ) {
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
UCSR0A &= ~(_BV(U2X0));
#endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
}
void uart_putc(char c) {
if (c == '\n')
{
uart_putc('\r');
}
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
}
void uart_puts(const char *s) {
while (*s) {
uart_putc(*s++);
}
}
char uart_getc(void) {
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}
unsigned int adc_read(char a_pin);
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.

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.