Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

I2C + atmega32

Непрочитано 14.04.2012, 22:42  
jump
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: I2C + atmega32

kruftin,
а что это за энкодеры с i2c?
Реклама:
jump вне форума  
Непрочитано 14.04.2012, 23:42  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

Если в энкодере есть переменная часть адреса- то без проблем пару...
OlegNZH вне форума  
Непрочитано 15.04.2012, 14:20  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Ну я хотел подыскать с интерфейсом i2c какой-нить оптический энкодер. Хотя вот тот, что советовали мне в теме про шаговик выдает соответствующее углу напряжение на выходе(правда как напряжение связано с углом я пока не почерпнул из даташита).
Вложения:
Тип файла: pdf datasheet.pdf (237.7 Кб, 90 просмотров)
kruftin вне форума  
Непрочитано 15.04.2012, 14:47  
texnar
Частый гость
 
Регистрация: 08.04.2012
Сообщений: 19
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 1 сообщении
texnar на пути к лучшему
По умолчанию Re: I2C + atmega32

Стандартный "человеческий" знкодер. с I2C никак не связан. подключать к портам внешних прерываний у Atmega32. там их как раз 3 штуки.
texnar вне форума  
Непрочитано 15.04.2012, 18:35  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Вот кстати страничка где про мой компас поподробнее расписано http://www.seeedstudio.com/wiki/inde..._Compass_v1.0b
Не подскажете мне нужно к этой платке подводить дополнительно питание на SCL и SDA линию?
texnar, Т.е. один "человеческий" энкодер у меня все три порта внешних прерываний сожрет?
Как я определю угол по этим портам?
И еще вопрос: общаться с устройством по i2c можно как через порты ввода-вывода, так и через twi модуль контроллера(только через twi проще)?

Последний раз редактировалось kruftin; 15.04.2012 в 19:33.
kruftin вне форума  
Непрочитано 15.04.2012, 22:10  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

Там пример то-же для Arduino ,только более к сей штуковине привязан, в отличии от примеров, которые я Вам давал- там практически чистый код(одна ничего не значащая функция мне непонятна(макрос?) ... )
Насчёт эмуляции I2C ...Можно конечно и просто ножками дрыгать , жалко что-ли...
OlegNZH вне форума  
Сказали "Спасибо" OlegNZH
kruftin (16.04.2012)
Непрочитано 16.04.2012, 00:09  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: I2C + atmega32

Сообщение от kruftin Посмотреть сообщение
И еще вопрос: общаться с устройством по i2c можно как через порты ввода-вывода, так и через twi модуль контроллера(только через twi проще)?
Программная реализация называется.
TWI удобней и быстрей.
_Артём_ вне форума  
Непрочитано 16.04.2012, 20:46  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Вот кстати нашел пример дрыгания ногами, все просто http://avrlab.com/node/127
kruftin вне форума  
Непрочитано 16.04.2012, 21:01  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

Т.е. Вам удобнее заниматься "этой фигнёй" - вместо того , что-бы аппаратно всё отрабатывалось,и в это время Вы-бы занимались Основной задачей?...Не , ну если некритично по быстродействию,простаивае� � в основном машина,можно и так.(Скепсис снялся-бы с моей стороны, если-бы действительно нельзя было-бы развести два однотипных I2C-устройства по разным адресам- одно на общей шине - другое эмулируется )
OlegNZH вне форума  
Непрочитано 16.04.2012, 22:46  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Не почему я для интереса нашел как ножками реализовать, а сейчас пишу под себя тот пример. Есть вопросы, дошел до такого:

Код:
//Программа для работы с компасом HMC5883

#include ‹mega32.h›
#include ‹delay.h› //Включаем библиотеку для организации задержек

#define START					0x08
#define MT_SLA_ACK				0x18
#define MT_DATA_ACK				0x28
#define TWCR_CMD_MASK		        0x0F

#define F_CPU 8000000
#define WRITE_sda() DDRC = DDRC | 0b00000010 //SDA must be output when writing
#define READ_sda()  DDRC = DDRC & 0b11111101 //SDA must be input when reading - don't forget the resistor on SDA!!
unsigned int error=0;

//functions
//Initialize I2C (TWI) interface
void i2cInit(void);
//Set the I2C transaction bitrate (in KHz)
void i2cSetBitrate(unsigned short bitrateKHz);
//Send an I2C start condition in Master mode
void i2cSendStart(void);
//Send an I2C stop condition in Master mode
void i2cSendStop(void);
//Wait for current I2C operation to complete
void i2cWaitForComplete(void);
//Check value of TWI Status register (START)
void i2cCheckForStart(void);
//Send an (address|R/W) combination or a data byte over I2C
void i2cSendByte(unsigned char data);
//Check value of TWI Status register (MT_SLA_ACK)
void i2cCheckForMT_SLA(void);
//Check value of TWI Status register (MT_DATA_ACK)
void i2cCheckForMT_DATA(void);


// I2C FUNCTIONS
void i2cInit(void)
{
	// set i2c bit rate to 40KHz
	i2cSetBitrate(100);
	// enable TWI (two-wire interface)
	TWCR = 1‹‹TWEN;	// Enable TWI
}

void i2cSetBitrate(unsigned short bitrateKHz)
{
	unsigned char bitrate_div;
	// set i2c bitrate
	// SCL freq = F_CPU/(16+2*TWBR*4^TWPS))
	TWSR &= ~(1‹‹TWPS0); //set zero for TWPS = 1
	TWSR &= ~(1‹‹TWPS1);
	
	//calculate bitrate division	
	bitrate_div = ((F_CPU/4000l)/bitrateKHz);
	if(bitrate_div ›= 16)
		bitrate_div = (bitrate_div-16)/2;
	TWBR = bitrate_div;
}

void i2cSendStart(void)
{
	WRITE_sda();
	// send start condition
	TWCR = (1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN);
}

void i2cSendStop(void)
{
	// transmit stop condition
        TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWSTO);
}

void i2cWaitForComplete(void)
{
	int i = 0;		//time out variable
	
	// wait for i2c interface to complete operation
        while ((!(TWCR & (1‹‹TWINT))) && (i ‹ 90))
			i++;
}

void i2cCheckForStart(void)
{
	// check status for START
	if((TWSR & 0xF8) != START);
    error = 1;
}

void i2cSendByte(unsigned char data)
{

	WRITE_sda();
	// save data to the TWDR
	TWDR = data;
	// begin send
	TWCR = (1‹‹TWINT)|(1‹‹TWEN);
}

void i2cCheckForMT_SLA(void)
{
	// check status for MT_SLA_ACK
	if((TWSR & 0xF8) != MT_SLA_ACK);
    error = 1;
}

void i2cCheckForMT_DATA(void)
{
	// check status for MT_DATA_ACK
	if((TWSR & 0xF8) != MT_DATA_ACK);
    error = 1;
}

void i2cReceiveByte(unsigned char ackFlag)
{
	// begin receive over i2c
	if( ackFlag )
	{
		// ackFlag = TRUE: ACK the recevied data
		TWCR = (((TWCR)&TWCR_CMD_MASK)|1‹‹TWINT|1‹‹TWEA);
	}
	else
	{
		// ackFlag = FALSE: NACK the recevied data
		TWCR = (((TWCR)&TWCR_CMD_MASK)|1‹‹TWINT);
	}
}

unsigned char i2cGetReceivedByte(void)
{
	// retieve received data byte from i2c TWDR
	return (TWDR);
}

unsigned char i2cGetStatus(void)
{
	// retieve current i2c status from i2c TWSR
	return (TWSR);
}
1) Если есть такая конструкция:
#ifndef inb
#define inb(addr) (addr)
#endif

То чем отличается addr от (addr) ?
2) Что-то я не понял расчет делителя:
bitrate_div = ((F_CPU/4000l)/bitrateKHz);
if(bitrate_div ›= 16)
bitrate_div = (bitrate_div-16)/2;
TWBR = bitrate_div;
kruftin вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UART + atmega32 kruftin Микроконтроллеры, АЦП, память и т.д 35 06.06.2012 11:26
Прошивка atmega32 kruftin Микроконтроллеры, АЦП, память и т.д 10 17.02.2012 17:22
Atmega32 и энкодер Pevek80 Микроконтроллеры, АЦП, память и т.д 21 06.03.2011 20:46
Atmega32 и LCD DEJL1985 Делимся опытом 8 20.06.2010 14:35
ATmega32 NCy Микроконтроллеры, АЦП, память и т.д 20 28.04.2007 00:44


Часовой пояс GMT +4, время: 19:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.