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