Arkadaşlar Pic16F886 ile WM8731L ses entegresini kontrol etmek istiyorum ama bunda bir türlü başarılı olamıyorum. Aslınısorarsanız doğru yolda gidip gitmediğimi bile şuan için tam olarak kestirebilmiş değilim. ben bu entegreye girdiğim sesin çıkışta vol+ ve vol- ayarlamak istiyorum. entegrenin kendi içinde zaten bu özellik var. Bu özelliği SPI ve I2C ile yapılabiliyor. Ben I2C arayüzünü kullandım. devremide ona göre hazırladım. Ama bir türlü hem isiste hem de gerçek devrede bir türlü aşarılı olamadım.
Lütfen bana problemli olan yerleri yada eksiklerimi söyler misiniz?
Ayrıca I2C protokolüne çok hakim değilim Serdar Çiçeğin kitabından baktım anlaabildiğim kadarıyla da kullanmaya çalıştım ama durum ortada...
İnternette bayağı bi gezindim ama anlayabileceğim şekilde doğru dürüst hiçbir örneğe rastlayamadım.(WM8731L ile alakalı)
WM8731 I2C Bağlantısı için gerekli bilgiler:
(http://f1302.hizliresim.com/16/q/kcbtt.jpg) (http://bit.ly/c25MCx)
(http://b1302.hizliresim.com/16/q/kcbu3.jpg) (http://bit.ly/c25MCx)
(http://b1302.hizliresim.com/16/q/kcbub.jpg) (http://bit.ly/c25MCx)
Adres ve register bilgileri:
(http://b1302.hizliresim.com/16/q/kcbum.jpg) (http://bit.ly/c25MCx)
Pic Kontrol Devre Şemam:
(http://b1302.hizliresim.com/16/q/kcbv2.jpg) (http://bit.ly/c25MCx)
WM8731L Devre Şeması:
(http://a1302.hizliresim.com/16/q/kcc4u.jpg) (http://bit.ly/c25MCx)
Yazdığım Kod:
#include <16F886.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=4000000)
#use i2c(Master,Slow=100000,sda=PIN_C4,scl=PIN_C3, FORCE_HW)
#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#define display_1 pin_C0 // display_1 ifadesi pin_a0 ifadesine eşleniyor
#define display_2 pin_C1 // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define display_bilgi output_b
char birler=0;
char onlar=0;
char ses=0;
int16 sayac, rakam;
// Ortak ANOT display için veri değerleri
int digit[14]={3, 187, 37, 41, 153, 73, 65, 59, 1, 9, 198, 84, 192, 253};
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, L. F. b. -]
void ekran() // Display Tarama Döngüsü
{
if (sayac<=1023)
{
sayac++; rakam=0;
output_high(display_2); // 2. display aktif durumda
display_bilgi(digit[birler]); // displaye bilgi gönderiliyor
delay_ms(5); // gecikme veriliyor
output_low(display_2); // 2. display pasif durumda
output_high(display_1); // 1. display aktif durumda
display_bilgi(digit[onlar]); // displaye bilgi gönderiliyor
delay_ms(5); // gecikme veriliyor
output_low(display_1); // 1. display pasif durumda
}
}
void main()
{
setup_adc_ports(NO_ANALOGS); //AN3 Vref+, AN4 Analog Giriş, (VSS_VREF)VSS
setup_oscillator(OSC_4MHZ|OSC_INTRC);
setup_comparator(NC_NC_NC_NC);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
set_tris_a(0xFF); // A portu A0 ve A1 ÇIKIŞ Diğer uçlar GİRİŞ olarak yönlendiriliyor
set_tris_b(0x00); // B portu tümüyle ÇIKIŞ olarak yönlendiriliyor
set_tris_c(0x1E); // C portu tümüyle GİRİŞ olarak yönlendiriliyor
display_bilgi(255); // EKRANI TEMİZLE
output_high(display_2); // 2. display pasif durumda
output_high(display_1); // 1. display pasif durumda
// WM8731 SES DEĞERİNİ OKU
i2c_start();
i2c_write(0x35); //ALICI REGİSTER ADRESİNİ OKU //delay for ack in the slave device
i2c_write(0x04); // Register Address
i2c_write(ses); // Write data
i2c_stop();
birler=ses%10; // birler hanesi hesaplanıyor
onlar=ses/10; // onlar hanesi hesaplanıyor
ekran();
sayac=0;
rakam=0;
ses=read_eeprom(0);
if(ses==0)
{
ses=1;
write_eeprom(0,ses);
}
if(ses>=64)
{
ses=64;
write_eeprom(0,ses);
}
while(TRUE)
{
if(!input(PIN_C6))// Vol +
{
sayac=0;
rakam=0;
delay_ms(10); // gecikme
ses=ses+2; // sayi değişkenini 2 arttır
if (ses==64) // Eğer sayi değişkeni 100 oldu ise sıfırla
ses=64;
write_eeprom(0,ses);
birler=ses%10; // birler hanesi hesaplanıyor
onlar=ses/10; // onlar hanesi hesaplanıyor
ekran();
sayac=0;
while (!input(PIN_C6))
{
// SAĞ KANAL SES AYARI
i2c_start();
i2c_write(0x34); // reciver register adress
//delay for ack in the slave device
i2c_write(0x06); // Register Address - reciver for left channel
i2c_write((ses)); // Write data FOR VOLUME CONTROL
i2c_stop();
// SOL KANAL SES AYARI
i2c_start();
i2c_write(0x34); // reciver register adress
//delay for ack in the slave device
i2c_write(0x04); // Register Address - reciver for left channel
i2c_write(ses); // Write data FOR VOLUME CONTROL
i2c_stop();
ekran(); sayac=0;
}
}
if(!input(PIN_C7)) // Vol -
{
sayac=0;
rakam=0;
delay_ms(10); // gecikme
ses=ses-2; // sayi değişkenini 1 azalt
if (ses==0) // Eğer sayi değişkeni 100 oldu ise sıfırla
ses=1;
write_eeprom(0,ses);
birler=ses%10; // birler hanesi hesaplanıyor
onlar=ses/10; // onlar hanesi hesaplanıyor
while (!input(PIN_C7))
{
// SAĞ KANAL SES AYARI
i2c_start();
i2c_write(0x34); // reciver register adress
//delay for ack in the slave device
i2c_write(0x06); // Register Address - reciver for left channel
i2c_write(ses); // Write data FOR VOLUME CONTROL
i2c_stop();
// SOL KANAL SES AYARI
i2c_start();
i2c_write(0x34); // reciver register adress
//delay for ack in the slave device
i2c_write(0x04); // Register Address - reciver for left channel
i2c_write(ses); // Write data FOR VOLUME CONTROL
i2c_stop();
ekran();
sayac=0;
}
}
}
}
arkadaşlar yardımcı olabilecek kimse yok mu acaba...
Orda besleme 3.3V , pic i de 3.3V de çalıştıracaksın yada level converter kullanacaksın, 3.3 te çalıştırıyorsan düzgün çalıştığına emin ol , devredeki tanımlar, bağlantılar pullup dirençler.Bunun dışında bir sıkıntı görünmüyor gibi zaten ds de var start-34-4-level-stop şeklinde , ds de i2c modu spi modu için şemada bir takım ayarlar varmıdır yada bu komutları göndermeden önce farklı bir takım komutlar göndermen gerekiyor mu ds yi iyice okuyacaksın.
Atmel in kütüphanesi var umarım yardımcı olur
wm8731.h
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
//------------------------------------------------------------------------------
/// \unit
///
/// !!!Purpose
///
/// Definition of methods for WM8731 driver.
///
/// !!!Usage
///
/// -# WM8731_Read
/// -# WM8731_Write
/// -# WM8731_DAC_Init
//------------------------------------------------------------------------------
#ifndef WM8731_H
#define WM8731_H
#include "board.h"
#include "twi/twid.h"
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
#define WM8731_CSB_STATE (0x0 << 0)
/// Slave address
//#define WM8731_SLAVE_ADDRESS 0x1a | WM8731_CSB_STATE
#define WM8731_SLAVE_ADDRESS 0x1b
/// Reset register
#define WM8731_REG_RESET 0x0F
/// Left Line in register
#define WM8731_REG_LEFT_lINEIN 0x0
/// Left line input volume control
#define WM8731_LINVOL_BITS (0x1f << 0)
/// Left line input mute to ADC
#define WM8731_LINMUTE_BIT (0x1 << 7)
/// Left to right channel line input volume and mute data load control
#define WM8731_LRINBOTH_BIT (0x0 << 8)
/// Right Line in register
#define WM8731_REG_RIGHT_lINEIN 0x1
/// Right line input volume control
#define WM8731_RINVOL_BITS (0x1f << 0)
/// Right line input mute to ADC
#define WM8731_RINMUTE_BIT (0x1 << 7)
/// Right to right channel line input volume and mute data load control
#define WM8731_RLINBOTH_BIT (0x0 << 8)
/// Left Headphone out register
#define WM8731_REG_LEFT_HPOUT 0x2
/// Left chnnel headphone output volume control
#define WM8731_LHPVOL_BITS (0x7f << 0)
/// Left channel zero cross detect enable
#define WM8731_LZCEN_BIT (0x1 << 7)
/// Left to right channel headphone volume, mute and zero cross data load control
#define WM8731_LRHPBOTH_BIT (0x1 << 8)
/// Right Headphone out register
#define WM8731_REG_RIGHT_HPOUT 0x3
/// Right chnnel headphone output volume control
#define WM8731_RHPVOL_BITS (0x7f << 0)
/// Right channel zero cross detect enable
#define WM8731_RZCEN_BIT (0x1 << 7)
/// Right to right channel headphone volume, mute and zero cross data load control
#define WM8731_RLHPBOTH_BIT (0x1 << 8)
/// Analogue audio path control register
#define WM8731_REG_ANALOGUE_PATH_CTRL 0x4
/// Digital audio path control register
#define WM8731_REG_DIGITAL_PATH_CTRL 0x5
/// Power down control register
#define WM8731_REG_PWDOWN_CTRL 0x6
/// LineIn power down
#define WM8731_LINEINPD_BIT (0x1 << 0)
#define WM8731_ENABLE_LINEINPD (0x1 << 0)
#define WM8731_DISABLE_LINEINPD (0x0 << 0)
/// Mic power down
#define WM8731_MICPD_BIT (0x1 << 1)
#define WM8731_ENABLE_MICPD (0x1 << 1)
#define WM8731_DISABLE_MICPD (0x0 << 1)
/// ADC power down
#define WM8731_ADCPD_BIT (0x1 << 2)
#define WM8731_ENABLE_ADCPD (0x1 << 2)
#define WM8731_DISABLE_ADCPD (0x0 << 2)
/// DAC power down
#define WM8731_DACPD_BIT (0x1 << 3)
#define WM8731_ENABLE_DACPD (0x1 << 3)
#define WM8731_DISABLE_DACPD (0x0 << 3)
/// OUT power down
#define WM8731_OUTPD_BIT (0x1 << 4)
#define WM8731_ENABLE_OUTPD (0x1 << 4)
#define WM8731_DISABLE_OUTPD (0x0 << 4)
/// OSC power down
#define WM8731_OSCBIT (0x1 << 5)
#define WM8731_ENABLE_OSCPD (0x1 << 5)
#define WM8731_DISABLE_OSCPD (0x0 << 5)
/// CLKOUT powerdown
#define WM8731_CLKOUTPD_BIT (0x1 << 6)
#define WM8731_ENABLE_CLKOUTPD (0x1 << 6)
#define WM8731_DISABLE_CLKOUTPD (0x0 << 6)
/// Power off device
#define WM8731_POWEROFF_BIT (0x1 << 7)
#define WM8731_DEV_POWER_OFF (0x1 << 7)
#define WM8731_DEV_POWER_ON (0x0 << 7)
/// Interface format register
#define WM8731_REG_DA_INTERFACE_FORMAT 0x7
/// Format
#define WM8731_FORMAT_BITS (0x3 << 0)
#define WM8731_FORMAT_MSB_LEFT_JUSTIFIED (0x0 << 0)
#define WM8731_FORMAT_MSB_RIGHT_JUSTIFIED (0x1 << 0)
#define WM8731_FORMAT_I2S (0x2 << 0)
#define WM8731_FORMAT_DSP (0x3 << 0)
/// Input audio data bit length select
#define WM8731_IWL_BITS (0x3 << 2)
#define WM8731_IWL_16_BIT (0x0 << 2)
#define WM8731_IWL_20_BIT (0x1 << 2)
#define WM8731_IWL_24_BIT (0x2 << 2)
#define WM8731_IWL_32_BIT (0x3 << 2)
/// DACLRC phase control
#define WM8731_IRP_BITS (0x1 << 4)
/// DAC Left right clock swap
#define WM8731_IRSWAP_BIT (0x1 << 5)
/// Master slave mode control
#define WM8731_MS_BIT (0x1 << 6)
#define WM8731_ENABLE_MASTER_MODE (0x1 << 6)
#define WM8731_ENABLE_SLAVE_MODE (0x0 << 6)
/// Bit clock invert
#define WM8731_BCLKINV_BIT (0x1 << 7)
/// Sampling control
#define WM8731_REG_SAMPLECTRL 0x8
/// Mode select, usb mode, normal mode
#define WM8731_USBNORMAL_BIT (0x1 << 0)
#define WM8731_NORMAL_MODE (0x1 << 0)
#define WM8731_USB_MODE (0x1 << 1)
/// Base over-sampling rate
#define WM8731_BOSR_BIT (0x1 << 1)
#define WM8731_USB_250FS (0x0 << 1)
#define WM8731_USB_272FS (0x1 << 1)
#define WM8731_NORMAL_256FS (0x0 << 1)
#define WM8731_NORMAL_128_192_384_FS (0x1 << 1)
/// Sample rate control
#define WM8731_SR_BITS (0xf << 2)
///
#define WM8731_CLKIDIV2_BIT (0x1 << 6)
///
#define WM8731_CLKODIV2_BIT (0x1 << 7)
/// Active control register
#define WM8731_REG_ACTIVE_CTRL 0x9
/// Activate interface
#define WM8731_ACTIVE_BIT (0x1 << 0)
#define WM8731_ACTIVE_INTERFACE_ACTIVE (0x1 << 1)
#define WM8731_ACTIVE_INTERFACE_INACTIVE (0x0 << 1)
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern unsigned short WM8731_Read(Twid *pTwid,
unsigned int device,
unsigned int register);
extern void WM8731_Write(Twid *pTwid,
unsigned int device,
unsigned int register,
unsigned short data);
extern unsigned char WM8731_DAC_Init(Twid *pTwid,
unsigned int device);
#endif // WM8731_H
wm8731.c
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
//------------------------------------------------------------------------------
/// \unit
///
/// !Purpose
///
/// WM8731 driver
///
/// !Usage
///
/// Explanation on the usage of the code made available through the header file.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "wm8731.h"
#include <board.h>
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Internal functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Read data from WM8731 Register.
/// \param pTwid pointer to twi driver structure
/// \param device twi slave address
/// \param regAddr register address to read.
//------------------------------------------------------------------------------
unsigned short WM8731_Read(Twid *pTwid,
unsigned int device,
unsigned int regAddr)
{
unsigned short bitsDataRegister;
unsigned char Tdata[2]={0,0};
TWID_Read(pTwid, device, regAddr, 0, Tdata, 2, 0);
bitsDataRegister = (Tdata[0] << 8) | Tdata[1];
return bitsDataRegister;
}
//------------------------------------------------------------------------------
/// Write data to WM8731 Register.
/// \param pTwid pointer to twi driver structure
/// \param device twi slave address
/// \param regAddr register address to read.
/// \param data data to write
//------------------------------------------------------------------------------
void WM8731_Write(Twid *pTwid,
unsigned int device,
unsigned int regAddr,
unsigned short data)
{
unsigned char tmpData[2];
unsigned short tmp;
tmp = ((regAddr & 0x7f) << 9) | (data & 0x1ff);
tmpData[0] = (tmp & 0xff00) >> 8;
tmpData[1] = tmp & 0xff;
TWID_Write(pTwid, device, regAddr, 0, tmpData, 2, 0);
}
//------------------------------------------------------------------------------
/// Init WM8731 to DAC mode.
/// \param pTwid pointer to twi driver structure
/// \param device twi slave address
//------------------------------------------------------------------------------
unsigned char WM8731_DAC_Init(Twid *pTwid,
unsigned int device)
{
// reset
WM8731_Write(pTwid, device, WM8731_REG_RESET, 0);
// analogue audio path control
WM8731_Write(pTwid, device, WM8731_REG_ANALOGUE_PATH_CTRL, 0x12);
// digital audio path control
WM8731_Write(pTwid, device, WM8731_REG_DIGITAL_PATH_CTRL, 0x00);
// power down control
WM8731_Write(pTwid, device, WM8731_REG_PWDOWN_CTRL, 0x7);
// Active control
WM8731_Write(pTwid, device, WM8731_REG_ACTIVE_CTRL, 0x01);
return 0;
}
atmel ile ilgili hiç bilgim yok ama bir yinede dosyaları inceleyeceğim...
Hocam öncelikle cevap için Teşekkürler...
Alıntı yapılan: Ersin - 22 Şubat 2013, 11:31:52
Orda besleme 3.3V , pic i de 3.3V de çalıştıracaksın yada level converter kullanacaksın, 3.3 te çalıştırıyorsan düzgün çalıştığına emin ol , devredeki tanımlar, bağlantılar pullup dirençler.Bunun dışında bir sıkıntı görünmüyor gibi zaten ds de var start-34-4-level-stop şeklinde , ds de i2c modu spi modu için şemada bir takım ayarlar varmıdır yada bu komutları göndermeden önce farklı bir takım komutlar göndermen gerekiyor mu ds yi iyice okuyacaksın.
hocam malumunuz datasheetler ingilizce ve maalesef ingilizcem çok iyi değil, bu nedenle çarpık bir ingilizceyle çevirdim ama ne kadar eksik onu bilmiyorum. yani hocam pic ile entegrenin beslemesi aynı hat üzerinde aralarında herhangi bir gerilim farklılığı yok. sadece çizimlerde farklı görünüyor olabilir ama devre olarak aynı hat üzerinde. aynı kaynaktan besleniyorlar ki bu besleme 3V ile 4.5V arasında bir gerilim..
açıkca söylemek gerekirse bir sürü register bilgisi vardı WM8731l entegresinin datasheetinde ama ses ayarı yapmam için neleri nasıl yapmam gerektiği ile ilgili düzenli bir bilgi bulamadım.( ya da anlayamadım.).
atmelin dosylarını direk ccs de kullanabilirmiyiz. yada kullanmak için nasıl biryol izlemeliyim...
Alıntı Yapaynı kaynaktan besleniyorlar ki bu besleme 3V ile 4.5V arasında bir gerilim
Datasheete beslemeyi 2.7-3.6V arası yazıyor, sen buna nasıl 4.5V besleme veriyorsun.
Alıntı yapılan: Ersin - 23 Şubat 2013, 15:44:07
Datasheete beslemeyi 2.7-3.6V arası yazıyor, sen buna nasıl 4.5V besleme veriyorsun.
hocam batarya üzerinden besleniyor bataryanın max şarj gberilimi 4.2V. zaten sabit 4.5V demedim hocam. 3V ile 4.5V arası değişen bir gerilim dedim.
ayrıca hocam uyarınız için teşekkürler.
peki hocam farklı çözümleriniz varmı yaşadığım problemlerle ilgili....