Viacero I2C portov/CodeVisionAVR ATmega16

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Marko5211
Příspěvky: 115
Registrován: 18 kvě 2006, 00:00

Viacero I2C portov/CodeVisionAVR ATmega16

#1 Příspěvek 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...
Uživatelský avatar
Burajko
Příspěvky: 1819
Registrován: 21 srp 2009, 00:00

#2 Příspěvek od Burajko »

Pouzi analog. multiplexer.,prepinaj aj SDA,SCL,alebo k funkcii prirad iny port na uPc.
Už druhý krát strihám a furt je to krátke
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#3 Příspěvek 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;
}
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#4 Příspěvek 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.
Uživatelský avatar
Marko5211
Příspěvky: 115
Registrován: 18 kvě 2006, 00:00

#5 Příspěvek 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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“