Vysielač morzeovky: Rozdiel medzi revíziami
Z SensorWiki
(Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“) |
|||
Riadok 1: | Riadok 1: | ||
− | + | {| | |
− | + | |Autor: || '''Dávid Majba''' | |
+ | |- | ||
+ | |Študijný odbor: || '''Automobilová mechatronika''' | ||
+ | |- | ||
+ | |Ročník: || '''2. Bc. ''' (2024) | ||
+ | |} | ||
== Zadanie == | == Zadanie == | ||
− | + | '''Vysielač morzeovky''' po sériovej linke | |
− | |||
− | + | zdrojový kód: | |
− | |||
− | |||
+ | <source lang="c"> | ||
− | + | #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; | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | </source> |
Verzia zo dňa a času 14:44, 12. apríl 2024
Autor: | Dávid Majba |
Študijný odbor: | Automobilová mechatronika |
Ročník: | 2. Bc. (2024) |
Zadanie
Vysielač morzeovky po sériovej linke
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;
}