Kytarová ladička

Martin Bača, René Letocha
xbacam01stud.feec.vutbr.cz, xletoc00stud.feec.vutbr.cz 

Obsah:

  1. Úvod
  2. Realizace
  3. Popis programu
  4. Závěr
  5. Soubory

Úvod

Tento projekt se zabývá návrhem a realizací kytarové ladičky s mikrokontrolerem ATmega 16.

Realizace

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.

Schéma

Obr.1: Schéma zapojení

Realizace projektu na vývojovém kitu a nepájivém poli.

Schéma

Obr.2: Realizace projektu

Popis programu

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&#345;edd&#283;li&#269;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();
    }
  };
   
};


Závěr

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.

Soubory

Zdrojové kódy
Video