Car stereo control using TDA7419 for input select, audio control. Adafruit 96x64 monochrome 0.96" display to show the audio selections four buttons to control selections. Next steps: take input from the car steering wheel controls!
Dependencies: Adafruit_GFX PinDetect_KL25Z PreampTDA7419 mbed
Diff: main.cpp
- Revision:
- 3:8d3cc3488cd8
- Parent:
- 2:2b0cf4d80668
- Child:
- 4:46da1eff72bf
--- a/main.cpp Sun Oct 19 04:30:40 2014 +0000 +++ b/main.cpp Mon Oct 20 05:55:05 2014 +0000 @@ -3,6 +3,9 @@ #include "Adafruit_SSD1306.h" #include "PreampTDA7419.h" +#define NUM_OPTIONS 12 // how many different options does the stereo have? +char option; + PinDetect PinUp ( PTA1 ); PinDetect PinLeft ( PTD4 ); PinDetect PinRight ( PTA2 ); @@ -45,192 +48,6 @@ display.display(); } -//////////////////////////////////// -// register addresses for TDA7419 // -//////////////////////////////////// -char s_main_source = 0; -char s_main_loud = 1 | 0x40; -char s_softmute = 2 | 0x40; -char s_volume = 3 | 0x40; -char s_treble = 4 | 0x40; -char s_middle = 5 | 0x40; -char s_bass = 6 | 0x40; -char s_second_source = 7 | 0x40; -char s_sub_mid_bass = 8 | 0x40; -char s_mix_gain = 9 | 0x40; -char s_atten_lf = 10 | 0x40; -char s_atten_rf = 11 | 0x40; -char s_atten_lr = 12 | 0x40; -char s_atten_rr = 13 | 0x40; -char s_atten_mix = 14 | 0x40; -char s_atten_sub = 15 | 0x40; -char s_spectrum = 16 | 0x40; -char s_test = 17 | 0x40; - -#define NUM_OPTIONS 12 // how many different options can be selected by the display? -char option = NUM_OPTIONS; // selectOption() in setup to - // set this to 0 and set up display -char volume = 4; -char input = 1; - -char mute = 0; -char mix = 0; - -// for register 4 Treble Filter -int referenceInE = 0; -int trebleCenterFreq = 0; -int treble; - -// for middle frequecy filter -int middleSoftStep = 0; -int middleQ = 0; -int middle = 0; - -// for bass frequecy filter -int bassSoftStep = 0; -int bassQ = 0; -int bass = 0; - -// for output attenuators -char atten_lf = 8; -char atten_rf = 8; -char atten_lr = 8; -char atten_rr = 8; -char atten_mix = 8; -char atten_sub = 10; - - -void writeToTDA7419 (char address, char value) { - if (!Preamp.i2c_write(address, value)) { - //displayWrite("Trans Failed", 0); - } -} - -///////////////////////////////// -// set the speaker attenuators // -///////////////////////////////// -// attenuation can be set from 0 to 11 and this is mapped to the -// values that the TDA7419 uses for it's attenuation (0->h60) - -// -// (FL/FR/RL/RR/SWL/SWR) (13-18) -void TDA7419SetAttenuation(int address, int attenuation) { - char regAtten; - if (volume == 11) { - regAtten = 13; - } else if (attenuation == 10) { - regAtten = 6; - } else { - regAtten = (99-(attenuation*9)); - } - writeToTDA7419(address, regAtten); -} - -// update all of the registers in the TDA7419 -void updateReg() { - char regVolume; - char regTreble; - char regMiddle; - char regBass; - - ////////////////////////////////////////////////////////////////// - // Calculate actual register values from the variables that the // - // buttons control // - ////////////////////////////////////////////////////////////////// - - // set the master volume // - // need to calculate the regVolume from the global volume signal - // volume can be set from 0 to 11 and this is mapped to the - // values that the TDA7419 uses for it's volume register - // which are a little odd (11 is appropriate because 0->15 register - // values actually specify a gain, 16->96 specify attenuation) - if (volume == 11) { - regVolume = 13; - } else if (volume == 10) { - regVolume = 6; - } else { - regVolume = (99-(volume*9)); - } - - // set the tone controls // - // Expect treble to have the values -5 to +5 // - // Expect trebleCenterFreq to be 0 to 3 // - // Expect referenceInE to be 0 or 1 // - // we define treble as -5 to +5 the TDA7419 register value is more complex - if (treble > 0) { - regTreble = 16 + (treble * 3); - } else if (treble == 0) { - regTreble = 0; - } else if (treble < 0) { - regTreble = 0 - (treble * 3); - } - - if (middle > 0) { - regMiddle = 16 + (middle * 3); - } else if (middle == 0) { - regMiddle = 0; - } else if (middle < 0) { - regMiddle = 0 - (middle * 3); - } - - if (bass > 0) { - regBass = 16 + (bass * 3); - } else if (bass == 0) { - regBass = 0; - } else if (bass < 0) { - regBass = 0 - (bass * 3); - } - - ////////////////////////// - // update the registers // - ////////////////////////// - writeToTDA7419(s_main_source, ((0x78) | (input & 0x3) )); - writeToTDA7419(s_main_loud, (0xc0)); - writeToTDA7419(s_softmute, (0xa7)); - TDA7419SetAttenuation(s_volume, regVolume ); - - writeToTDA7419(s_treble, - ( (referenceInE & 0x1 ) << 7 ) | - ( (trebleCenterFreq & 0x3 ) << 5 ) | - ( (regTreble & 0x1f ) ) ); - - writeToTDA7419(s_middle, - ( (middleSoftStep & 0x1 ) << 7 ) | - ( (middleQ & 0x3 ) << 5 ) | - ( (regMiddle & 0x1f ) ) ); - - writeToTDA7419(s_bass, - ( (bassSoftStep & 0x1 ) << 7 ) | - ( (bassQ & 0x3 ) << 5 ) | - ( (regBass & 0x1f ) ) ); - - // this register allows the second source to be routed to the rear speakers - // not useful in the context of this project - writeToTDA7419(s_second_source, (0x07)); - - // this is the subwoofer cut-off frequency - // 11 which is 160Khz) - writeToTDA7419(s_sub_mid_bass, (0x63)); - - // mix to the front speakers, enable the sub, no gain - if (mix == 1) { - writeToTDA7419(s_mix_gain, (0xf7)); - } else { - writeToTDA7419(s_mix_gain, (0xf0)); - } - - TDA7419SetAttenuation(s_atten_lf, atten_lf ); - TDA7419SetAttenuation(s_atten_rf, atten_rf ); - TDA7419SetAttenuation(s_atten_lr, atten_lr ); - TDA7419SetAttenuation(s_atten_rr, atten_rr ); - - TDA7419SetAttenuation(s_atten_mix, atten_mix ); - TDA7419SetAttenuation(s_atten_sub, atten_sub ); - - writeToTDA7419 (s_spectrum, (0x09)); - -} - ///////////////////////////////////////////// // Helper functions for the serial display // ///////////////////////////////////////////// @@ -255,44 +72,40 @@ switch (option) { case (0): // if volume option is selected change volume when button 1 and 2 are pressed if (button == 2) { - if (volume > 0 ) { - volume--; - } + Preamp.decreaseVolume(); } if (button == 3) { - if (volume < 11) { - volume++; - } + Preamp.increaseVolume(); } - displayWrite("Volume", volume ); + displayWrite("Volume", Preamp.readVolume() ); break; case (1): // manage the input - 1,2,3 are the standard single ended inputs + int input = Preamp.readInput(); if (button == 2) { - if (input > 1) { - input--; - } + input--; } if (button == 3) { - if (input < 3) { - input++; - } + input++; } - displayWrite("Input", input ); + Preamp.setInput(input); + displayWrite("Input", Preamp.readInput() ); break; case (2): // manage the treble value if (button == 2) { - if (treble > -5) { - treble--; - } + Preamp.decreaseTreble(); } if (button == 3) { - if (treble < 5) { - treble++; - } + Preamp.increaseTreble(); } - displayWrite("Treble", treble ); + displayWrite("Treble", Preamp.readTreble()); break; case (3): // manage the middle value + displayWrite("Middle", 42); + break; + } +} +/* + case (3): // manage the middle value if (button == 2) { if (middle > -5) { middle--; @@ -409,8 +222,8 @@ break; } - updateReg(); // update the TDA7419 registers to reflect any values changed above } +*/ void UpPressed( void ) { @@ -458,15 +271,16 @@ // then pass the period in microseconds for example, for 10ms :- // pin.setSampleFrequency( 10000 ); // - PinUp .setSampleFrequency(); // Defaults to 20ms. - PinLeft .setSampleFrequency(); // Defaults to 20ms. - PinRight.setSampleFrequency(); // Defaults to 20ms. - PinDown .setSampleFrequency(); // Defaults to 20ms. + PinUp .setSampleFrequency(10000); // Defaults to 20ms. + PinLeft .setSampleFrequency(10000); // Defaults to 20ms. + PinRight.setSampleFrequency(10000); // Defaults to 20ms. + PinDown .setSampleFrequency(10000); // Defaults to 20ms. + // option = NUM_OPTIONS; processButtonPress(0); while (1) { - wait(1); + wait(0.2); } }