| Автор |
Съобщение |
|
Сашо
Ранг: Новодошъл
Регистриран на: Съб Сеп 25, 2004 10:14 pm Мнения: 128 Местоположение: София
|
 ATmega128 софтуерен I2C
Някой да има сорс на софтуерен I2C за ATmega128? Ако е на асемблер е по-добре, но и на С ще свърши работа.
10х!
|
| Сря Фев 01, 2006 5:12 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Аналогов мултилексор ползвах,нещо от типа на 4066,не мога да си изкопам схемата по която го правих тогава. Просто си превключвам на коя от 2те шини да е вързан. Виж ако искаш слеив да имаш,така не става.
Но софтуерен слеив на I2C гълата доста ресърси като време за изпълнение ако решиш да правиш. Мегите са доста бавни като имаш програма която работи на прекъсване а да направиш нормален слеив си мисля че точно на external interrupts трябва да го навържеш.
|
| Сря Фев 01, 2006 6:36 pm |
|
 |
|
3aek
Ранг: Форумен бог
Регистриран на: Вто Яну 10, 2006 2:40 pm Мнения: 2258
|
виж на avrfreaks.net трябва да има code examples някъде или просто google "avr i2c .c"
|
| Сря Фев 01, 2006 7:46 pm |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
НЕ се натоварвай излишно САШО , или по-точно МЦУ-то не го натоварвай излишно , ами управлявай един прост мултиплексор 2 към 1
Успех !
|
| Сря Фев 01, 2006 7:58 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Софтуерен I2C за PIC писано на C, няма ли да свърши работата ? Ще смениш някои декларации, както е според съответния компилатор за AVR. Става дума за Master.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Сря Фев 01, 2006 10:50 pm |
|
 |
|
Живко
Ранг: Минаващ
Регистриран на: Сря Мар 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 |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
А как точно прочиташ какво се връща?
Това не е ли леко проблемно?
|
| Пон Фев 06, 2006 6:11 pm |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
danov - въпроса ти е добър и според мен правилен , т.е няма как да разбере , поне така както го дал.
Изчаках един ден , все пак да не пиша едно и също -> като тебе , но реших да се разпиша , защото наистина няма как да разбере какво се получава.
това едно
второ: наистина атмегата , доколокто знам е 8бит* и като такава едва ли едно деление с остатък ще й се види лесно.
* но може и да съм в грешка 
|
| Вто Фев 07, 2006 8:56 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Библиотеката за делене беше около 200 баита при IAR. Ако ги имаш и не гониш бързина не е проблем.
|
| Вто Фев 07, 2006 10:49 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
проблема е, че не можеш да пишеш в адрес 0 без да разлаеш кучето.
а ако няма куче - 'ойде коньо у ряката'...
при -О1 и по-голяма, компилатора може може и да компилита такива деления в шифтове, но не е сигурно
затова е по-добре да се ползва:
|
| Вто Фев 07, 2006 11:03 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Това за оптимизацията,да усеща се при по високо ниво на опримизация,пробвах го при мен.
Ама това за писането в адрес 0 и кучето нещо не го разбрах. Ще пообясниш ли?
|
| Вто Фев 07, 2006 11:20 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
уф! сори...  заблудих се, че се дели на нула... цял ден се занимавам с win и виж докъде ме доведе!
май трябва да си лягам
но препоръката си остава (>>8)
|
| Вто Фев 07, 2006 11:27 pm |
|
|