Operácie

Vysielač morzeovky

Zo stránky SensorWiki

Verzia z 14:52, 12. apríl 2024, ktorú vytvoril StudentMIPS (diskusia | príspevky)
Záverečný projekt predmetu MIPS / LS2024
Autor: Dávid Majba
Študijný odbor: Automobilová mechatronika
Ročník: 2. Bc. (2024)

Zadanie

Vysielač morzeovky po sériovej linke

Vývojová doska ACROB.

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; 
}