AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
16.04.2012, 22:51
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
И еще вот не понимаю зачем тут столько ACK, т.е. i2cReceiveByte(TRUE);:
Нам же при приеме нужно отправить подтверждение лишь после прихода данных(см. скриншот)?
Код:
|
void HMC5843(void)
{
uint8_t xh, xl, yh, yl, zh, zl;
long xo, yo, zo;
i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0x3C); //write to HMC
i2cWaitForComplete();
i2cSendByte(0x02); //mode register
i2cWaitForComplete();
i2cSendByte(0x00); //continuous measurement mode
i2cWaitForComplete();
i2cSendStop();
//must read all six registers plus one to move the pointer back to 0x03
i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0x3D); //read from HMC
i2cWaitForComplete();
i2cReceiveByte(TRUE);
i2cWaitForComplete();
xh = i2cGetReceivedByte(); //x high byte
i2cWaitForComplete();
//printf(" %d", xh);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
xl = i2cGetReceivedByte(); //x low byte
i2cWaitForComplete();
xo = xl|(xh ‹‹ 8);
printf("x=%4ld, ", xo);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yh = i2cGetReceivedByte(); //y high byte
i2cWaitForComplete();
//printf(" %d ", yh);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
yl = i2cGetReceivedByte(); //y low byte
i2cWaitForComplete();
yo = yl|(yh ‹‹ 8);
printf("y=%4ld, ", yo);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zh = i2cGetReceivedByte();
i2cWaitForComplete(); //z high byte
//printf(" %d ", zh);
i2cReceiveByte(TRUE);
i2cWaitForComplete();
zl = i2cGetReceivedByte(); //z low byte
i2cWaitForComplete();
zo = zl|(zh ‹‹ 8);
printf("z=%ld \r\n", zo);
i2cSendByte(0x3D); //must reach 0x09 to go back to 0x03
i2cWaitForComplete();
i2cSendStop();
} |
|
|
|
|
16.04.2012, 22:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: I2C + atmega32
1.Ничё не понял ...Вы оперируете аппаратными регистрами TWI, и считаете ,что просто ножками шевелите?
2.bitrate- это теоретическая формула - если меняете кварцы, по ней клок автоматически высчитывается ,и выставляется коэффициент деления, так-же и в USART .(Ручками можно выставить всё в H и L)
|
|
|
|
16.04.2012, 23:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: I2C + atmega32
"...И еще вот не понимаю зачем тут столько ACK, т.е. i2cReceiveByte(TRUE)..."
Привыкайте , функция должна сказать, что было так или не так ,и насколько плохо.А здесь просто проверяется корректность приёма-все-ли регистры сказали- даём добро.
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);
}
}
|
|
|
|
16.04.2012, 23:03
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Нет я не считаю, что ножками шевелю. Я ту ссылку просто привел. Здесь я понимаю что использую TWI модуль. Просто как я понял коэффициент деления берется из формулы SCL freq = F_CPU/(16+2*TWBR*4^TWPS)), т.е. он фактически и есть TWBR в этой формуле, или не так? Не ну я не понял почему
i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0x3D); //read from HMC
i2cWaitForComplete();
i2cReceiveByte(TRUE); вот здесь зачем?
по идее надо только после принятых данных?
Последний раз редактировалось kruftin; 16.04.2012 в 23:05.
|
|
|
|
16.04.2012, 23:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: I2C + atmega32
1.Да , но можно в одной строке указать кварц, константой, и потом всё посчитается само.
2.Представьте , что Вы отправили данные, а они ещё не ушли (аппаратная часть работает медленнее чем мозги у Разработчика (у неё есть временнЫе параметры,обязательные)...а Вы будете туда пихать данные раз за разом, хотя они ещё из первой посылки передаются бит за битом....)- всё , что понапихали- потеряете,нужно ждать,когда освободится очередь(это в Общем случае (я про буфера пока не говорю,но даже это предполагает проверки регистров на Возможность и Достоверность))
Последний раз редактировалось OlegNZH; 16.04.2012 в 23:12.
|
|
|
|
16.04.2012, 23:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: I2C + atmega32
при приёме - тоже куча битов проверяется ...и в Даташитах, разработчики приводят наиболее оптимальный , с их точки зрения алгоритм....я раньше тоже грешил : "..знЯю- всё принято чего тут рассусоливать!Берём , всё по-честному ..."- и брал как истину принятые данные,пока не столкнулся не с единичными данными , а с потоками ....ан-нет ...лучше помурыжиться с пару-тройкой строк ,чем потом огрести!
|
|
|
|
16.04.2012, 23:26
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Дак нет тут то мы же не функцию ожидания запускаем, а ответ кидаем типа ACK - подтверждение приема,ну или ладно завтра лучше допишу до конца програмку и потом проверю на деле, правда экранчик как раз на порту С сидит надо будет питание и пару выводов от него отпаять).
|
|
|
|
16.04.2012, 23:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: I2C + atmega32
Намбер оне : нужно дождаться окончания отправки данных, переждать,прежде чем что-то ещё отправлять,Нумер два:Приём - дождаться,что-бы все флаги выставились по True, тогда можно брать данные(отдельная История с 9-м битом и мультипроцессорным режимом)
|
|
|
|
17.04.2012, 07:15
|
|
Прописка
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Ну судя по коду у нас всегда true.
|
|
|
|
17.04.2012, 10:22
|
|
Прохожий
Регистрация: 02.12.2010
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C + atmega32
Одно из лучших описаний I2C и пример аппаратной реализации
http://easyelectronics.ru/avr-uchebn...j-iic-i2c.html
Единственно - там сделано для собственной ОС, но описано все хорошо, немного переделать не составит труда. Получается удобная библиотечка для встраивания в любые проекты.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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, время: 21:56.
|
|