Martin Bača, René Letocha
xbacam01stud.feec.vutbr.cz,
xletoc00
stud.feec.vutbr.cz
Tento projekt se zabývá návrhem a realizací kytarové ladičky s mikrokontrolerem ATmega 16.
Mikrofon přivádí kmitočet kytary na tranzistorový zesilovač s velkým zesílením. Zesílení tranzistoru musí být dostatečně velké aby Atmega mohla rozpoznat náběžnou nebo sestupnou hranu. Hrany jsou čítány po jistý časový úsek a následně porovnány s předvolenou hodnotou kmitočtu. Rozdíl navoleného kmitočtu a změřeného je vyhodnocen jako rozladění kytary. Požadovaný tón je volen pomocí tlačítek a rozdílový kmitočet je zobrazen na LCD. Schéma zapojení je zobrazeno na obrázku 1.
Obr.1: Schéma zapojení
Realizace projektu na vývojovém kitu a nepájivém poli.
Obr.2: Realizace projektu
Po spuštění mikrokontroleru se provedou definice frekvencí jednotlivých tónů a povolení přerušení u čítačů. Při vykonání funkce main se nainicializuje LCD displej, zavolá funkce pro inicializaci čítačů a pak program skočí do nekonečné smyčky sloužící pro výběr nastaveného tónu čtením portu s tlačítky. Při obsluze přerušení od čítače je volána funkce odchylka, která vykonává vlastní porovnání změřené a definované frekvence a výsledek porovnání zobrazuje na LCD.
#include <inttypes.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #include <stdio.h> #include "lcd_h.h" #define TONE_E1 330 #define TONE_H 247 #define TONE_G 196 #define TONE_D 147 #define TONE_A 110 #define TONE_E2 82 unsigned int preteceni; unsigned int preruseni; unsigned long int citac; char BUFFER [20]; unsigned int Tone; inline void Odchylka(int X) { unsigned int Rozdil; cli(); TCCR1B = 0b01000000; // zastavi citani citac = TCNT1; // Precte hodnotu citace citac += preteceni*65535; // Preteceni je pro vyzsi kmitocty citac *= 2; // Mereni po dobu 0,5s citac += 10; // Korekce mereni if (citac < 100) citac = 0; // Osetreni nahodnych okolnich zvuku Rozdil = citac; lcd_gotoxy(0,0); // posun kurzoru na zacatek LCD sprintf(BUFFER,"Freq: %uHz ",Rozdil); lcd_puts(BUFFER); // Vypise text if( citac == X ) { lcd_gotoxy(0,1); sprintf(BUFFER,"Naladeno "); lcd_puts(BUFFER); // Vypise text } if( citac > X ) { lcd_gotoxy(0,1); Rozdil = Rozdil - X; sprintf(BUFFER,"Uber %uHz ",Rozdil); lcd_puts(BUFFER); // Vypise text } if( citac < X ) { lcd_gotoxy(0,1); Rozdil = X - Rozdil; sprintf(BUFFER,"Pridej %uHz ",Rozdil); lcd_puts(BUFFER); // Vypise text } preteceni = 0; preruseni = 0; citac = 0; TCCR1B = 0b01000111; // spusti citani sei(); TCNT1 = 0; // vynuluje citac } ISR (TIMER1_OVF_vect) { preteceni++; // 16bit citac pretekl }; ISR (TIMER0_COMP_vect) { preruseni++; if (preruseni == 125) { Odchylka(Tone); }; }; void init_citace(void) { // Natavit porty jako vstupni DDRD = 0b00000000; DDRB = 0b00000000; // 16bit c/c1 slouzi pro citani nabeznych hran TCCR1A = 0b00000000; TCCR1B = 0b01000111; TIMSK = 0b00000100; // povoleni preruseni pri preteceni TIMER1 TIFR |= 0b00000100; // 8bit c/c0 meri cas TCCR0 = 0b00001100; // CTC, předdělička 256 TIMSK|= OCIE0 << 1; // Povoleni preruseni po shode TCNT0 a OCR0 TIFR |= OCF0 << 1; // Priznak preruseni OCR0 = 249; // Citani po dobu 8ms } int main( void ) { lcd_init(); lcd_puts("Kytarova ladicka"); for(char i=0;i<10;i++) _delay_ms(200); lcd_clrscr(); init_citace(); sei(); Tone = TONE_E1; while(1) { if (bit_is_clear(PIND,PD0)) { cli(); Tone = TONE_E1; lcd_gotoxy(0,2); lcd_puts("Ton E1"); _delay_ms(250); sei(); } if (bit_is_clear(PIND,PD1)) { cli(); Tone = TONE_H; lcd_gotoxy(0,2); lcd_puts("Ton H "); _delay_ms(250); sei(); } if (bit_is_clear(PIND,PD2)) { cli(); Tone = TONE_G; lcd_gotoxy(0,2); lcd_puts("Ton G "); _delay_ms(250); sei(); } if (bit_is_clear(PIND,PD3)) { cli(); Tone = TONE_D; lcd_gotoxy(0,2); lcd_puts("Ton D "); _delay_ms(250); sei(); } if (bit_is_clear(PIND,PD4)) { cli(); Tone = TONE_A; lcd_gotoxy(0,2); lcd_puts("Ton A "); _delay_ms(250); sei(); } if (bit_is_clear(PIND,PD5)) { cli(); Tone = TONE_E2; lcd_gotoxy(0,2); lcd_puts("Ton E2 "); _delay_ms(250); sei(); } }; };
Cílem projektu bylo navrhnout a realizovat kytarovou ladičku založenou na mikrkontroleru ATmega16. Cíl práce byl splněn splněn v plném rozsahu.