|
|
View previous topic :: View next topic |
Author |
Message |
Secersh
Joined: 19 Oct 2009 Posts: 8 Location: Serbia, Belgrade
|
TDA7314 audio processor i2c help |
Posted: Sun Dec 26, 2010 5:56 am |
|
|
Hi, i used TDA7314 and PIC16F876a width encoder and 4*20 char LCD as volume/tone control for my amp, and am having trouble width TDA(http://www.datasheetcatalog.org/datasheet/stmicroelectronics/1487.pdf), i think that the problem is i2c, here is the code...thanks in advance...
Code: | #include "C:\Documents and Settings\Cersik\My Documents\Amp\Amp.h"
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#include <lcd420.c>
#use I2C(master,slow,sda=PIN_C4,scl=PIN_C3)
signed value1=30;
signed value2=7;
signed value3=7;
int newencoder;
int lastencoder;
signed vol=-63;
signed bastre[15]={-14,-12,-10,-8,-6,-4,-2,0,2,4,6,8,10,12,14};
int bas[15]={96,97,98,99,100,101,102,103,110,109,108,107,106,105,104};
int tre[15]={112,113,114,115,116,117,118,119,126,125,124,123,122,121,120};
int sel=0;
int pos1=8;
int i;
void lcd_load_custom_chars(void);
void main()
{
lcd_init();
lcd_load_custom_chars();
printf(lcd_putc "\f\n Welcome\003");
delay_ms(2000);
while(1){
printf(lcd_putc "\f");
lcd_gotoxy(1,1);
for(i=0;i<20;i++){
lcd_putc(0);}
printf(lcd_putc "\n Volume %ddb",vol);
printf(lcd_putc "\n Bass %ddb",bastre[value2]);
printf(lcd_putc "\n Treble %ddb",bastre[value3]);
delay_ms(150);
if(input(pin_c5)==0){
sel++;
if(sel>2)
sel=0;}
if(sel==0){
lcd_gotoxy(1,2);
lcd_putc(2);
lcd_gotoxy(1,1);
pos1=(63-value1)/3;
if(pos1>19)
pos1=20;
for(i=0;i<pos1;i++){
lcd_putc(1);}
newencoder = (input_c() & 0b00000110);
if(newencoder != lastencoder){
if (bit_test(newencoder,2) == bit_test(lastencoder,1))
value1++; else value1--;
lastencoder = newencoder;
delay_ms(25);}
if(value1<0)
value1=0;
if(value1>63)
value1=63;
vol=-(value1);
}
if(sel==1){
lcd_gotoxy(1,3);
lcd_putc(2);
pos1=value2+3;
lcd_gotoxy(pos1,1);
lcd_putc(1);
lcd_putc(1);
newencoder = (input_c() & 0b00000110);
if(newencoder != lastencoder){
if (bit_test(newencoder,2) == bit_test(lastencoder,1))
value2++; else value2--;
lastencoder = newencoder;
delay_ms(25);}
if(value2<0)
value2=0;
if(value2>14)
value2=14;
}
if(sel==2){
lcd_gotoxy(1,4);
lcd_putc(2);
pos1=value3+3;
lcd_gotoxy(pos1,1);
lcd_putc(1);
lcd_putc(1);
newencoder = (input_c() & 0b00000110);
if(newencoder != lastencoder){
if (bit_test(newencoder,2) == bit_test(lastencoder,1))
value3++; else value3--;
lastencoder = newencoder;
delay_ms(25);}
if(value3<0)
value3=0;
if(value3>14)
value3=14;
}
delay_ms(500);
i2c_start();
i2c_write(0x88);
i2c_write(value1);
i2c_write(bas[value2]);
i2c_write(tre[value3]);
i2c_stop();
delay_ms(10);}
}
const int8 lcd_custom_chars[] ={159,128,128,128,128,128,128,159,159,128,159,159,159,159,128,159,132,134,133,133,132,132,156,156,131,141,139,141,137,139,155,152};
void lcd_load_custom_chars(void)
{
int8 i;
// Set address counter pointing to CGRAM address 0.
lcd_send_byte(0, 0x40);
// Load custom lcd character data into CGRAM.
// It can only hold a maximum of 8 custom characters.
for(i = 0; i < sizeof(lcd_custom_chars); i++)
{
lcd_send_byte(1, lcd_custom_chars[i]);
}
// Set address counter pointing back to the DDRAM.
lcd_send_byte(0, 0x80);
} |
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sun Dec 26, 2010 6:16 am |
|
|
hardware ?
do you have the correct pullup resistors on the I2C bus?
do you have the device on the correct pins(and not reversed !)?
software ?
you seem to have a lot of IF statements 'in a row'
Any chance you're skipping over the I2C code section due to a wrongly construced IF -Else section ? I try to indent every nested IF... to better show the 'flow' of the code.
Have you tried a small I2C function just to write and read the I2C device without the encoder code? |
|
|
Secersh
Joined: 19 Oct 2009 Posts: 8 Location: Serbia, Belgrade
|
|
Posted: Sun Dec 26, 2010 6:26 am |
|
|
Solved it, i just wrote all 8 data bytes instead of 3 to the TDA...thanks for reply... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sun Dec 26, 2010 7:07 am |
|
|
Yup, I read the data sheet and while it doesn't SAY that all 8 bytes have to be sent....the 'data train' of start...address..data...stop bits would INDICATE that all 8 need to be sent..
So you'll have to send all 8 bytes, even though you might just want to increase the bass.
Happy you got it to work,looks like a nice project ! |
|
|
Secersh
Joined: 19 Oct 2009 Posts: 8 Location: Serbia, Belgrade
|
|
Posted: Sun Dec 26, 2010 8:29 am |
|
|
I hope it will be done by tomorrow, maybe some pics... |
|
|
jruibarroso
Joined: 07 Jan 2006 Posts: 64 Location: Braga
|
|
Posted: Wed May 18, 2011 2:49 am |
|
|
can you post your corrected code ? |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|