Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 16.04.2012, 22:51  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию 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();	
}
Миниатюры:
Нажмите на изображение для увеличения
Название: read_diagram.gif
Просмотров: 58
Размер:	19.5 Кб
ID:	33858  
Реклама:
kruftin вне форума  
Непрочитано 16.04.2012, 22:57  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

1.Ничё не понял ...Вы оперируете аппаратными регистрами TWI, и считаете ,что просто ножками шевелите?
2.bitrate- это теоретическая формула - если меняете кварцы, по ней клок автоматически высчитывается ,и выставляется коэффициент деления, так-же и в USART .(Ручками можно выставить всё в H и L)
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:03  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию 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);
}
}
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:03  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию 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.
kruftin вне форума  
Непрочитано 16.04.2012, 23:10  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

1.Да , но можно в одной строке указать кварц, константой, и потом всё посчитается само.
2.Представьте , что Вы отправили данные, а они ещё не ушли (аппаратная часть работает медленнее чем мозги у Разработчика (у неё есть временнЫе параметры,обязательные)...а Вы будете туда пихать данные раз за разом, хотя они ещё из первой посылки передаются бит за битом....)- всё , что понапихали- потеряете,нужно ждать,когда освободится очередь(это в Общем случае (я про буфера пока не говорю,но даже это предполагает проверки регистров на Возможность и Достоверность))

Последний раз редактировалось OlegNZH; 16.04.2012 в 23:12.
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:21  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

при приёме - тоже куча битов проверяется ...и в Даташитах, разработчики приводят наиболее оптимальный , с их точки зрения алгоритм....я раньше тоже грешил : "..знЯю- всё принято чего тут рассусоливать!Берём , всё по-честному ..."- и брал как истину принятые данные,пока не столкнулся не с единичными данными , а с потоками ....ан-нет ...лучше помурыжиться с пару-тройкой строк ,чем потом огрести!
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:26  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Дак нет тут то мы же не функцию ожидания запускаем, а ответ кидаем типа ACK - подтверждение приема,ну или ладно завтра лучше допишу до конца програмку и потом проверю на деле, правда экранчик как раз на порту С сидит надо будет питание и пару выводов от него отпаять).
kruftin вне форума  
Непрочитано 16.04.2012, 23:53  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

Намбер оне : нужно дождаться окончания отправки данных, переждать,прежде чем что-то ещё отправлять,Нумер два:Приём - дождаться,что-бы все флаги выставились по True, тогда можно брать данные(отдельная История с 9-м битом и мультипроцессорным режимом)
OlegNZH вне форума  
Непрочитано 17.04.2012, 07:15  
kruftin
Прописка
 
Аватар для kruftin
 
Регистрация: 17.02.2012
Сообщений: 109
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
kruftin на пути к лучшему
По умолчанию Re: I2C + atmega32

Ну судя по коду у нас всегда true.
kruftin вне форума  
Непрочитано 17.04.2012, 10:22  
harrystar
Прохожий
 
Регистрация: 02.12.2010
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
harrystar на пути к лучшему
По умолчанию Re: I2C + atmega32

Одно из лучших описаний I2C и пример аппаратной реализации
http://easyelectronics.ru/avr-uchebn...j-iic-i2c.html

Единственно - там сделано для собственной ОС, но описано все хорошо, немного переделать не составит труда. Получается удобная библиотечка для встраивания в любые проекты.
harrystar вне форума  
 

Закладки
Опции темы

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

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, время: 21:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot