TWI+DS1307+Atmega8
- Сообщения: 238
- Зарегистрирован: Сб янв 29, 2011 20:26:48
Доброго времени суток! Пишу программу для огромного циферблата на здании. Часы работают пока есть питание, как только питание исчезает понятное дело время обнуляется. Хочу применить девайс DS1307 и применить аппаратное TWI. (в Atmega8). Только вот при подключении библиотек, библиотеку TWI нашёл, а под DS1307 библиотеки нет. Проекты пишу Studio4+WinAVR. На сайтах нашёл похожие проекты, но под CVAVR. Хотелось бы найдти, что нибудь под WinAVR. И написанное доступным для понимания новичка именно в работе с аппаратным TWI. Спасибо.
- Реклама
Вот переносил с программного I2c на TWI в CVAVR. Должно завестись и на WinAVR без плясок с бубном.
bcd.lib содержит ассемблерные функции математики BCD.
bcd.lib содержит ассемблерные функции математики BCD.
- Вложения
-
- ds1307_src.zip
- (2.85 КБ) 357 скачиваний
- Сообщения: 238
- Зарегистрирован: Сб янв 29, 2011 20:26:48
Спасибо! Посмотрел. У меня раньше все проекты умещались в одном файле, без подключаемых файлов. Поэтому трудно мне понять как все файлы разместить и запустить. И потом что за зверь BCD?
- Сообщения: 563
- Зарегистрирован: Чт апр 16, 2009 04:53:41
самый первый ответ гугла:
http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%BE%D0%B4
http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%BE%D0%B4
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
- Сообщения: 238
- Зарегистрирован: Сб янв 29, 2011 20:26:48
Ну про гугл понятно(BCD), это я прочёл тему сразу. Не понял откуда он взялся, я потерял последовательность понимания темы. Поэтому и в небольшом тупике. Что это, функция, макрос? Где его описание именно в WinAVR? Спасибо!
- Реклама
С помощью Copy-Paste данную проблему решить несложно. И также несложно получить плохочитаемую, трудноподдерживаемую километровую простыню кода.
Откройте bcd.lib блокнотом.king-live писал(а):Что это, функция, макрос?
подскажите пожалуйста в какую сторону мне копать дабы найти ошибку
у меня на плате собраны часы: ATmaga8a+DS1307
когда я свой проэкт собираю в CodeVision. компилирую и прошиваю то все работает безупречно, а вот когда я свой проэкт собираю в Eclipse, где подключаю свои библиотеки для работы по TWI, то мои часики работают некоторое время, скажем так несколько минут, а опосля зависают, помогает только выкл-вкл питания
где искать причину ?
у меня на плате собраны часы: ATmaga8a+DS1307
когда я свой проэкт собираю в CodeVision. компилирую и прошиваю то все работает безупречно, а вот когда я свой проэкт собираю в Eclipse, где подключаю свои библиотеки для работы по TWI, то мои часики работают некоторое время, скажем так несколько минут, а опосля зависают, помогает только выкл-вкл питания
где искать причину ?
Tell Me The Truth
Хотел спросить, по поводу выражения
Этот бит TWINT в любом случае изменит свое состояние? Т.е не будет такого что программа зависнет в этом цикле?
Код: Выделить всё
while (!(TWCR & (1<<TWINT))) {; }в теории, насколько я в курсе, этот бит выставляется аппаратно так что по идее там должно быть все ок.
Tell Me The Truth
т.е даже не зависимо от того что творится на шине? (замыкания, обрывы, перебои, зависания слейв устройств)
- Сообщения: 238
- Зарегистрирован: Сб янв 29, 2011 20:26:48
этот флаг, при аппаратном TWI, лишь сигнализирует о том что то задание которое ты дал успешно выполнено
например, ты дал команду сформировать СТАРТ, через некоторое время МК выполнил твое пожелание и поскольку он не владеет человеческой речью, а сообщить тебе о своих успехах ему охота
, вот он тебе и делает отмашку флагом, мол так и так, командир, поставленная тобой задача успешно выполнена.
например, ты дал команду сформировать СТАРТ, через некоторое время МК выполнил твое пожелание и поскольку он не владеет человеческой речью, а сообщить тебе о своих успехах ему охота
Tell Me The Truth
Значит, если команда не выполнена успешна, тогда зависнем в этом цикле, так?
phanis писал(а):т.е даже не зависимо от того что творится на шине?
Иными словами говорит, что что-то на шине произошло. А что именно - надо заглянуть в TWI Status• 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.
Register (TWSR) и прочитать код состояния. Сбой шины, потеря арбитража, зависание слейва(NACK) - всё определяется через TWSR.
Подключить к проекту. Либо посмотреть как bcd оформлена у FreshMan.king-live писал(а):Что с ним делать? Куда вставлять или копировать?bcd.lib
Спасибо, если правильно понял, чтобы избежать бесконечного ожидания успешного окончания задачи, нужно добавить какой нибудь счетчик итераций, что то типа этого
Код: Выделить всё
uint count = xxxxx;
while (!(TWCR & (1<<TWINT))& count--) {; }Опять повторюсь:
TWINT в любом случае установится как только на TWI произойдет какое-то событие(например передача START, SLAW и т.д.). А вот обрабатывать состояния иногда бывает полезно.
Например, в табло бегущей строки, в зависимости от пожеланий заказчика, может быть не установлена микросхема часов.
Я написал такой код:
Т.о. если на шине какие-то проблемы и чип не отвечает, то обмен данными с ним просто прекращается. А программа получает соответствующий флаг.
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;
}даже если мы дали команду СТАРТ по по каким-либо причинам она не выполнилась ?uk8amk писал(а):TWINT в любом случае установится как только на TWI произойдет какое-то событие(например передача START, SLAW и т.д.).
Tell Me The Truth
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Глянь несколько моих учебных проектиков, может чтото пригодится..... тоько я везде программный TWI использую... но для часов - думаю не принципиально, какой TWI использовать...king-live писал(а):Доброго времени суток! Пишу программу для огромного циферблата на здании. Часы работают пока есть питание, как только питание исчезает понятное дело время обнуляется. Хочу применить девайс DS1307 и применить аппаратное TWI. (в Atmega8). Только вот при подключении библиотек, библиотеку TWI нашёл, а под DS1307 библиотеки нет. Проекты пишу Studio4+WinAVR. На сайтах нашёл похожие проекты, но под CVAVR. Хотелось бы найдти, что нибудь под WinAVR. И написанное доступным для понимания новичка именно в работе с аппаратным TWI. Спасибо.
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=175
http://asis-kbr.ru/forum/viewtopic.php?f=11&t=159
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.
Иными словами если на шине сопля на землю, то он пожизненно будет ждать STOP.• 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.
К счастью такие ситуации редкие и выходом действительно может быть таймаут. Это если любой ценой надо возобновить пусть и ограниченное функционирование девайса.


