Operácie

Vysielač morzeovky

Zo stránky SensorWiki

Verzia z 15:04, 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č morseovky po sériovej linke

TEST

Zdrojový kód:

<tabs> <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">

  1. define F_CPU 16000000UL // Definícia frekvencie CPU
  2. define BAUDRATE 9600 // Požadovaná rýchlosť pre sériovú komunikáciu
  3. define BAUD_PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)
  1. include <avr/io.h>
  2. include <util/delay.h>

// Definícia makier pre nastavenie a vynulovanie bitu

  1. define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
  2. define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))


  1. 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: