Dekodér morzeovky: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
| Riadok 1: | Riadok 1: | ||
= Dekodér morzeovky = | |||
Záverečný projekt predmetu MIPS / LS2026 - '''Oleh Chuiko''' | Záverečný projekt predmetu MIPS / LS2026 - '''Oleh Chuiko''' | ||
| Riadok 6: | Riadok 7: | ||
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB. | Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB. | ||
Mikropočítač prijíma vstup z tlačidla | Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (<code>.</code>) a dlhé stlačenie predstavuje čiarku (<code>-</code>). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu. | ||
Krátke stlačenie predstavuje bodku (.) a dlhé stlačenie predstavuje čiarku (-). | |||
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou. | |||
[[Súbor:morse_device.jpg|450px|thumb|center|Celkový pohľad na zariadenie.]] | [[Súbor:morse_device.jpg|450px|thumb|center|Celkový pohľad na zariadenie.]] | ||
| Riadok 15: | Riadok 15: | ||
'''Literatúra:''' | '''Literatúra:''' | ||
[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] | * [[http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob] | ||
* [[https://en.wikipedia.org/wiki/Morse_code](https://en.wikipedia.org/wiki/Morse_code) Morse code] | |||
* [[https://www.microchip.com/en-us/product/atmega328p](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P] | |||
**TOC** | |||
TOC | |||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
'''Ako základ''' pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART. | |||
'''Pre ovládanie dekodéra''' bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku. | |||
'''Program priebežne sleduje''' stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno. | |||
'''Dekódovanie Morseovej abecedy''' je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača. | |||
'''UART komunikácia''' slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania. | |||
UART komunikácia | |||
[[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]] | [[Súbor:morse_device.jpg|400px|thumb|center|Zapojenie tlačidla na vývojovej doske ACROB.]] | ||
Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra. | Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie. | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. | Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku. | ||
Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku. | |||
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno. | |||
Výsledný znak sa následne odošle cez UART do sériového terminálu. | |||
Hlavné časti programu: | Hlavné časti programu: | ||
čítanie tlačidla | * čítanie tlačidla | ||
* meranie dĺžky stlačenia | |||
* rozlíšenie bodky a čiarky | |||
* ukladanie Morse sekvencie do buffera | |||
* dekódovanie znakov | |||
* výpis cez UART | |||
<tabs> | |||
<tab name="main.c"><syntaxhighlight lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include "uart.h" | #include "uart.h" | ||
| Riadok 78: | Riadok 69: | ||
uart_init(); | uart_init(); | ||
``` | |||
while (1) | while (1) | ||
{ | { | ||
/* Morse decoder logic */ | /* Morse decoder logic */ | ||
} | } | ||
``` | |||
} | } </syntaxhighlight></tab> | ||
<tab name="uart.h"><syntaxhighlight lang="c++" style="background: LightYellow;"> | |||
#define set_bit(ADDRESS, BIT)(ADDRESS |= (1 << BIT)) | #define set_bit(ADDRESS, BIT)(ADDRESS |= (1 << BIT)) | ||
#define clear_bit(ADDRESS, BIT)(ADDRESS &= ~(1 << BIT)) | #define clear_bit(ADDRESS, BIT)(ADDRESS &= ~(1 << BIT)) | ||
| Riadok 100: | Riadok 92: | ||
char uart_getc(void); | char uart_getc(void); | ||
#endif | #endif </syntaxhighlight></tab> | ||
<tab name="uart.c"><syntaxhighlight lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.h> | #include <util/delay.h> | ||
| Riadok 113: | Riadok 104: | ||
#include <util/setbaud.h> | #include <util/setbaud.h> | ||
``` | |||
UBRR0H = UBRRH_VALUE; | UBRR0H = UBRRH_VALUE; | ||
UBRR0L = UBRRL_VALUE; | UBRR0L = UBRRL_VALUE; | ||
| Riadok 124: | Riadok 116: | ||
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); | UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); | ||
UCSR0B = _BV(RXEN0) | _BV(TXEN0); | UCSR0B = _BV(RXEN0) | _BV(TXEN0); | ||
``` | |||
} | } | ||
| Riadok 135: | Riadok 128: | ||
} | } | ||
``` | |||
loop_until_bit_is_set(UCSR0A, UDRE0); | loop_until_bit_is_set(UCSR0A, UDRE0); | ||
UDR0 = c; | UDR0 = c; | ||
return 0; | return 0; | ||
``` | |||
} | } </syntaxhighlight></tab> </tabs> | ||
Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]] | Zdrojový kód: [[Médiá:OlehChuiko_MorseDecoder.zip|OlehChuiko_MorseDecoder.zip]] | ||
| Riadok 153: | Riadok 146: | ||
Počas testovania bolo sledované: | Počas testovania bolo sledované: | ||
správne rozpoznávanie bodiek a čiarok | * správne rozpoznávanie bodiek a čiarok | ||
* stabilita merania času stlačenia tlačidla | |||
stabilita merania času stlačenia tlačidla | * správne dekódovanie znakov | ||
* správny výpis cez UART | |||
správne dekódovanie znakov | |||
správny výpis cez UART | |||
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy. | Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy. | ||
'''Video:''' | '''Video:''' | ||
<center><youtube>vh-u5UzWHfU</youtube></center> | |||
== Čo by som urobil inak == | == Čo by som urobil inak == | ||
Verzia z 18:39, 16. máj 2026
Dekodér morzeovky
Záverečný projekt predmetu MIPS / LS2026 - Oleh Chuiko
Zadanie
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.
Mikropočítač prijíma vstup z tlačidla a podľa dĺžky stlačenia rozlišuje jednotlivé symboly Morseovej abecedy. Krátke stlačenie predstavuje bodku (.) a dlhé stlačenie predstavuje čiarku (-). Následne program vytvorí Morse sekvenciu, dekóduje ju na príslušné písmeno a vypíše výsledok cez UART do sériového terminálu.
Zadanie slúži na demonštráciu práce so vstupnými tlačidlami, meraním času, jednoduchým spracovaním textových údajov a UART komunikáciou.

Literatúra:
- [[1](http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description) Dokumentácia k doske Acrob]
- [[2](https://en.wikipedia.org/wiki/Morse_code) Morse code]
- [[3](https://www.microchip.com/en-us/product/atmega328p) Dokumentácia ATmega328P]
- TOC**
Analýza a opis riešenia
Ako základ pre projekt bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P. Mikrokontrolér pracuje na frekvencii 16 MHz a zabezpečuje spracovanie vstupu z tlačidla a komunikáciu cez UART.
Pre ovládanie dekodéra bolo použité jedno tlačidlo pripojené na vstupný pin mikrokontroléra. Tlačidlo slúži na zadávanie Morseových symbolov. Krátke stlačenie predstavuje bodku a dlhé stlačenie predstavuje čiarku.
Program priebežne sleduje stav tlačidla a meria čas jeho stlačenia. Na základe dĺžky impulzu rozhoduje, či ide o krátky alebo dlhý Morse signál. Rozpoznané symboly sa ukladajú do buffera a po dokončení sekvencie sa dekódujú na konkrétne písmeno.
Dekódovanie Morseovej abecedy je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse kódmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART do počítača.
UART komunikácia slúži na výpis dekódovaných znakov do sériového terminálu. Vďaka tomu je možné jednoducho sledovať funkciu programu počas testovania.

Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra, takže nie je potrebné externé pull-up zapojenie.
Algoritmus a program
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.
Rozpoznané symboly sa ukladajú do textového buffera. Po ukončení zadávania znaku program porovná prijatú sekvenciu s uloženou tabuľkou Morseových znakov a nájde zodpovedajúce písmeno.
Výsledný znak sa následne odošle cez UART do sériového terminálu.
Hlavné časti programu:
- čítanie tlačidla
- meranie dĺžky stlačenia
- rozlíšenie bodky a čiarky
- ukladanie Morse sekvencie do buffera
- dekódovanie znakov
- výpis cez UART
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#include "uart.h"
#define BUTTON_PIN PB3
int main(void)
{
uart_init();
```
while (1)
{
/* Morse decoder logic */
}
```
}
#define set_bit(ADDRESS, BIT)(ADDRESS |= (1 << BIT))
#define clear_bit(ADDRESS, BIT)(ADDRESS &= ~(1 << BIT))
#ifndef UART_H_
#define UART_H_
#include <stdio.h>
void uart_init(void);
int uart_putc(char c, FILE * stream);
void uart_puts(const char * s);
char uart_getc(void);
#endif
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
void uart_init(void)
{
#include <util/setbaud.h>
```
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= (1 << U2X0);
#else
UCSR0A &= ~(1 << U2X0);
#endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
```
}
int uart_putc(char c, FILE * stream)
{
if (c == '\n')
{
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = '\r';
}
```
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
return 0;
```
}
Zdrojový kód: OlehChuiko_MorseDecoder.zip
Overenie
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo. Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.
Počas testovania bolo sledované:
- správne rozpoznávanie bodiek a čiarok
- stabilita merania času stlačenia tlačidla
- správne dekódovanie znakov
- správny výpis cez UART
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.
Video:
Čo by som urobil inak
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.