Hallo iedereen

Ik moet voor mijn project een TDA7300 aansturen met I2C maar hoe moet je dat doen en waar vind ik ergens daarvoor routines maar dan liefst is assembler geschreven?
De manual legt alles goed uit hoe je dat moet doen en hebben er ook theorie over gehad nu moeten we het kunnen zo'n een IC aansturen met I2C

Ik moet de volgende functies doen:

- Start Communicatie
- TransmitByte
- Acknowledge
- Stop Communicatie
- ReceiveByte
- SendAddress

dat zijn zowat de functies zijn er denk ik nog

Waar is dat te vinden en is daarvoor een DLL ndoig want ik wil via de user GUI interface via de parallel port de TDA7300 aansturen met I2C

Update : duidelijker wat mijn bedoeling is
==========================================

Beste elektronici, programmeurs

Ik moet als project een digitale versterker maken en we mogen kiezen welk IC we mogen programmeren en de keuze is gevallen op een TDA 7300 IC en relatief goedkoop en alles zit erop en eraan en je hebt de mogelijkheid dit IC in I2C te programmeren.

Het doel is dat ik via mijn computer op grafische manier door middel van een GUI de volgende instellingen kan wijzigen:

- Wijzigen van het volume in stapjes
- Wijzigen van de tonen in stapjes, zowel de lage, hoge en middentonen
- Ik gebruik C++ Builder om te programmeren
- Ga programmeren via de serieele of parallele poort

Wat het probleem is, weet dat de PC de master is en dit IC de slave maar wat moet ik gaan lezen en wat moet ik gaan schrijven van de PC naar het IC want ik moet kunnen met de controls de parameters kunnen veranderen (volume, tonen, balans) en deze signalen moeten dan teruggestuurd worden naar dit IC in de vorm van signalen.

In de manual van de TDA7300 (website : http://www.alldatasheet.net/view.jsp?Searchword=TDA7300)

Ik heb de volgende gegevens:

S 1 0 0 0 1 0 0 0 ACK DATA ACK DATA ACK P

S : START
1 0 0 0 1 0 0 0 : TDA7300 address das toch enkel lezen he
DATA : Je hebt dan voor al deze rubrieken bitcombinaties de vraag is moet ik die bytes gaan lezen of schrijven van mijn GUI naar de TDA7300 want dat begrijp ik niet al te goed.

Ik heb dus DATA BYTES voor :

1) Volume Control : MSB 00 en dan kan je kiezen:

--> Gebruik per 2 dB stappen

2) Bass Control : MSB 0 1 1 0 en dan kan je weer kiezen:
Treble Control : MSB 0 1 1 1

Wil graag dat hier iemand eens een voorbeeld toont hoe je dat moet gaan programmeren want makkelijk is dat niet

Met vriendelijke groeten

[Bericht gewijzigd door ElectronicsVibes op ]

Niet zo verstandig van een parallelpoort te gebruiken voor experimenten.
Gebruik de COM, die is kortsluitbestendig. Je kan hier eens wat info opdoen:

http://www.elektuur.nl/Default.aspx?tabid=28&year=-1&month=-1&…

google eens op i2c faq.
alles wat je nodig hebt staat erin

en voor de printerpoort te sturne gebruik je de driver van logix4u

Op 31 maart 2007 22:41:19 schreef Evarist:
Niet zo verstandig van een parallelpoort te gebruiken voor experimenten.
Gebruik de COM, die is kortsluitbestendig. Je kan hier eens wat info opdoen:

vergeet dat maar !

trouwens de spanningsniveaus zijn anders en echt bitbangen kan je die poort niet

Op 1 april 2007 01:22:29 schreef free_electron:
[...]

vergeet dat maar !

trouwens de spanningsniveaus zijn anders en echt bitbangen kan je die poort niet

Niet eens. Alles werkt bij mij langs de COM. Ook I2C communicatie.
Als TS dat wil kan ik hem de *.dll mailen.

Hallo

Kan je mij die DLL emailen met het include bestand en hoe ik dit moet programmeren dat IC de TDA7300 in I2C ?

Wil het programmeren in C++ Builder

Op 1 april 2007 12:21:21 schreef Evarist:
[...]

Niet eens. Alles werkt bij mij langs de COM. Ook I2C communicatie.
Als TS dat wil kan ik hem de *.dll mailen.

en wat doe je met de spanningsniveau's ?

je kan wat prullen met de dtr en cts lijn maar das knoeiwerk. je bent beter af met de printerpoort.

zeg , je hebt nu al 3 posts over hetzelfde.

nog eens : ga die i2c faq gaan halen. der staan volledige broncode in voor een i2c interface layer.

Waar vind ik dat op internet land die i2c faq?

Die *.dll die je zocht kan je downloaden in de link die ik aangaf. Is die niet goed genoeg?

Edit// Speciaal voor jou opgezocht:
http://www.elomax.nl/site/usb/i2csolution.html
http://realterm.sourceforge.net/
http://www.devasys.com/release.htm
http://www.antratek.nl/MCC.html
http://www.i2ctools.com/products.html#usbtoi2c
http://www.telos.info/products/
http://members.home.nl/bzijlstra/hardware/I2Ctrace/I2Ctrace.htm

Hopende U hiermee van dienst geweest te zijn teken ik
Hoogachtend

[Bericht gewijzigd door Evarist op ]

kan je a.u.b die rechtstreekse link geven want ben geen stap nog verder geraakt?

zeg jongen, in de twee post hierboven staat het vol vcan de links.

ga ergens anders trollen he.

gogo stefke,

Zoals hierboven gezegd, check de links :)

Je zou dit topic beter moven naar schoolopgaven ^^

Idd, dit schiet zo helemaal niet op.

Move /Schoolvragen, want de TS 'moet' iets maar heeft er zelf zo te zien weinig zin in.

Heb de code maar nu problemen met die stomme dll !

Hallo iedereen

Ik wil via een C programma vanuit de serieele port waarvoor ik de port.dll gebruik (versie onder XP) voor het aansturen van een IC die moet worden geprogrammeerd onder I2C protocol.

Ik wil eerst dat het programma werkt met een console applicatie omdat dit toch essentieel is.

Het probleem is nu dat mijn programma in C zowel de static library routines of de routines niet vind van de DLL.

Het compileren werkt zonder de commando's van deze library maar anders werkt het niet.

Men zegt dat je ergens die functies in de library moet zichtbaar maken maar hoe doe je dat in C heb al overal zitten zoeken maar vind het nergens.

Ik heb de volgende code allemaal al geschreven:
Je moet de code zeker niet verbeteren op syntaxfouten tis gewoon hoe krijg ik toegang tot de externe routines van port.dll en de externe C file?



#include <stdio.h>

int main(int argc, char *argv[])
{
  RTS(0);                             // SCL = LAAG
  DTR(0);                             // SDA = LAAG
  RTS(1);                             // SCL = HOOG
  Delayus(10);                        // Delay 10µs
  RTS(0);                             // SCL = LAAG

  return 0;
}

void i2c_init()
{
  // OpenCom(PChar('com2:9600,N,8,1'))
  RTS(1);                             // SCL = HOOG
  DTR(1);                             // SDA = HOOG
}

void i2c_Start()
{
  DTR(0);                            // SDA = LAAG
  RTS(0);                            // SCL = LAAG
}

void i2c_Stop()
{
  RTS(0);                            // SCL = LAAG
  DTR(0);                            // SDA = LAAG
  RTS(1);                            // SCL = HOOG
  DTR(1);                            // SDA = HOOG
}

void i2c_Ack()
{
  RTS(0);                            // SCL = LAAG
  DTR(1);                            // SDA = HOOG
  Delayus(10);                       // Vertragingslus
  RTS(0);                            // SCL = HOOG
}

int i2c_Write(char Word)
{
  char BitWord, teller;

  return(true);

  BitWord = 0x80;
  for(teller = 0; teller < 8; teller++)
  {
    if(Word && BitWord) == BitWord {
       DTR(1)
    }
    else {
      DTR(0);                          // SDA setten
      RTS(1);                          // SCL = HOOG
      Delayus(10);                     // Delay van 10 µs
      RTS(0);                          // SCL = HOOG
      Bitword <<= 2;
    }

    DTR(1);                            // SDA = HOOG
    RTS(1);                            // SCL = HOOG, SDA = Read
    Deleyus(10);                       // Delay van 10 µs
    if(CTS() == 1))
      return(false);

    RTS(0);                            // SCL = HOOG
}

int i2c_Read()
{
  int bitwoord, woord, teller;

  RTS(0);                              // SDA = HOOG
  DTR(1);                              // SCL = LAAG
  bitwoord = 0x80;
  woord = 0x00;

  for(teller = 0; teller < 8; teller++) {
    RTS(1);                            // SCL = HOOG, SDA = Read
    Delayus(10);                       // Delay van 10 µs

    if(CTS() == 1))
      woord += bitwoord;
    RTS(0);                            // SCL = LAAG
    bitwoord <<= 2;
    RTS(0);
  }
  return(woord);                    // SCL = HOOG
}

=================
control_TDA7300.c
=================

#define ADDR_TDA7300 0x88
#define STEREO_1 0x59
#define STEREO_2 0x5A
#define STEREO_3 0x5B
#define STEREO_4 0x5C
#define MONO 0x5D

int main(int argc, char *argv[])
{
// Tabel voor instellen van het volume van de TDA7300
unsigned char volume_tabel = {0x08, 0x09, 0x0A, 0x0B, 0x0C,
0x10, 0x11, 0x12, 0x13, 0x14,
0x18, 0x19, 0x1A, 0x1B, 0x1C,
0x20, 0x21, 0x22, 0x23, 0x24,
0x28};

unsigned char treble_tabel = {0x7F, 0x7E, 0x7D, 0x7C, 0x7B,
0x77, 0x76, 0x75, 0x74, 0x73};

unsigned char bass_table = {0x6F, 0x6E, 0x6D, 0x6C, 0x6B,
0x67, 0x66, 0x65, 0x64, 0x63);

// Initialisatie van de Com Port

RTS(0); // SCL = LAAG
DTR(0); // SDA = LAAG
RTS(1); // SCL = HOOG
Delayus(10); // Delay 10µs
RTS(0); // SCL = LAAG

// Init Port Settings of the RS232
i2c_init("COM3:9600,N,8,1");

// Adres van de TDA schrijven
i2c_Start();

address = i2c_Write(ADDR_TDA7300);
printf("Write TDA7300 Address: %d\n", address);
i2c_Ack();

// Data schrijven voor het volume van 0 dB tot -40 dB
// Data staat opgeslagen in de tabel Volume
for(int i = 0; i < volume_tabel; i++) {
printf("Data Volume schrijven naar TDA7300 %d\n",i2c_Write(volume_tabel);
// Delay inbouwen
};
i2c_Ack();

// Data schrijven voor het treble
// Data staat opgeslagen in de tabel Volume
for(int i = 0; i < treble_tabel ; i++) {
printf("Data Volume schrijven naar TDA7300 %d\n",i2c_Write(volume_tabel);
// Delay inbouwen
};
i2c_Ack();

// Data schrijven voor het bass
// Data staat opgeslagen in de tabel Volume
for(int i = 0; i < bass_table ; i++) {
printf("Data Volume schrijven naar TDA7300 %d\n",i2c_Write(volume_tabel);
// Delay inbouwen
};
i2c_Ack();

// Stoppen van de overdracht van de data
i2c_Stop();
return 0;
}

[CODE]

[CODE]

====================
i2c32.h
====================

#include "port.h"
void i2c_init(char[] *p);
void i2c_Start()
void i2c_Stop()
void i2c_Ack()
int i2c_Write(char Word)
int i2c_Read()

[/CODE]

[CODE]

==============
file : port.h
==============

void DELAYUS(unsigned int delay_time);
int OPENCOM(char[] *p);
void DTR(unsigned short data_word);
void RTS(unsigned short data_word);
void TXD(unsigned short data_word);
int CTS ( );
int DSR ( );
int RI ( );
int DCD ( );
void CLOSECOM( );

[/CODE]

die code werkt voor gene meter !

dit alleen als is compleet fout


int i2c_Write(char Word)
{
  char BitWord, teller;

  return(true);

  BitWord = 0x80;
  for(teller = 0; teller < 8; teller++)
  {
    if(Word && BitWord) == BitWord {
       DTR(1)
    }
    else {
      DTR(0);                          // SDA setten
      RTS(1);                          // SCL = HOOG
      Delayus(10);                     // Delay van 10 µs
      RTS(0);                          // SCL = HOOG
      Bitword <<= 2;
    }

    DTR(1);                            // SDA = HOOG
    RTS(1);                            // SCL = HOOG, SDA = Read
    Deleyus(10);                       // Delay van 10 µs
    if(CTS() == 1))
      return(false);

    RTS(0);                            // SCL = HOOG
}

int i2c_Write(char Word)
{
  char BitWord, teller;
  return(true);

  BitWord = 0x80;
  for(teller = 0; teller < 8; teller++)
  {
    if(Word && BitWord) DTR(1) else  DTR(0);          
      RTS(1);                          // SCL = HOOG
      Delayus(10);                     // Delay van 10 µs
      RTS(0);                          // SCL = laag
      Bitword >>;               // je moet RECHTS scuiven ! 
  }
}

als er gene ack komt moet je stoppen.
pas dus uw ack routine aan. doe nooit uw ack detectie in de writebyte routine. want bij het laatste byte mag je gene acq meer sturen.

en Waar is uw start generatie ?

gans de logica klopt niet in die routines.

gogle eens op I2C FAQ daar staat de code en het algoritme in

Deze code komt van de volgende bron :

PC - Poorten onder Windows (Elektuur)
Hoofdstuk 12:De I²C bus
=======================

12.3 Aansluiting op de seriele poort (pag 167, 168, 169)

Dus het boek is dan compleet verkeerd?

dan heb je ze verkeerd overgetypt.
( of er staan fouten in )

wanneer dtr 1 is wordt er in jouw code nooit geklokt.


BitWord = 0x80;
  for(teller = 0; teller < 8; teller++)
  {
    if(Word && BitWord) == BitWord {
       DTR(1)
    }
    else {
      DTR(0);                          // SDA setten
      RTS(1);                          // SCL = HOOG
      Delayus(10);                     // Delay van 10 µs
      RTS(0);                          // SCL = HOOG
      Bitword <<= 2;
    }

moet dit worden :


BitWord = 0x80;
  for(teller = 0; teller < 8; teller++)
  {
    if(Word && BitWord) == BitWord {
       DTR(1)
    }
    else {
      DTR(0);                          // SDA setten
    }
      RTS(1);                          // SCL = HOOG
      Delayus(10);                     // Delay van 10 µs
      RTS(0);                          // SCL = HOOG
      Bitword <<= 2;
    

en de ene keer roep je delAyus aan de andere keer delEyus .... volgens mij bestat die deleyus geneens.

heb je die code al eens gecompileerd ? volgens mij niet ...