Vysielač morzeovky
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2024
Autor: | Dávid Majba |
Študijný odbor: | Automobilová mechatronika |
Ročník: | 2. Bc. (2024) |
Zadanie
Vysielač morseovky po sériovej linke
Zdrojový kód:
<tabs> <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
- 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: