Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

ATmega128 софтуерен I2C
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1727
Страница 1 от 1

Автор:  Сашо [ Сря Фев 01, 2006 5:12 pm ]
Заглавие:  ATmega128 софтуерен I2C

Някой да има сорс на софтуерен I2C за ATmega128? Ако е на асемблер е по-добре, но и на С ще свърши работа.
10х!

Автор:  Nikola Kirov [ Сря Фев 01, 2006 5:43 pm ]
Заглавие: 

А защо не ползваш неговия TWI?
Не съм мяркал по нета такова нещо като за AVR. А то много малко вероятно на някои да му потрябват 2 отделни I2C линии в едно устроиство. В логически анализатор ми потрябва такова нещо,но направих превключване на хардуерния.

Автор:  Сашо [ Сря Фев 01, 2006 6:15 pm ]
Заглавие: 

Как превключваш хардуерния? Може ли по едни пинове да приемаш, а по други да предаваш? 10х!

Автор:  Nikola Kirov [ Сря Фев 01, 2006 6:36 pm ]
Заглавие: 

Аналогов мултилексор ползвах,нещо от типа на 4066,не мога да си изкопам схемата по която го правих тогава. Просто си превключвам на коя от 2те шини да е вързан. Виж ако искаш слеив да имаш,така не става.
Но софтуерен слеив на I2C гълата доста ресърси като време за изпълнение ако решиш да правиш. Мегите са доста бавни като имаш програма която работи на прекъсване а да направиш нормален слеив си мисля че точно на external interrupts трябва да го навържеш.

Автор:  3aek [ Сря Фев 01, 2006 7:46 pm ]
Заглавие: 

виж на avrfreaks.net трябва да има code examples някъде или просто google "avr i2c .c"

Автор:  the_real_maniac [ Сря Фев 01, 2006 7:58 pm ]
Заглавие: 

НЕ се натоварвай излишно САШО , или по-точно МЦУ-то не го натоварвай излишно , ами управлявай един прост мултиплексор 2 към 1 :-)

Успех !

Автор:  [ Сря Фев 01, 2006 10:50 pm ]
Заглавие: 

Софтуерен I2C за PIC писано на C, няма ли да свърши работата ? Ще смениш някои декларации, както е според съответния компилатор за AVR. Става дума за Master.

Автор:  Живко [ Пон Фев 06, 2006 4:11 pm ]
Заглавие: 

това е pisano za mega103 raboti bezotkazno

void i2c_init( void )
{
/* Initialize processor I/O pins (SDA and SCL) involved in I2C operation */

I2C_Status = 0;

/* Declare both signals output, making sure
they apply a HIGH level */
SET_SDA();
SET_SCL();
SET_SDA_TO_OUTPUT();
SET_SCL_TO_OUTPUT();

/* Check the signal levels */
if( !SCL_SET() ) I2C_Status |= I2C_SCL_STUCK_LOW;
if( !SDA_SET() ) I2C_Status |= I2C_SDA_STUCK_LOW;
}

/* ------------------------------------------------------------------------ */

#define MUS_DELAY 5

void i2c_delay( void )
{
/* To match the maximum bitrate we need to add some delay in places,
done here with a simple busy-wait loop; minimum delay is 3 mus;
measured for an ATmega103 running at 4 MHz */
BYTE i;
for( i=0; i<(MUS_DELAY-3); ++i );
}

/* ------------------------------------------------------------------------ */

void i2c_start( void )
{
/* Generate I2C START condition */
SET_SDA();
SET_SCL();
i2c_delay();
CLEAR_SDA();
i2c_delay();
CLEAR_SCL();
i2c_delay();
}

/* ------------------------------------------------------------------------ */

void i2c_stop( void )
{
/* Generate I2C STOP condition */
CLEAR_SDA();
SET_SCL();
i2c_delay();
SET_SDA();
i2c_delay();
}

/* ------------------------------------------------------------------------ */

void i2c_write( BYTE byt )
{
/* Write a byte to the I2C bus; errors are stored in I2C_Status
and can be inspected by calling i2c_status() */

BYTE i;

/* Set SDA back to output */
SET_SDA_TO_OUTPUT();

/* Send BYTE, MSB first */
for( i=0; i<8; ++i )
{
if( byt & 0x80 )
SET_SDA();
else
CLEAR_SDA();

/* Get ready for next bit */
byt <<= 1;

SET_SCL();
i2c_delay();
CLEAR_SCL();
i2c_delay();
}
/* To receive the acknowledge, set SDA to input (without pull-up) */
SET_SDA_TO_INPUT();
CLEAR_SDA();

/* Get the acknowledge */
SET_SCL();
i2c_delay();

CLEAR_SCL();
i2c_delay();

/* Set SDA back to output */
SET_SDA_TO_OUTPUT();
}

/* ------------------------------------------------------------------------ */

BYTE i2c_read( BOOLEAN last )
{
/* Read a byte from the I2C bus; byte value is returned;
errors are stored in I2C_Status and
can be inspected by calling i2c_status(); */

BYTE i, byt;

/* Set SDA to input, without pull-up */
SET_SDA_TO_INPUT();
CLEAR_SDA();

/* Initialize byte value */
byt = 0;

/* Receive BYTE, MSB first */
for( i=0; i<8; ++i )
{
SET_SCL();
i2c_delay();
byt <<= 1;
if( SDA_SET() ) ++byt;

CLEAR_SCL();
i2c_delay();
}

/* Get ready for acknowledge: is it the last byte to read ? */
if( last )
SET_SDA();
else
CLEAR_SDA();

/* Set SDA to output */
SET_SDA_TO_OUTPUT();

SET_SCL();
i2c_delay();
CLEAR_SCL();
i2c_delay();

return byt;
}

/* ------------------------------------------------------------------------ */

BYTE i2c_status( void )
{
/* Return the status byte and reset it to zero */
BYTE stat;
stat = I2C_Status;
I2C_Status = 0;
return stat;
}

void write_eeprom(unsigned int adr)
{
i2c_start();
i2c_write(0xA0);
temp=adr/0xff;
i2c_write(temp);
temp=adr;
i2c_write(temp);
i2c_write(0x36);
i2c_write(0x37);
i2c_write(0x38);
i2c_stop();
delay_ms(10);

}
void read_eeprom(unsigned int adr)
{
i2c_start();
i2c_write(0xA0);
temp=adr/0xff;
i2c_write(temp);
temp=adr;
i2c_write(temp);
i2c_start();
i2c_write(0xA1);
temp= i2c_read(1);
i2c_stop();
delay_ms(1);
}

Автор:  danov [ Пон Фев 06, 2006 6:11 pm ]
Заглавие: 

Живко написа:
/* To receive the acknowledge, set SDA to input (without pull-up) */
SET_SDA_TO_INPUT();
CLEAR_SDA();

/* Get the acknowledge */
SET_SCL();
i2c_delay();

CLEAR_SCL();
i2c_delay();


А как точно прочиташ какво се връща?

Живко написа:
...
temp=adr/0xff;
...


Това не е ли леко проблемно?

Автор:  the_real_maniac [ Вто Фев 07, 2006 8:56 pm ]
Заглавие: 

danov - въпроса ти е добър и според мен правилен , т.е няма как да разбере , поне така както го дал.

Изчаках един ден , все пак да не пиша едно и също -> като тебе , но реших да се разпиша , защото наистина няма как да разбере какво се получава.

това едно

второ: наистина атмегата , доколокто знам е 8бит* и като такава едва ли едно деление с остатък ще й се види лесно.

* но може и да съм в грешка :roll: :lol: :)

Автор:  Nikola Kirov [ Вто Фев 07, 2006 10:49 pm ]
Заглавие: 

Библиотеката за делене беше около 200 баита при IAR. Ако ги имаш и не гониш бързина не е проблем.

Автор:  ДедоБоре [ Вто Фев 07, 2006 11:03 pm ]
Заглавие: 

проблема е, че не можеш да пишеш в адрес 0 без да разлаеш кучето.
а ако няма куче - 'ойде коньо у ряката'...

при -О1 и по-голяма, компилатора може може и да компилита такива деления в шифтове, но не е сигурно
затова е по-добре да се ползва:
Код:
temp = adr >> 8;

Автор:  Nikola Kirov [ Вто Фев 07, 2006 11:20 pm ]
Заглавие: 

Това за оптимизацията,да усеща се при по високо ниво на опримизация,пробвах го при мен.
Ама това за писането в адрес 0 и кучето нещо не го разбрах. Ще пообясниш ли?

Автор:  ДедоБоре [ Вто Фев 07, 2006 11:27 pm ]
Заглавие: 

уф! сори... :oops: заблудих се, че се дели на нула... цял ден се занимавам с win и виж докъде ме доведе!
май трябва да си лягам :-s

но препоръката си остава (>>8)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/