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&…
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
google eens op i2c faq.
alles wat je nodig hebt staat erin
en voor de printerpoort te sturne gebruik je de driver van logix4u
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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.
timmie
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
wat dacht je van google?
http://www.esacademy.com/faq/i2c/q_and_a/i2cqena.htm
http://www.google.nl/search?hl=nl&q=i2c+Faq&meta=
[Bericht gewijzigd door timmie op ]
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 ]
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
gogo stefke,
Zoals hierboven gezegd, check de links 
Je zou dit topic beter moven naar schoolopgaven ^^
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
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]
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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?
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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 ...