Отговори на тема  [ 14 мнения ] 
ATmega128 софтуерен I2C 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 25, 2004 10:14 pm
Мнения: 128
Местоположение: София
Мнение ATmega128 софтуерен I2C
Някой да има сорс на софтуерен I2C за ATmega128? Ако е на асемблер е по-добре, но и на С ще свърши работа.
10х!


Сря Фев 01, 2006 5:12 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
А защо не ползваш неговия TWI?
Не съм мяркал по нета такова нещо като за AVR. А то много малко вероятно на някои да му потрябват 2 отделни I2C линии в едно устроиство. В логически анализатор ми потрябва такова нещо,но направих превключване на хардуерния.


Сря Фев 01, 2006 5:43 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 25, 2004 10:14 pm
Мнения: 128
Местоположение: София
Мнение 
Как превключваш хардуерния? Може ли по едни пинове да приемаш, а по други да предаваш? 10х!


Сря Фев 01, 2006 6:15 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Аналогов мултилексор ползвах,нещо от типа на 4066,не мога да си изкопам схемата по която го правих тогава. Просто си превключвам на коя от 2те шини да е вързан. Виж ако искаш слеив да имаш,така не става.
Но софтуерен слеив на I2C гълата доста ресърси като време за изпълнение ако решиш да правиш. Мегите са доста бавни като имаш програма която работи на прекъсване а да направиш нормален слеив си мисля че точно на external interrupts трябва да го навържеш.


Сря Фев 01, 2006 6:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 10, 2006 2:40 pm
Мнения: 2258
Мнение 
виж на avrfreaks.net трябва да има code examples някъде или просто google "avr i2c .c"


Сря Фев 01, 2006 7:46 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
НЕ се натоварвай излишно САШО , или по-точно МЦУ-то не го натоварвай излишно , ами управлявай един прост мултиплексор 2 към 1 :-)

Успех !

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Сря Фев 01, 2006 7:58 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Софтуерен I2C за PIC писано на C, няма ли да свърши работата ? Ще смениш някои декларации, както е според съответния компилатор за AVR. Става дума за Master.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Фев 01, 2006 10:50 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Мар 30, 2005 2:08 pm
Мнения: 30
Местоположение: Сливен
Мнение 
това е 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);
}


Пон Фев 06, 2006 4:11 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Живко написа:
/* 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;
...


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


Пон Фев 06, 2006 6:11 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
danov - въпроса ти е добър и според мен правилен , т.е няма как да разбере , поне така както го дал.

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

това едно

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

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

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Вто Фев 07, 2006 8:56 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Библиотеката за делене беше около 200 баита при IAR. Ако ги имаш и не гониш бързина не е проблем.


Вто Фев 07, 2006 10:49 pm
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
проблема е, че не можеш да пишеш в адрес 0 без да разлаеш кучето.
а ако няма куче - 'ойде коньо у ряката'...

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


Вто Фев 07, 2006 11:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Това за оптимизацията,да усеща се при по високо ниво на опримизация,пробвах го при мен.
Ама това за писането в адрес 0 и кучето нещо не го разбрах. Ще пообясниш ли?


Вто Фев 07, 2006 11:20 pm
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
уф! сори... :oops: заблудих се, че се дели на нула... цял ден се занимавам с win и виж докъде ме доведе!
май трябва да си лягам :-s

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


Вто Фев 07, 2006 11:27 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни