Martin Bača, René Letocha
xbacam01
stud.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.