Operácie

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:
Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko'''
+
{|
 
+
|Autor:      || '''Dávid Majba'''
 +
|-                       
 +
|Študijný odbor:  || '''Automobilová mechatronika'''
 +
|-
 +
|Ročník:      || '''2. Bc. ''' (2024)
 +
|}
  
 
== Zadanie ==
 
== Zadanie ==
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
'''Vysielač morzeovky''' po sériovej linke
  
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
  
'''Literatúra:'''
+
zdrojový kód:  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
 
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
 
  
 +
<source lang="c">
  
__TOC__
+
#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)
  
== Analýza  a opis riešenia ==
+
#include <avr/io.h>
 +
#include <util/delay.h>
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
// Definícia makier pre nastavenie a vynulovanie bitu
 +
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
 +
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
 
  
Nezabudnite doplniť schému zapojenia!
+
#define repracik PD6 // Definícia pinu pre reproduktor
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
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
 +
};
  
=== Algoritmus a program ===
+
// Tabuľka Morseových kódov pre čísla
 +
const char* morseovkaCISLA[] = {
 +
    "-----", // 0
 +
    ".----", // 1
 +
    "..---", // 2
 +
    "...--", // 3
 +
    "....-", // 4
 +
    ".....", // 5
 +
    "-....", // 6
 +
    "--...", // 7
 +
    "---..", // 8
 +
    "----.", // 9
 +
};
  
Algoritmus programu je....
+
// Inicializácia reproduktora
 
+
void hrajreprak(void) {
 
+
    DDRD |= (1 << repracik); // Nastavenie pinu reproduktora ako výstupný
<tabs>
+
    TCCR0A = (1<<COM0A0)|(1<<WGM01); // Nastavenie PWM výstupu
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
    TCCR0B = (1<<CS02); // Nastavenie preddelečníka časovača
#include <avr/io.h>
+
}
 
 
int main(void)
 
{
 
  unsigned int measuredValue;
 
  
  while (1)
+
// Prehrávanie Morseovho kódu
  {
+
void prehrajmorseovku(const char* morseovkaPISMENA) {
     /*  relax  */ 
+
      
  }
 
  
  return(0);
+
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
 +
    }
 
}
 
}
  
</source></tab>
+
int main(void) {
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
    UBRR0 = BAUD_PRESCALE; // Nastavenie hodnoty predelečníka UBRR
#include <avr/io.h>
+
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Nastavenie počtu bitov pre UART
 +
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); // Aktivácia RX a TX pre UART
  
void adc_init(void);                                   // A/D converter initialization
+
    hrajreprak(); // Inicializácia reproduktora
 +
    while (1) {
 +
        while (!(UCSR0A & (1 << RXC0))) {}; // Čakanie na príchod znaku
 +
        znak = UDR0; // Uloženie prijatého znaku
  
unsigned int adc_read(char a_pin);
+
        if (( znak >= 'A' && znak <= 'Z') || ( znak >= 'a' && znak <= 'z')) { // Pre písmená
</source></tab>
+
            if ( znak >= 'a' && znak <= 'z') { // Ak je znak malé písmeno, premeníme ho na veľké
</tabs>
+
                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
 +
        }
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
        while (!(UCSR0A & (1 << UDRE0))) {}; // Čakanie na možnosť odoslať znak
 +
        UDR0 = znak; // Odoslanie prijatého znaku
 +
    }
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
+
    return 0;
 
+
}
 
 
=== Overenie ===
 
 
 
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
 
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
 
 
 
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
 
 
 
'''Video:'''
 
<center><youtube>_l02MBu41n0</youtube></center>
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
[[Category:AVR]] [[Category:MIPS]]
+
</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; 
}