Operácie

Vysielač morzeovky: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
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…“
 
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
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 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; 
}