Ontwerp van een Digital Audio Controlled Amplifier (project)

Hallo iedereen,

Om de veiligheid had ik geen idee waar ik die zou plaatsen mijn onderwerp. Het handelt over deels hardwware ontwerp en microcontroller gebaseerd ontwerp vandaar denk bij schoolvragen is beste.

Wat is nu mijn probleem:
Ik heb een ontwerp gemaakt waarin een IC (TDA7300) moet geprogrammeert worden.

De communicatie voor het sturen van de commando's doe ik samen met een microcontroller. De datacommunicatie van de microcontroller naar de slave (TDA7300) heb ik opgelost met I2C.

Er is ook een mogelijkheid voorzien om de informatie naar de UART te sturen en zo naar mijn laptop waar ik een programma moet zien te draaien die al mijn functies (bass, treble, volume...) kunnen regelen en dit wederzijds (dus van de UART naar µC en omgekeerd).

Wat ik reeds heb:
=================

Het volledige hardware ontwerp, PCB, en gans de schakeling op de print natuurlijk deze doet nu niks want hij staat in mute mode als er geen communicatie is via software.

Ik heb reeds een stukje software geschreven voor het besturen van mijn volume en bass regeling.

Ik maak gebruik van MikroC en stukjes assembler als het nodig blijkt

De volgende functies moeten worden geprogrammeert:

- VOLUME
- SPEAKER ATTENNUATORS
- AUDIO SWITCH
- BASS & TREBLE

Welke problemen heb ik nu
=========================

1) Ik wil graag mijn decimale waarde omzetten naar een hex code.
Hoe kan ik dat maken in een functie?
Misschien is er een andere aanpak om het beter op te lossen
denk aan binaire code zoals deze in de datasheets staat.
Mijn code staat nu in testfase.

2) Kan ik dezelfde werkwijze toepassen voor de andere functies?

3) In welke taal kan ik het best mijn frontend schrijven aan de
laptopzijde want moet ook RS232 ondersteunen ?
Ik ken de volgende talen : VB.NET, C#, Java, C++ MFC

4) Programmeer ik deze functies zowel in mijn microcontroller als in
het frontend programma? Welke mogelijkheden heb ik?

5) Als er andere ideeen zijn misschien met interrupts dan is het
welkom

In bijlage mijn testcode:
-------------------------



// Globale variabelen
int uart_rd;
int data;

void main()
{
     ANSEL  = 0;                     // Configuratie AN pinnen als digitaal
     ANSELH = 0;
     C1ON_bit = 0;                   // Comparatoren afleggen comparators
     C2ON_bit = 0;

     PORTB = 0;
     TRISB = 0;                      // Configureer PORTB als output    I2C

     I2C1_Init(100000);              // Initialisatie I2C communicatie


  UART1_Init(9600);                  // Initialisatie van UART module op 9600
  Delay_ms(100);                     // Even wachten op de module
  while (1)
  {                                  // continu uitvoeren oneindige lus
    if (UART1_Data_Ready())
    {                                // Als de module data ontvangen heeft
      uart_rd = UART1_Read();        //   lees dan deze data en zet in uart_rd
     // UART1_Write(uart_rd);        //   zend de data eens terug (ter controle)
    }

    // =================================================================
    // uart_rd opsplitsen
    // 1 - 101  => volume regeling
    // 199 - 301  => bass regeling
    // 399 - 401  => een andere regeling
    // =================================================================

    if(1 < uart_rd < 101)
    {
                                     //data = uart_rd;
                                     // formule om van 1-101 naar een hex waarde te gaan
                                     // om deze dan te verzenden via I2C

       I2C1_Start();                 // maak een start conditie  I2C
       I2C1_Wr(0x0A);                // klok data binnen in de TDA  0x0A vervangen door DATA!!!!
       I2C1_Stop();                  // maak een stop conditie I2C

       Delay_100ms();                // even wachten

    }  // einde regeling Volume

    if(199 < uart_rd < 301)
    {

                                     // data = uart_rd;
                                     // formule om van 1-101 naar een hex waarde te gaan
                                     // om deze dan te verzenden via I2C
       I2C1_Start();                 // maak een start conditie  I2C
       I2C1_Wr(0x0A);                // klok data binnen in de TDA 0x0A vervangen door DATA!!!!
       I2C1_Stop();                  // maak een stop conditie I2C

       Delay_100ms();                // even wachten


    } // einde regeling Bass
   }
}

   /*I2C1_Start();           // issue I2C start signal
  I2C1_Wr(0xA2);          // send byte via I2C  (device address + W)
  I2C1_Wr(2);             // send byte (data address)
  I2C1_Repeated_Start();  // issue I2C signal repeated start
  I2C1_Wr(0xA3);          // send byte (device address + R)
  PORTB = I2C1_Rd(0u);    // Read the data (NO acknowledge)
  I2C1_Stop();            // issue I2C stop signal*/




}

Met veel belangstelling kijk ik uit naar de mogelijkheden en de ideeen en aanwijzingen van jullie

Bedankt alvast

Ik wil graag mijn decimale waarde omzetten naar een hex code.

Het getal 123 weergeven als "7B", dus? Dat kan zo:


void d2hex(unsigned char d, char *ptr)
{
    unsigned char nibble;

    nibble = (d & 0xF0) >> 4;	// hoogste nibble
    if (nibble < 10) {
	*ptr = nibble + '0';	// 0 ... 9
    } else {
	*ptr = nibble + 55;	// A ... F
    }
    ptr++;			// Pointer opschuiven
    nibble = d & 0x0F;		// Laagste nibble
    if (nibble < 10) {
	*ptr = nibble + '0';
    } else {
	*ptr = nibble + 55;
    }
}

Je geeft daarbij het getal op als eerste argument, en de plaats waar het resultaat moet komen (een string) als 2e argument.

Op 12 augustus 2009 10:37:05 schreef mcu_boytje:
Om de veiligheid had ik geen idee waar ik die zou plaatsen mijn onderwerp. Het handelt over deels hardwware ontwerp en microcontroller gebaseerd ontwerp vandaar denk bij schoolvragen is beste.

Of ontwikkeling, als het geen schoolopdracht (eindwerk, stage etc) is.

En kijk even naar de code-tag: http://www.circuitsonline.net/forum/faq/2