Elektronik / Mikrodenetleyici Projeleri/

Nokia 3310 göstergeli ses kontrolü (atmega8 tda7439)

Geçenlerde eski şaseleri karıştırırken eski bir müzik seti şasesinde tda7439 buldum ve bu entegre ile bir uygulama yapmaya karar verdim ve sonuçta böyle güzel bir uygulama ortaya çıktı uygulamadan bahsedecek olursak devre tda7439 ile dijital ses kontrolü yapmaktadır denetleyici olarak atmega8 lcd olarakta elimde 3310 lcd olduğu için 3310 lcdsini kullandım tda7439 entegresi –47-0 db arası ses 0-30 db arası kazanç ve -14-+14 db arası bas mid tiz kontrolu ayrıca balans kontrolü yapmaktadır. ayrıca 4 stereo girişi bulunur uygulamada tek giriş olduğu için diğerlerini boş bıraktım entegreyi lm3886 ile test ettim gayet güzel çalışıyor ve ayar yapıyor.

atmel atmega8  nokia lcd

Devrede yapılan ayarlar lcd ekranda barlar sekinde görülebilir 2.satırda ise hangi değerin kontrol edildiği görülür ayrıca hangi bar aktif ise ok ile belirtilir devrede kontrol menu+- +- ve mute tuşları ile ve ayrıca philips rc5 uyumlu kumanda ile sağlanır elimdeki vestel tv kumandası rc5 uyumlu olduğu için rc5 protkolunu kullandım değerler eeproma kaydedildiği için sabit kalır.

Devre üzerindeki jumper ile lcd görüntüsünü tersleyebilir ve normal kullanabilirsiniz jumper ayarı devreyi çalıştırmadan önce yapılmalıdır aksi halde devreyi etkilemez atmega8‘i programlamak için ise devrede isp soketi bulunmaktadır devre güçkaynağına bağlı iken basit paralel port programlayıcılar ile porgramlayabilirsiniz program atmega8’in %75 civarı hafızasını kaplıyor tda7439‘un piyasada bulunabilirliği ise cıvardaki malzemeciye gittim 2 dolara getirtebileceğini söyledi oda malzemelerini karaköyden aldığı için karaköy piyasasında rahatlıkla bulunabilir.

Atmega8‘ide karaköyden 4 liraya 3310 lcd’yi ise yedek parçacıdan 3 dolara almıştım devrenin simulasyon ve baskı devresini proteus7.5 veya üst versiyonu ile açabilirsiniz.Uygulamanın test videosunu ayrıca indirebilirsiniz devrenin kodlarını ücretsiz winavr c derleyicisi ile yazdım projenin açık kodları mevcuttur. Proje ile ilgili öneri eksik ve şikayetlerinizi bildirirseniz sevinirim

Atmega8 + Tda7439 + 3310lcd ile dijital ses kontrol projesine ait video görüntüleri

Main.c yazılım içeriği


/****************************************************************
*  Name    : Atmega8 + Tda7439 +3310 lcd ile dijital ses kontrol*
*  Author  : Erhan YILMAZ                                       *
*  Notice  : All Rights Reserved                                *
*  E-mail  : erhan_yilmazz@hotmail.com                          *
*  Date    : 23.10.2009                                         *
*  Version : 1.0                                                *
*  Notes   : proje ile ilgili öneri görüş veya eksikleri        *
*          : bildiriseniz sevinirim 						    *
****************************************************************/
#define F_CPU 4000000UL
#include <avr/eeprom.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2cmaster.h"
#include "twimaster.c"
#include "rc5dec.h"
#include "rc5dec.c"
#include "N3310.h"
#include "N3310.c"
#include "image.h"
#include "font.h"
#define tda7439_Adr		0X88
#define bal		1
#define ses		2
#define gain	3
#define bas		4
#define mid		5
#define tiz		6

const prog_uint8_t *Bitmap;
const prog_uint8_t *Font;
uint8_t menu=1,sekil,mute=0,data,gain_,ses_,bas_,mid_,tiz_,bal_,yuzler,onlar,birler;
//Tda7439a data yazmak için kullanılan fonksiyon
void tda7439_yaz(char sub_adr,char data){
    i2c_start(tda7439_Adr);
	i2c_write(sub_adr);
	i2c_write(data);
	i2c_stop();               
	}
//15lik barı gösteren fonksiyon
void bar_goster1(char bar){
char data1,data2,bosluk,i,onlar,birler;	
bosluk=(15-bar)*5;
if (sekil==1){data1=0XBF;data2=0X80;}
else {data1=0X7F;data2=0X00;}
for(i=0;i<bar;i++){glcdn_WriteData(data1);
glcdn_WriteData(data1);glcdn_WriteData(data1);
glcdn_WriteData(data1);glcdn_WriteData(data2);}
for(i=0;i<bosluk;i++)glcdn_WriteData(data2);}
//Balans barını göstern fonksiyon
void bar_goster2(char deger){	
if(deger<80)sol_bar(deger);
else sag_bar(deger);}

void sol_bar(char deger){
char bosluk,i,bar;bar=(80-deger)/5;bosluk=(16-bar)*2;
for(i=0;i<bosluk;i++)glcdn_WriteData(0X00);
for(i=0;i<bar;i++){glcdn_WriteData(0X7F);glcdn_WriteData(0X00);}
ok_yaz();for(i=0;i<32;i++)glcdn_WriteData(0X00);}

void sag_bar(char deger){
char bosluk,i,bar;bar=(deger-80)/5;bosluk=(16-bar)*2;
for(i=0;i<32;i++)glcdn_WriteData(0X00);ok_yaz();
for(i=0;i<bar;i++){glcdn_WriteData(0X7F);glcdn_WriteData(0X00);}
for(i=0;i<bosluk;i++)glcdn_WriteData(0X00);}
//25lik barı göstern fonksiyon
void bar_goster3(char bar){
char bosluk,i;bar=(bar/2);bosluk=(25-bar)*3;
for(i=0;i<bar;i++){glcdn_WriteData(0X7F);glcdn_WriteData(0X7F);glcdn_WriteData(0X00);}
for(i=0;i<bosluk;i++)glcdn_WriteData(0X00);}
//Hangi satırda olduğu gösteren oku çizen fonksiyon
void isaret_et(char satir){
char data;
if (satir==3){glcdn_gotoxy(0x4D,(satir));
glcdn_WriteData(0X08);glcdn_WriteData(0X1C);
glcdn_WriteData(0X3E);glcdn_WriteData(0X49);
glcdn_WriteData(0X08);glcdn_gotoxy(0x4D,(satir+1));
for(uint8_t i=0;i<5;i++)glcdn_WriteData(0X00);}
else if (satir==6){glcdn_gotoxy(0x4D,(satir));
glcdn_WriteData(0X88);glcdn_WriteData(0X9C);
glcdn_WriteData(0XBE);glcdn_WriteData(0XC9);
glcdn_WriteData(0X88);glcdn_gotoxy(0x4D,(satir-1));
for(uint8_t i=0;i<5;i++)glcdn_WriteData(0X00);}
else{glcdn_gotoxy(0x4D,(satir+1));
if(satir==5)data=0X80;else data=0X00;for(uint8_t i=0;i<5;i++)
glcdn_WriteData(data);glcdn_gotoxy(0x4D,satir);glcdn_WriteData(0X08);
glcdn_WriteData(0X1C);glcdn_WriteData(0X3E);glcdn_WriteData(0X49);
glcdn_WriteData(0X08);glcdn_gotoxy(0x4D,(satir-1));
for(uint8_t i=0;i<5;i++)glcdn_WriteData(0X00);}}
//Denge kısmındaki oku görüntüleyen fonksiyon
void ok_yaz(){
glcdn_WriteData(0X08);glcdn_WriteData(0X1C);
glcdn_WriteData(0X2A);glcdn_WriteData(0X49);glcdn_WriteData(0X08);
glcdn_WriteData(0X08);glcdn_WriteData(0X49);glcdn_WriteData(0X2A);
glcdn_WriteData(0X1C);glcdn_WriteData(0X08);glcdn_WriteData(0X00);}
//Db değelerini seçen fonsiyon
db_sec(char bar){
	switch (bar){
	case 0:glcdn_Putstr("-14db");data=0;break;
	case 1:glcdn_Putstr("-12db");data=1;break;
	case 2:glcdn_Putstr("-10db");data=2;break;
	case 3:glcdn_Putstr("-8db ");data=3;break;
	case 4:glcdn_Putstr("-6db ");data=4;break;
	case 5:glcdn_Putstr("-4db ");data=5;break;
	case 6:glcdn_Putstr("-2db ");data=6;break;
	case 7:glcdn_Putstr("0db  ");data=7;break;
	case 8:glcdn_Putstr("0db  ");data=15;break;
	case 9:glcdn_Putstr("2db  ");data=14;break;
	case 10:glcdn_Putstr("4db  ");data=13;break;
	case 11:glcdn_Putstr("6db  ");data=12;break;
	case 12:glcdn_Putstr("8db  ");data=11;break;
	case 13:glcdn_Putstr("10db ");data=10;break;
	case 14:glcdn_Putstr("12db ");data=9;break;
	case 15:glcdn_Putstr("14db ");data=8;break;}}

//binary sayıyı 2 basamak desimale çeviren fonksiyon
void byte_to_bcd(char sayi){
if(sayi>99)return 0x00;
onlar=(sayi/10)+0x30;birler=(sayi%10)+0x30;
if (onlar==0X30){onlar=birler;birler=0X20;}}
//Ekranda 4 satır barı gösteren fonksiyon
void goster(char sat1,char sat2,char sat3,char sat4){
glcdn_gotoxy(2,3);sekil=0;bar_sec(sat1);
glcdn_gotoxy(2,4);sekil=0;bar_sec(sat2);
glcdn_gotoxy(2,5);sekil=0;bar_sec(sat3);
glcdn_gotoxy(2,6);sekil=1;bar_sec(sat4);}
//Gösterilecek barı seçen fonksiyon
void bar_sec (char bar){
switch (bar){
case bal:bar_goster2(bal_);break;
case ses:bar_goster3(ses_);break;
case gain:bar_goster1(gain_);break;
case bas:bar_goster1(bas_);break;
case mid:bar_goster1(mid_);break;
case tiz:bar_goster1(tiz_);break;}}
//kumanda kodalrını değerlendiren fonksiyon
void tus_bak(char tus){
cli();rc5_valid =0;
switch (tus){
case 13:mute=!mute;_delay_ms(200);break;
case 32:if (menu>1){menu--;_delay_ms(200);}break;
case 33:if (menu<6){menu++;_delay_ms(200);}break;
case 16:if (menu==1 && bal_<159)bal_+=2;
else if(menu==2 && ses_<50)ses_++;
else if(menu==3 && gain_<15)gain_++;
else if(menu==4 && bas_<15)bas_++;
else if(menu==5 && mid_<15)mid_++;
else if(menu==6 && tiz_<15)tiz_++;_delay_ms(50);break;
case 17:if (menu==1 && bal_>1)bal_-=2;
else if(menu==2 && ses_>0)ses_--;
else if(menu==3 && gain_>0)gain_--;
else if(menu==4 && bas_>0)bas_--;
else if(menu==5 && mid_>0)mid_--;
else if(menu==6 && tiz_>0)tiz_--;_delay_ms(50);break;
}sei();}

//Balans ayrının yapıldığı kısım
void denge_ayar(){
	if(~PIND & _BV(7)&&bal_<159){bal_+=2;_delay_ms(100);}
	if(~PIND & _BV(6)&&bal_>1){bal_-=2;_delay_ms(100);}
	glcdn_gotoxy(10,2);glcdn_Putstr("  Denge    ");
	goster(bal,ses,gain,bas);isaret_et(3); 
	if(bal_<80){tda7439_yaz(0X06,80-(bal_+1));tda7439_yaz(0X07,0X00);}
	else{tda7439_yaz(0X06,0X00);if(bal_==80){tda7439_yaz(0X07,0x00);}
	else{tda7439_yaz(0X07,(bal_-1)-80);}}}
//Ses ayarının yapıldığı kısım	
void ses_ayar(){
	if(~PIND & _BV(7)&&ses_<50){ses_++;_delay_ms(150);}
	if(~PIND & _BV(6)&&ses_>0){ses_--;_delay_ms(150);}
	glcdn_gotoxy(10,2);glcdn_Putstr("Ses=");if(ses_!=50)glcdn_Putstr("-");
	byte_to_bcd(50-ses_);glcdn_Putc(onlar);glcdn_Putc(birler);glcdn_Putstr("db   ");
	goster(bal,ses,gain,bas);isaret_et(4);tda7439_yaz(0X02,(50-ses_));}
//Kazanç ayarının yapıldığı kısım	
void gain_ayar(){
	if(~PIND & _BV(7)&&gain_<15){gain_++;_delay_ms(200);}
	if(~PIND & _BV(6)&&gain_>0){gain_--;_delay_ms(200);}
	glcdn_gotoxy(10,2);glcdn_Putstr("Kazanc=");byte_to_bcd(gain_*2);
	glcdn_Putc(onlar);glcdn_Putc(birler);glcdn_Putstr("db");
	goster(bal,ses,gain,bas);isaret_et(5);tda7439_yaz(0X01,gain_);}	
//Bas ayarının yapıldığı kısım	
void bas_ayar(){
	if(~PIND & _BV(7)&&bas_<15){bas_++;_delay_ms(200);}
	if(~PIND & _BV(6)&&bas_>0){bas_--;_delay_ms(200);}
	glcdn_gotoxy(10,2);glcdn_Putstr("Bas=");db_sec(bas_);glcdn_Putstr("  ");
	goster(bal,ses,gain,bas);isaret_et(6);tda7439_yaz(0X03,data);}
//Mid ayarının yapıldığı kısım	
void mid_ayar(){
	if(~PIND & _BV(7)&&mid_<15){mid_++;_delay_ms(200);}
	if(~PIND & _BV(6)&&mid_>0){mid_--;_delay_ms(200);}
	glcdn_gotoxy(10,2);glcdn_Putstr("Mid=");db_sec(mid_);glcdn_Putstr("  ");
	goster(ses,gain,bas,mid);isaret_et(6);tda7439_yaz(0X04,data);}
//Tiz ayarının yapıldığı kısım	
void tiz_ayar(){
	if(~PIND & _BV(7)&&tiz_<15){tiz_++;_delay_ms(200);}
	if(~PIND & _BV(6)&&tiz_>0){tiz_--;_delay_ms(200);}
	glcdn_gotoxy(10,2);glcdn_Putstr("Tiz=");db_sec(tiz_);glcdn_Putstr("  ");
	goster(gain,bas,mid,tiz);isaret_et(6);tda7439_yaz(0X05,data);}
	
void mute_(){
	glcdn_gotoxy(10,2);glcdn_Putstr("   Mute    ");
	tda7439_yaz(0X02,0X38);
	tda7439_yaz(0X01,0X00);
	while(mute==1)
	{if(rc5_valid == -1 && rc5_code==13){rc5_valid =0;mute=!mute;}
	if(~PINB & _BV(0)){mute=!mute;}}
	tda7439_yaz(0X02,(50-ses_));tda7439_yaz(0X01,(gain_));_delay_ms(200);}
//Dahili eeproma data yazan fonksiyon
void eeprom_write( char adres, char data){
while(EECR & (1<<EEWE));
EEAR=adres;
EEDR=data;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
//Dahili eepromdan data okuyan fonksiyon
char eeprom_read(char adres){
while(EECR & (1<<EEWE));
EEAR=adres;
EECR |= (1<<EERE);
return EEDR;}
//Başlıkyazısını ve kenarlerı çizen fonksiyon
void cerceve_ciz(){
glcdn_gotoxy(0,1);for(uint8_t i=0; i<84; i++)glcdn_WriteData(pgm_read_byte(&baslik[i]));
for(uint8_t i=1; i<5; i++){glcdn_WriteCommand(GLCD_SETYADDR | i);
glcdn_WriteCommand(GLCD_SETXADDR | 0);glcdn_WriteData(0XFF);
glcdn_WriteCommand(GLCD_SETXADDR | 83);glcdn_WriteData(0XFF);}
glcdn_WriteCommand(0X45);glcdn_WriteCommand(0X80);glcdn_WriteData(0XFF);
for(uint8_t i=1;i<83;i++)glcdn_WriteData(0X80);glcdn_WriteData(0XFF);}


void main(void){
Font=Font5x7;Bitmap=logo;
DDRD=0X00;PORTD=0XF7;
DDRB=0XFE;PORTB=0X01;glcdn_InitDisplay();
i2c_init();tda7439_yaz(0X00,0X03);
bal_=eeprom_read(1);if(bal_>160)bal_=80;denge_ayar();
ses_=eeprom_read(2);if(ses_>50)ses_=30;ses_ayar();
gain_=eeprom_read(3);if(gain_>15)gain_=8;gain_ayar();
bas_=eeprom_read(4);if(bas_>15)bas_=8;bas_ayar();
mid_=eeprom_read(5);if(mid_>15)mid_=8;mid_ayar();
tiz_=eeprom_read(6);if(tiz_>15)tiz_=8;tiz_ayar();
if(~PIND & _BV(2))glcdn_WriteCommand(GLCD_DISPLAYNORMAL);
else glcdn_WriteCommand(GLCD_DISPLAYINVERT);logo_goster();
_delay_ms(4000);glcdn_ClearLcd();cerceve_ciz();rc5_init();sei();

	while(1){
	if(rc5_valid == -1){tus_bak(rc5_code);}
	if(~PINB & _BV(0)){mute=!mute;_delay_ms(200);}	
	if(~PIND & _BV(1) && menu<6){menu++;_delay_ms(200);}
	if(~PIND & _BV(0) && menu>1){menu--;_delay_ms(200);}		
	if(mute==1)mute_();
	if(menu==1){denge_ayar();eeprom_write(1,bal_);}
	if(menu==2){ses_ayar();eeprom_write(2,ses_);}
	if(menu==3){gain_ayar();eeprom_write(3,gain_);}
	if(menu==4){bas_ayar();eeprom_write(4,bas_);}
	if(menu==5){mid_ayar();eeprom_write(5,mid_);}
	if(menu==6){tiz_ayar();eeprom_write(6,tiz_);}}}


N3310.c yazılım içeriği

//////////////////////////////////////////////////////////
// Title:		drm3310.c								//
// Version:		v1.0									//
// Author:												//
// Compiler:	AVR-GCC: WinAVR-20040720				//
// History:		20040815:	Release	v1.0				//
// 														//
//////////////////////////////////////////////////////////

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "N3310.h"

extern const prog_uint8_t *Font;
extern const prog_uint8_t *Bitmap;

void SpiMasterInit(void)
{
    unsigned char tmp;
	
    // Switch SCK and MOSI pins to output mode. 
    DDR_SPI |= _BV(SCK) | _BV(MOSI) | _BV(SS); 
	
    // Activate the SPI hardware. 
    SPCR = _BV(SPE) | _BV(MSTR);
 
    // Clear status flags. 
    tmp = SPSR;
    tmp = SPDR;
}

void glcdn_spiSendByte(uint8_t data){
	// Send Byte
	SPDR = data;
	// Wait until transfer complete
    while ( (SPSR & 0x80) != 0x80 );
	// Chip disable
}

void glcdn_InitDisplay(void){
	GLCD_CTRL_PORT|=_BV(GLCD_RES_); //pull up

	// Init Control Ports
	GLCD_CTRL_DDR|=_BV(GLCD_DC) | _BV(GLCD_RES_) | _BV(GLCD_SCLK) | _BV(GLCD_SDIN);// | _BV(GLCD_CE_);
	
	SpiMasterInit();

	// Reset Lcd
	_delay_ms(15);
	GLCD_CTRL_PORT&=~_BV(GLCD_RES_);
	_delay_ms(1);
	GLCD_CTRL_PORT|=_BV(GLCD_RES_);

	// Enable extended Functionset
	glcdn_WriteCommand(GLCD_FUNCTIONSETEXT);
	// Set Tempcoefficient
	glcdn_WriteCommand(GLCD_TEMPCOEF);
	// Set Bias
	glcdn_WriteCommand(GLCD_BIAS);
	// Set Contrast
	glcdn_Contrast(0x40);
	// Enable normal Functionset
	glcdn_WriteCommand(GLCD_FUNCTIONSET);
	// Set Display to normal Mode
	glcdn_WriteCommand(GLCD_DISPLAYNORMAL);
	// Clear Lcd
	glcdn_ClearLcd();
	
	
	

}

void glcdn_WriteData(uint8_t myData){
	// Enable Data Transfer
	GLCD_CTRL_PORT|=_BV(GLCD_DC);
	// Send Byte
	glcdn_spiSendByte(myData);
}

void glcdn_WriteCommand(uint8_t myData){
	// Enable Control Transfer
	GLCD_CTRL_PORT&=~_BV(GLCD_DC);
	// Send Byte
	glcdn_spiSendByte(myData);
}


void glcdn_ClearLcd(void){
	for(uint8_t i=1;i<7;i++){glcdn_gotoxy(0,i);
	for(uint8_t i=0;i<84;i++)glcdn_WriteData(0X00);}
}


void glcdn_gotoxy(uint8_t x,uint8_t y){
	glcdn_WriteCommand(x | GLCD_SETXADDR);
	glcdn_WriteCommand((y-1) | GLCD_SETYADDR);}

void glcdn_Putstr(char *data){

	while (*data)
	{
		for(uint8_t i=0; i<5; i++)
		{glcdn_WriteData(pgm_read_byte(&Font[((*data - 0x20) * 5) + i]));}
		glcdn_WriteData(0X00);
		data++;
	}
}

void glcdn_Putc(char data){
for(uint8_t i=0; i<5; i++)
{glcdn_WriteData(pgm_read_byte(&Font[((data - 0x20) * 5) + i]));}
glcdn_WriteData(0X00);}


void logo_goster(){
	for(uint8_t i=0;i<6;i++)
	{glcdn_WriteCommand(GLCD_SETYADDR | i);
	glcdn_WriteCommand(0X80);
	for(uint8_t j=0;j<84;j++)
	glcdn_WriteData(pgm_read_byte(&Bitmap[(i*84)+j]));
	}	
}



void glcdn_Contrast ( uint8_t contrast ){
	glcdn_WriteCommand(GLCD_FUNCTIONSETEXT);
	glcdn_WriteCommand(GLCD_SETVOP | contrast);
	glcdn_WriteCommand(GLCD_FUNCTIONSET);
}




Tüm kaynak dosyalar (proteus ares pcb, şema, kütüphane model, kaynak kodlar) ( şifre-pass: tekniker_erhan ): Nokia 3310 göstergeli ses kontrolü (atmega8 tda7439)

Dosya indirme LINK listesi (TXT formatında) link-8301.zip şifre-pass: 320volt.com

  1. Erhan 2010/12/29
  2. boly 2012/05/19
  3. Göktuğ 2012/07/26
  4. ehmz 2013/02/20
  5. cevat 2015/10/08

Yorum

Soru: