Stránka 1 z 1

Viacero I2C portov/CodeVisionAVR ATmega16

Napsal: 08 zář 2010, 00:12
od Marko5211
Zdravicko akurat riesim problem ako obsluhovat viacero i2c portov kedze potrebujem ovladat 6 kusov TDA7317. takze po 2 na kanal. otazka je ako ich mam jednotlivo riadit...napadli mi vytvorit C file s obsahom:

Kód: Vybrat vše

#include <mega16.h>
#include <delay.h>

#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>
char data;
void i2c_init_0(){
i2c_init_0();
};

void i2c_start_0()
{i2c_start();
};

void i2c_stop_0(){
i2c_stop();
};

void i2c_write_0(unsigned char data){
i2c_write_0(data);
};


Budu tri tieto subory a v kazdom budu pomenovane inak tie prikazy...

Napsal: 08 zář 2010, 00:20
od Burajko
Pouzi analog. multiplexer.,prepinaj aj SDA,SCL,alebo k funkcii prirad iny port na uPc.

Napsal: 08 zář 2010, 07:05
od Atlan
ja som pouzil datovu spolocnu zbernicu a scl pre jednotlive IO. riadim 3*7314


//************ TDA7314 *********

#define sclr PORTCbits.RC2
#define sclc PORTCbits.RC1
#define sclf PORTCbits.RC0
#define sdaa PORTDbits.RD2
#define isdaa TRISD|=0b00000100 ;sda ako vstup
#define osdaa TRISD&=0b11111011 ;sda ako vystup

unsigned char dati2c;

//;************************************ i2c TDA7314 center ************************
//;********************************************************************************
void I2Cstartc (void)
{
sdaa=1; //;ini dAta v W registre
sclc=1;
osdaa; //;sda je nastavene na vystup
Delay10TCYx(5); //2ms
sdaa=0; //;start
Delay10TCYx(5);
sclc=0; //;ukoncena start sekvencia
return;
}
//---------------------------------------------------
void i2cWc (unsigned char pom)
{unsigned char a;
osdaa; //;sda je nastavene na vystup

for(a=0b10000000;a>0;a>>=1)
{ Delay10TCYx(5);
sclc=0;
Delay10TCYx(5);
sdaa=0;
Delay10TCYx(5);
if (pom&a) sdaa=1;
Delay10TCYx(5);
sclc=1;
}
Delay10TCYx(5);
sclc=0; //;acklovage
isdaa; //;sda je nastavene na vstup
Delay10TCYx(5);
sclc=1;
INTCONbits.GIEH = 0; //zakazane prerusenie
while (sdaa); //;TEST ci bol prikaz potvrdeny...
INTCONbits.GIEH = 1; //povolene prerusenie
Delay10TCYx(5);
sclc=0;
return;
}
//;-----------------------------------------------------------
void I2Cstopc (void)
{
Delay10TCYx(5);
osdaa; //;sda je nastavene na vystup
sdaa=0; //;ukoncena stop sekvencia
Delay10TCYx(5);
sclc=1; //;stop
Delay10TCYx(5);
sdaa=1; //;ukoncena stop sekvencia
isdaa; //;sda je nastavene na vstup
Delay10TCYx(5);
return;
}
//;**********************************************************


posielanie prislusnych dat

void center (unsigned char datam1)
{
I2Cstartc();
i2cWc(0b10000000); //;ide o zapis do tda7314; adresa
i2cWc(datam1);
I2Cstopc();
return;
}

Napsal: 08 zář 2010, 08:54
od procesor
Prepinaj ADD, buď priamo (6 bitov), alebo cez dekodér (3 bity/8 ).
V adrese sa použije iba jedna hodnota A=1, alebo 0, podľa toho ako si zvolíš ovladanie.

Napsal: 08 zář 2010, 10:16
od Marko5211
Burajko píše:Pouzi analog. multiplexer.,prepinaj aj SDA,SCL,alebo k funkcii prirad iny port na uPc.


A prave tak som to myslel...k jednotlivym funkciam jednotlive porty a je to najjednoduchsie.V asm sa bavit nemienim a ani neviem multiplexovat?hmmm zaujimavy napad...ale radsej by som to najprv vyriesil softwarovo