| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
I2C + atmega32
14.04.2012, 22:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
|
Re: I2C + atmega32
kruftin,
а что это за энкодеры с i2c?
|
|
|
|
14.04.2012, 23:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: I2C + atmega32
Если в энкодере есть переменная часть адреса- то без проблем пару...
|
|
|
|
15.04.2012, 14:20
|
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Ну я хотел подыскать с интерфейсом i2c какой-нить оптический энкодер. Хотя вот тот, что советовали мне в теме про шаговик выдает соответствующее углу напряжение на выходе(правда как напряжение связано с углом я пока не почерпнул из даташита).
|
|
|
|
15.04.2012, 14:47
|
|
|
Частый гость
Регистрация: 08.04.2012
Сообщений: 19
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 1 сообщении
|
Re: I2C + atmega32
Стандартный "человеческий" знкодер. с I2C никак не связан. подключать к портам внешних прерываний у Atmega32. там их как раз 3 штуки.
|
|
|
|
15.04.2012, 18:35
|
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Вот кстати страничка где про мой компас поподробнее расписано http://www.seeedstudio.com/wiki/inde..._Compass_v1.0b
Не подскажете мне нужно к этой платке подводить дополнительно питание на SCL и SDA линию?
texnar, Т.е. один "человеческий" энкодер у меня все три порта внешних прерываний сожрет?
Как я определю угол по этим портам?
И еще вопрос: общаться с устройством по i2c можно как через порты ввода-вывода, так и через twi модуль контроллера(только через twi проще)?
Последний раз редактировалось kruftin; 15.04.2012 в 19:33.
|
|
|
|
15.04.2012, 22:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: I2C + atmega32
Там пример то-же для Arduino ,только более к сей штуковине привязан, в отличии от примеров, которые я Вам давал- там практически чистый код(одна ничего не значащая функция мне непонятна(макрос?) ... )
Насчёт эмуляции I2C ...Можно конечно и просто ножками дрыгать , жалко что-ли...
|
|
|
|
Сказали "Спасибо" OlegNZH
|
|
|
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
|
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Вот кстати нашел пример дрыгания ногами, все просто http://avrlab.com/node/127
|
|
|
|
16.04.2012, 21:01
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: I2C + atmega32
Т.е. Вам удобнее заниматься "этой фигнёй" - вместо того , что-бы аппаратно всё отрабатывалось,и в это время Вы-бы занимались Основной задачей?...Не , ну если некритично по быстродействию,простаивае� � в основном машина,можно и так.(Скепсис снялся-бы с моей стороны, если-бы действительно нельзя было-бы развести два однотипных I2C-устройства по разным адресам- одно на общей шине - другое эмулируется )
|
|
|
|
16.04.2012, 22:46
|
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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;
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|