Vysielač morzeovky: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 21: | Riadok 21: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
. | Program je implementáciou prehrávača Morseovho kódu pre ATmega328P pomocou reproduktora na pine PD6. Písmená a čísla sú reprezentované pomocou Morseovho kódu, ktorý je uložený v tabuľkách '''morseovkaPISMENA''' a '''morseovkaCISLA'''. Každé písmeno alebo číslo je kódované ako sekvencia bodiek (".") a čiar ("-"). | ||
Reproduktor je použitý na prehrávanie zvukových signálov, ktoré odpovedajú Morseovým kódom. Rýchlosť prehrávania je možné meniť pomocou premennej '''rychlost''', ktorá určuje dĺžku pauzy medzi jednotlivými bodkami, čiarkami a písmenami. | |||
[[Súbor:Majbaschema.png|400px|thumb|center|Schéma zapojenia ]] | [[Súbor:Majbaschema.png|400px|thumb|center|Schéma zapojenia ]] |
Verzia z 15:52, 12. apríl 2024
Záverečný projekt predmetu MIPS / LS2024
Autor: | Dávid Majba |
Študijný odbor: | Automobilová mechatronika |
Ročník: | 2. Bc. |
Zadanie
Vysielač Morseovky po sériovej linke
Literatúra:
Analýza a opis riešenia
Program je implementáciou prehrávača Morseovho kódu pre ATmega328P pomocou reproduktora na pine PD6. Písmená a čísla sú reprezentované pomocou Morseovho kódu, ktorý je uložený v tabuľkách morseovkaPISMENA a morseovkaCISLA. Každé písmeno alebo číslo je kódované ako sekvencia bodiek (".") a čiar ("-").
Reproduktor je použitý na prehrávanie zvukových signálov, ktoré odpovedajú Morseovým kódom. Rýchlosť prehrávania je možné meniť pomocou premennej rychlost, ktorá určuje dĺžku pauzy medzi jednotlivými bodkami, čiarkami a písmenami.
Algoritmus a program
Zdrojový kód:
#define F_CPU 16000000UL // Definícia frekvencie CPU
#define BAUDRATE 9600 // Požadovaná rýchlosť pre sériovú komunikáciu
#define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)
#include <avr/io.h>
#include <util/delay.h>
// Definícia makier pre nastavenie a vynulovanie bitu
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define repracik PD6 // Definícia pinu pre reproduktor
unsigned char znak;
// Tabuľka Morseových kódov pre písmená
const char* morseovkaPISMENA[] = {
".-", // A
"-...", // B
"-.-.", // C
"-..", // D
".", // E
"..-.", // F
"--.", // G
"....", // H
"..", // I
".---", // J
"-.-", // K
".-..", // L
"--", // M
"-.", // N
"---", // O
".--.", // P
"--.-", // Q
".-.", // R
"...", // S
"-", // T
"..-", // U
"...-", // V
".--", // W
"-..-", // X
"-.--", // Y
"--..", // Z
" ", // Medzera
};
// Tabuľka Morseových kódov pre čísla
const char* morseovkaCISLA[] = {
"-----", // 0
".----", // 1
"..---", // 2
"...--", // 3
"....-", // 4
".....", // 5
"-....", // 6
"--...", // 7
"---..", // 8
"----.", // 9
};
// Inicializácia reproduktora
void hrajreprak(void) {
DDRD |= (1 << repracik); // Nastavenie pinu reproduktora ako výstupný
TCCR0A = (1<<COM0A0)|(1<<WGM01); // Nastavenie PWM výstupu
TCCR0B = (1<<CS02); // Nastavenie preddelečníka časovača
}
// Prehrávanie Morseovho kódu
void prehrajmorseovku(const char* morseovkaPISMENA) {
int rychlost=100; // Rychlost prehravanie (mozne zmenit podla potreby)
while (* morseovkaPISMENA != '\0') {
if (* morseovkaPISMENA == '.') { // Bodka '.'
set_bit(PORTD, repracik); // Zapnutie reproduktora
OCR0A = 100;
_delay_ms(rychlost); // dlzka bodky
clear_bit(PORTD, repracik); // Vypnutie reproduktora
OCR0A = 0;
_delay_ms(rychlost); // Pauza po bodke
} else if (* morseovkaPISMENA == '-') { // čiarka '-'
set_bit(PORTD, repracik); // Zapnutie reproduktora
OCR0A = 100;
_delay_ms(3*rychlost); // dlzka čiarky
clear_bit(PORTD, repracik); // Vypnutie reproduktora
OCR0A = 0;
_delay_ms(rychlost); // Pauza po čiarke
} else if (* morseovkaPISMENA == ' ') { // Pre medzeru
OCR0A = 0;
_delay_ms(7*rychlost); // Pauza pre medzeru
}
morseovkaPISMENA++; // Posunutie na ďalší znak
_delay_ms(3*rychlost); // Pauza po každom znaku
}
}
int main(void) {
UBRR0 = BAUD_PRESCALE; // Nastavenie hodnoty predelečníka UBRR
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Nastavenie počtu bitov pre UART
UCSR0B = (1 << RXEN0) | (1 << TXEN0); // Aktivácia RX a TX pre UART
hrajreprak(); // Inicializácia reproduktora
while (1) {
while (!(UCSR0A & (1 << RXC0))) {}; // Čakanie na príchod znaku
znak = UDR0; // Uloženie prijatého znaku
if (( znak >= 'A' && znak <= 'Z') || ( znak >= 'a' && znak <= 'z')) { // Pre písmená
if ( znak >= 'a' && znak <= 'z') { // Ak je znak malé písmeno, premeníme ho na veľké
znak -= 32;
}
const char* morseovkaznak = morseovkaPISMENA[znak - 'A']; // Získanie Morseovho kódu pre písmeno
prehrajmorseovku(morseovkaznak); // Prehratie Morseovho kódu
} else if ( znak >= '0' && znak <= '9') { // Pre čísla
const char* morseovkacislo = morseovkaCISLA[znak - '0']; // Získanie Morseovho kódu pre číslo
prehrajmorseovku(morseovkacislo); // Prehratie Morseovho kódu
}
while (!(UCSR0A & (1 << UDRE0))) {}; // Čakanie na možnosť odoslať znak
UDR0 = znak; // Odoslanie prijatého znaku
}
return 0;
}
Video: