Vysielač morzeovky: Rozdiel medzi revíziami
Zo stránky 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…“ |
Bez shrnutí editace |
||
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 z 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;
}