реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AVR Studio 5 + avrlib + DS1307, Проблемы с I2C интерфейсом
Дима 128
сообщение Sep 21 2011, 13:02
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Друзья подскажите как обмениваться данными с часами DS1307 через функции avrlib Раньше писал с CodeVision там программный I2C и библиотека под часы была но пришлось перейти на AVR Studio так как библиотеки avrlib есть графический дисплей вот что то пытался написать но не работает не пойму как пользоваться I2C Библиотекой в итоге этого исходника ничего не происходит хотя импульсы на выходе контроллера есть (mega128) FCpu=8мгц В переменных нули =(((



i2cSetBitrate(50);
i2cInit();


while(1)
{


i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd0);
_delay_ms(100);
i2cSendByte(0);
_delay_ms(100);
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd1);
_delay_ms(100);
sek= i2cGetReceivedByte();
min= i2cGetReceivedByte();
hour= i2cGetReceivedByte();


i2cSendStop();
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 22 2011, 03:07
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Дима 128 @ Sep 21 2011, 22:02) *
Друзья подскажите как обмениваться данными с часами DS1307

Уважаемый Дима 128, сообщество будет благодарно, если Вы будете соблюдать нормы русского языка. Например, расставлять знаки припинания rolleyes.gif Без них, поверьте, понять смылс иной раз невозможно (Казнить нельзя помиловать).

По теме: Вам следует почиать стандарт на шину I2C. Там описаны старт условия, стоп условия, когда необходимо подтвержать прием, когда нет. Как мне кажется, задержки в 100 мс - совершенно лишние. Аппаратный модуль TWI в микроконтроллере сделает все "сам".

Успехов!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 22 2011, 04:16
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312




По теме: Вам следует почиать стандарт на шину I2C. Там описаны старт условия, стоп условия, когда необходимо подтвержать прием, когда нет. Как мне кажется, задержки в 100 мс - совершенно лишние. Аппаратный модуль TWI в микроконтроллере сделает все "сам".

Успехов!


Ну эта задержка уже так для эксперимента =))) Я читал про модуль и на ассемблере его запускал но хотелось бы узнать как
функцией avrlib пользоваться раз она там есть уж =)))


Или AVR Studio + avrlib не наш метод?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 22 2011, 09:32
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Дима 128 @ Sep 22 2011, 13:16) *
Ну эта задержка уже так для эксперимента =)))

Для какого эксперимента? Шина I2C до нескольких сотен килобит работает)

QUOTE (Дима 128 @ Sep 22 2011, 13:16) *
функцией avrlib пользоваться раз она там есть уж =)))

У меня нет avrlib( Если речь об avrlibc из WinAVR, то не могу найти указанные функции. У меня WinAVR20071221.

QUOTE (Дима 128 @ Sep 22 2011, 13:16) *
Или AVR Studio + avrlib не наш метод?

Да это-то тут при чем? rolleyes.gif Используйте то, что Вам удобнее.

Попробуйте посмотреть на форуме подобные темы.

Народ не одну сотню DS1307 запустил)))

Я тоже с ней работал, но это было давно ( 5 лет назад ). Исходников не осталось, к сожалению, иначе бы с удовольствием поделился бы)))



--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 22 2011, 15:48
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Так вот и я запускал не одни часы =))) Но в CodeVision там вообще своя библиотека под них есть, но нет хорошей библиотеки для работы с графическим дисплеем, переписывать под CodeVision, avrlib библиотеку графического дисплея, еще хуже чем разобраться с функциями I2C Я просто не очень давно на си пишу и строчки длинные с математическими действиями над регистром меня ставят иногда в тупик =)))
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 22 2011, 18:01
Сообщение #6





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Пробовал вот так
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0xd0);
i2cWaitForComplete();


i2cSendByte(7);
i2cWaitForComplete();
i2cSendByte(rs);
i2cWaitForComplete();
i2cSendStop();
Инициализация

И прочитать

i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0xd0);
i2cWaitForComplete();
i2cSendByte(0);
i2cWaitForComplete();
i2cSendStart();
i2cWaitForComplete();
i2cSendByte(0xd1);
i2cWaitForComplete();
*sec=i2cGetReceivedByte(1);
i2cWaitForComplete();
*min=i2cGetReceivedByte(1);
i2cWaitForComplete();
*hour=i2cGetReceivedByte(0);
i2cWaitForComplete();
i2cSendStop();


И не получается =)))
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 23 2011, 08:02
Сообщение #7


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Дима 128 @ Sep 23 2011, 00:48) *
Так вот и я запускал не одни часы =)))

Я имел в виду, что запускал часики без использования библиотек. Т.е. библиотеки писал самостоятельно.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 08:07
Сообщение #8





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Ну не писать же библиотеку I2C С нуля если она там есть просто не совсем ясно как пользоваться ей =)))
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 23 2011, 11:47
Сообщение #9


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Дима 128 @ Sep 23 2011, 17:07) *
Ну не писать же библиотеку I2C С нуля если она там есть просто не совсем ясно как пользоваться ей =)))

А чего там писать? rolleyes.gif Аппаратный модуль сам все сделает. Почитайте документацию, придет понимание, потом и библиотеку прикрутите)))

Вот писать программный I2C - это да, трудно! Хотя, если честно, тоже просто rolleyes.gif Я где-то в прикрепленной теме (библиотеки полезных программ) лет 5 назад выкладывал библиотеку, которая и аппаратный TWI использует, и позволяет программно шину реализовать.

Если же хочется использовать именно avrlib, то читайте документацию. Там все должно быть.

Ну, а для полного понимания - спецификацию на шину I2C. Я уже Вам это советовал. Когда-то все равно придется это сделать.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 14:59
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Да я на ассемблере запускал его соответственно знаком с этим но что в библиотеки сишной, трудно понять для меня =))

Неужели никто не использовал avrlib?
Go to the top of the page
 
+Quote Post
paskal
сообщение Sep 23 2011, 16:55
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Дима 128 @ Sep 21 2011, 17:02) *
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd0);
_delay_ms(100);
i2cSendByte(0);
_delay_ms(100);
i2cSendStart();
_delay_ms(100);
i2cSendByte(0xd1);
_delay_ms(100);
sek= i2cGetReceivedByte();
min= i2cGetReceivedByte();
hour= i2cGetReceivedByte();


i2cSendStop();


А вы пробовали проверить значение ACK бита которое отдает вам DS1307? Это дало бы какую то информацию. И неплохо знать что какой ACK вы отдаете при чтении.
Еще вот что я думаю. После передачи D0, 00 вы передаете сразу старт условие. А может стоило бы сначала стоп передать?

Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 18:30
Сообщение #12





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Вы про бит чтения.запись? Там получается что у устройства адрес 1101000 семи разрядный + бит этот получается 11010000=0xd0 Я на основе примера из CodeVisin пытался сделать там часы работают

i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_start();
i2c_write(0xd1);
*sec=bcd2bin(i2c_read(1));
*min=bcd2bin(i2c_read(1));
*hour=bcd2bin(i2c_read(0));
i2c_stop();


А вот как это с функциями из avrlib это проделать не знаю что то упускаю пробовал вот так


i2cSetBitrate(100);
i2cInit();


i2cSendStart();

i2cSendByte(0xD0);

i2cSendByte(0);

i2cSendStop();

i2cSendStart();

i2cSendByte(0xD1);

sek=i2cGetReceivedByte();

i2cSendStop();


Но где то ошибка есть =(((



Вот функции которые есть в avrlib

// functions

//! Initialize I2C (TWI) interface
void i2cInit(void);

//! Set the I2C transaction bitrate (in KHz)
void i2cSetBitrate(u16 bitrateKHz);

// I2C setup and configurations commands
//! Set the local (AVR processor's) I2C device address
void i2cSetLocalDeviceAddr(u08 deviceAddr, u08 genCallEn);

//! Set the user function which handles receiving (incoming) data as a slave
void i2cSetSlaveReceiveHandler(void (*i2cSlaveRx_func)(u08 receiveDataLength, u08* recieveData));
//! Set the user function which handles transmitting (outgoing) data as a slave
void i2cSetSlaveTransmitHandler(u08 (*i2cSlaveTx_func)(u08 transmitDataLengthMax, u08* transmitData));

// Low-level I2C transaction commands
//! Send an I2C start condition in Master mode
void i2cSendStart(void);
//! Send an I2C stop condition in Master mode
void i2cSendStop(void);
//! Wait for current I2C operation to complete
void i2cWaitForComplete(void);
//! Send an (address|R/W) combination or a data byte over I2C
void i2cSendByte(u08 data);
//! Receive a data byte over I2C
// ackFlag = TRUE if recevied data should be ACK'ed
// ackFlag = FALSE if recevied data should be NACK'ed
void i2cReceiveByte(u08 ackFlag);
//! Pick up the data that was received with i2cReceiveByte()
u08 i2cGetReceivedByte(void);
//! Get current I2c bus status from TWSR
u08 i2cGetStatus(void);

// high-level I2C transaction commands

//! send I2C data to a device on the bus
void i2cMasterSend(u08 deviceAddr, u08 length, u08 *data);
//! receive I2C data from a device on the bus
void i2cMasterReceive(u08 deviceAddr, u08 length, u08* data);

//! send I2C data to a device on the bus (non-interrupt based)
u08 i2cMasterSendNI(u08 deviceAddr, u08 length, u08* data);
//! receive I2C data from a device on the bus (non-interrupt based)
u08 i2cMasterReceiveNI(u08 deviceAddr, u08 length, u08 *data);

//! Get the current high-level state of the I2C interface
eI2cStateType i2cGetState(void);

#endif
Go to the top of the page
 
+Quote Post
paskal
сообщение Sep 23 2011, 18:37
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Дима 128 @ Sep 23 2011, 21:59) *
Вы про бит чтения.запись? Там получается что у устройства адрес 1101000 семи разрядный + бит этот получается 11010000=0xd0

Нет, я про бит ACK, который идет после бита чтение-запись. Он 9-й по счету. Вам надо читать стандарт I2C, там это написано. И в ваших исходниках реализация этого бита не видна. Может даже ваш контроллер не формирует такт для него из за чего сбивается весь протокол.
Go to the top of the page
 
+Quote Post
Дима 128
сообщение Sep 23 2011, 18:47
Сообщение #14





Группа: Участник
Сообщений: 11
Регистрация: 21-09-11
Пользователь №: 67 312



Как же реализовать это в этих функциях? Я думал там это уже все есть =)))
Go to the top of the page
 
+Quote Post
paskal
сообщение Sep 24 2011, 06:33
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Поэтому надо писать свои функции. Для I2C это не сложно.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016