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

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

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

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

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

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

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

 
Опции темы

I2C + atmega32

Непрочитано 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.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

1.Ничё не понял ...Вы оперируете аппаратными регистрами TWI, и считаете ,что просто ножками шевелите?
2.bitrate- это теоретическая формула - если меняете кварцы, по ней клок автоматически высчитывается ,и выставляется коэффициент деления, так-же и в USART .(Ручками можно выставить всё в H и L)
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:03  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
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.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: I2C + atmega32

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

Последний раз редактировалось OlegNZH; 16.04.2012 в 23:12.
OlegNZH вне форума  
Непрочитано 16.04.2012, 23:21  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
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.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
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, время: 20:35.


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