TWI+DS1307+Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

Доброго времени суток! Пишу программу для огромного циферблата на здании. Часы работают пока есть питание, как только питание исчезает понятное дело время обнуляется. Хочу применить девайс DS1307 и применить аппаратное TWI. (в Atmega8). Только вот при подключении библиотек, библиотеку TWI нашёл, а под DS1307 библиотеки нет. Проекты пишу Studio4+WinAVR. На сайтах нашёл похожие проекты, но под CVAVR. Хотелось бы найдти, что нибудь под WinAVR. И написанное доступным для понимания новичка именно в работе с аппаратным TWI. Спасибо.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Вот переносил с программного I2c на TWI в CVAVR. Должно завестись и на WinAVR без плясок с бубном.
bcd.lib содержит ассемблерные функции математики BCD.
Вложения
ds1307_src.zip
(2.85 КБ) 357 скачиваний
Реклама
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

Спасибо! Посмотрел. У меня раньше все проекты умещались в одном файле, без подключаемых файлов. Поэтому трудно мне понять как все файлы разместить и запустить. И потом что за зверь BCD?
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

самый первый ответ гугла:
http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%BE%D0%B4
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

Ну про гугл понятно(BCD), это я прочёл тему сразу. Не понял откуда он взялся, я потерял последовательность понимания темы. Поэтому и в небольшом тупике. Что это, функция, макрос? Где его описание именно в WinAVR? Спасибо!
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

С помощью Copy-Paste данную проблему решить несложно. И также несложно получить плохочитаемую, трудноподдерживаемую километровую простыню кода.
king-live писал(а):Что это, функция, макрос?
Откройте bcd.lib блокнотом.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

подскажите пожалуйста в какую сторону мне копать дабы найти ошибку
у меня на плате собраны часы: ATmaga8a+DS1307
когда я свой проэкт собираю в CodeVision. компилирую и прошиваю то все работает безупречно, а вот когда я свой проэкт собираю в Eclipse, где подключаю свои библиотеки для работы по TWI, то мои часики работают некоторое время, скажем так несколько минут, а опосля зависают, помогает только выкл-вкл питания
где искать причину ? :dont_know:
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

вот либа
Вложения
TWI.rar
(1.1 КБ) 381 скачивание
Tell Me The Truth
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Хотел спросить, по поводу выражения

Код: Выделить всё

 while (!(TWCR & (1<<TWINT)))  {; }
Этот бит TWINT в любом случае изменит свое состояние? Т.е не будет такого что программа зависнет в этом цикле?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

в теории, насколько я в курсе, этот бит выставляется аппаратно так что по идее там должно быть все ок.
Tell Me The Truth
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

т.е даже не зависимо от того что творится на шине? (замыкания, обрывы, перебои, зависания слейв устройств)
Контактная информация:
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

bcd.lib
Что с ним делать? Куда вставлять или копировать?
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

этот флаг, при аппаратном TWI, лишь сигнализирует о том что то задание которое ты дал успешно выполнено
например, ты дал команду сформировать СТАРТ, через некоторое время МК выполнил твое пожелание и поскольку он не владеет человеческой речью, а сообщить тебе о своих успехах ему охота :)) , вот он тебе и делает отмашку флагом, мол так и так, командир, поставленная тобой задача успешно выполнена.
Tell Me The Truth
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Значит, если команда не выполнена успешна, тогда зависнем в этом цикле, так?
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

phanis писал(а):т.е даже не зависимо от того что творится на шине?
• Bit 7 – TWINT: TWI Interrupt Flag
This bit is set by hardware when the TWI has finished its current job and expects application
software response.
Иными словами говорит, что что-то на шине произошло. А что именно - надо заглянуть в TWI Status
Register (TWSR) и прочитать код состояния. Сбой шины, потеря арбитража, зависание слейва(NACK) - всё определяется через TWSR.
king-live писал(а):
bcd.lib
Что с ним делать? Куда вставлять или копировать?
Подключить к проекту. Либо посмотреть как bcd оформлена у FreshMan.
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Спасибо, если правильно понял, чтобы избежать бесконечного ожидания успешного окончания задачи, нужно добавить какой нибудь счетчик итераций, что то типа этого

Код: Выделить всё

uint count = xxxxx;
  while (!(TWCR & (1<<TWINT))& count--)  {; }
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Опять повторюсь:
TWINT в любом случае установится как только на TWI произойдет какое-то событие(например передача START, SLAW и т.д.). А вот обрабатывать состояния иногда бывает полезно.
Например, в табло бегущей строки, в зависимости от пожеланий заказчика, может быть не установлена микросхема часов.
Я написал такой код:

Код: Выделить всё

char twi_status( void )
{
	return (TWSR & TWSR_MASK);
}

uint8_t rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
...
twi_start();
twi_write(0xd0);
status = twi_status();
if( (status == TWI_MT_SLAW_NACK) || (status == TWI_MT_DAT_NACK) ||
	(status == TWI_MT_LOST) )
	{//NACK or other BUS ERROR --> no RTC chip
	twi_stop();
	return RTC_FAILURE;
	};
...
twi_stop();
return RTC_OK;
}
Т.о. если на шине какие-то проблемы и чип не отвечает, то обмен данными с ним просто прекращается. А программа получает соответствующий флаг.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

uk8amk писал(а):TWINT в любом случае установится как только на TWI произойдет какое-то событие(например передача START, SLAW и т.д.).
даже если мы дали команду СТАРТ по по каким-либо причинам она не выполнилась ?
Tell Me The Truth
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

king-live писал(а):Доброго времени суток! Пишу программу для огромного циферблата на здании. Часы работают пока есть питание, как только питание исчезает понятное дело время обнуляется. Хочу применить девайс DS1307 и применить аппаратное TWI. (в Atmega8). Только вот при подключении библиотек, библиотеку TWI нашёл, а под DS1307 библиотеки нет. Проекты пишу Studio4+WinAVR. На сайтах нашёл похожие проекты, но под CVAVR. Хотелось бы найдти, что нибудь под WinAVR. И написанное доступным для понимания новичка именно в работе с аппаратным TWI. Спасибо.
Глянь несколько моих учебных проектиков, может чтото пригодится..... тоько я везде программный TWI использую... но для часов - думаю не принципиально, какой TWI использовать...
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=175
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=159
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

FreshMan писал(а):СТАРТ по по каким-либо причинам она не выполнилась ?
С одной стороны:
The TWINT Flag is set in the following situations:
• After the TWI has transmitted a START/REPEATED START condition.
• After the TWI has transmitted SLA+R/W.
• After the TWI has transmitted an address byte.
• After the TWI has lost arbitration.
• After the TWI has been addressed by own slave address or general call.
• After the TWI has received a data byte.
• After a STOP or REPEATED START has been received while still addressed as a Slave.
When a bus error has occurred due to an illegal START or STOP condition.
Но с другой стороны:
• Bit 5 – TWSTA: TWI START Condition Bit
The application writes the TWSTA bit to one when it desires to become a Master on the Twowire
Serial Bus. The TWI hardware checks if the bus is available, and generates a START condition
on the bus if it is free. However, if the bus is not free, the TWI waits until a STOP condition
is detected, and then generates a new START condition to claim the bus Master status.
Иными словами если на шине сопля на землю, то он пожизненно будет ждать STOP.
К счастью такие ситуации редкие и выходом действительно может быть таймаут. Это если любой ценой надо возобновить пусть и ограниченное функционирование девайса.
Ответить

Вернуться в «AVR»