Подписаться на получение новых статей на почту:

Применение двух ведущих AVR и DS1307 по TWI. Шаг №35.

Всем привет. Вот и настало время попрактиковаться с библиотекой для TWI, которую я напомню мы рассмотрели в прошлой статье, а также принцип взаимодействия программы с встроенным модулем и ее возможности. Ну и вопросы синхронизации и приоритета. Что ж приступим. Начнем с симулятора, закончим в железе. Сравним результат работы. Как я и писал схема подключения будет следующей: два микроконтроллера ATmega 8, часы реального времени DS1307. Рисунок ниже.

Порядок их работы будет следующим: МК2 используя два режима ведущий передатчик / приемник будет считывать с часов DS1307 минуты и часы. Далее МК1, по прошествии некоторого времени, переходит в режим ведущий приемник, в свою очередь МК2 в режим ведомый передатчик, который пересылает МК1 данные времени, тот в свою очередь выводит их на дисплей.

Две Atmega и DS1307 по TWI

Все что нам необходимо у нас есть. Итак берем библиотеку, которую  рассмотрели в прошлой статье. Добавляем файл i2c.c в Makefile (настройка Makefile) и все приступаем к налаживанию. Как вы поняли у нас будет две папки с исходными файлами. Для одного микроконтроллера и для другого. Какие использовать функции мы с Вами также рассмотрели в прошлой статье. Единственно еще раз повторюсь в функции инициализации проверьте порты. Хочется остановится на двух функциях это ведомый передатчик и приемник. Автор оставил возможность самим прописать алгоритм приема/передачи информации. Как Вы увидите ничего сложного. Ниже у нас код для первого контроллера и для второго. Давайте их рассмотрим.

#define LOCAL_ADDR 0xA0 //Адрес микроконтроллера, необходим только для ведомого режима
#define TARGET_ADDR 0×07 //Адрес ведомого мк к которому обращаемся
int main (void)
{
     …………………………...
i2cInit (); //Инициализируем модуль
while (1)
{
i2cSetLocalDeviceAddr (LOCAL_ADDR, TRUE); /*записываем адрес,в адрес регистра, только для ведомого режима*/
i2cMasterReceive (TARGET_ADDR,2,&buf1[0]); /*Режим ведущий прием. Передаем в функции адрес ведомого к которому обращаемся, длину массива и ссылку массива данных куда будут записываться данные*/
h = buf1[1];  //Во втором элементе передаем часы
h = (((h & 0xF0) >> 4)*10)+(h & 0x0F);
/*Преобразовываем в десятичный формат. Более подробно в статье №30*/
m = buf1[0];//В первом элементе передаем минуты
m = (((m & 0xF0) >> 4)*10)+(m & 0x0F);
i=h+(m*0.01);//Для вывода на дисплей в формате времени ЧЧ.ММ
Display (i);
_delay_ms (1000);
}
}
 ISR (TIMER0_OVF_vect)/*Динамическая индикация*/
{

led_update ();
}

Код второго микроконтроллера:.

#define LOCAL_ADDR 0×07  /*Здесь также прописываем адреса, только обратите внимание наоборот*/
#define TARGET_ADDR 0xA0

/*Функция передачи от ведомого к ведущему.Эта та функция которую мы должны сами прописать. Ничего сложного*/
i2cSlaveTransmitService (u08 transmitDataLengthMax, u08* transmitData)
{
for (u08 i=0; i<2; i++)
{
*transmitData++ = buf1[i]; /*Заполняем буфер передачи*/
}
return 2;
}

int main (void)
{
u08 h;
u08 m;
    /*Массив с адрессами регитров часов*/
unsigned char buf[2]={0×01,0×02};/*Минуты и часы*/
i2cInit (); /*Производим инициализацию интерфейса,
подробнее статья №29*/
while (1)
{
    /*Опрос часов*/
_delay_ms (100);
i2cMasterSend (0xD0,1,&buf[0]); /*Записываем номер регистра к которому будем обращаться*/
i2cMasterReceive (0xd0,1,&m);   /* Считываем данные из часов*/
buf1[0]=m;                                    /*Заносим показания в буффер*/
i2cMasterSend (0xD0,1,&buf[1]);
i2cMasterReceive (0xd0,1,&h);
buf1[1]=h;
_delay_ms (1000);
i2cSetLocalDeviceAddr (LOCAL_ADDR, TRUE);/*адрес ведомого микроконтроллера*/
/*Передаем данные от ведомого к ведущему*/
i2cSetSlaveTransmitHandler (i2cSlaveTransmitService);
}
}

На рисунке ниже результат работы программы на AVR. Давайте рассмотрим и разберем.

Два ведущих AVR и DS1307 по TWI

На рисунке выше видно, как сначала МК2 опрашивает часы, естественно в роли ведущего, обведено красным, соответственно данные занесены в h, m. Далее происходит переключение МК2 в режим ведомый передатчик. На рисунке видно как данные занесенные в массив i2cSendData отправляются по шине МК1 (обведено зеленым, цифра 2). Соответственно МК1 в режиме ведущий приемник. На рисунке видно что в массив i2cReceiveData МК1 записались данные, ну и далее на индикатор.

Но не все так гладко в симуляторе. При передаче информации от ведомого к ведущему иногда проявляется ошибка. По шине передается мусор. Хотя данные в массиве те же и не меняются. На рисунке ниже изображена данная ситуация. Как видите в наладчике под цифрой два передается мусор, хотя данные в передатчике нормальные. К счастью она возникает в симуляторе.

Две Atmega и DS1307 по TWI - ошибка

Программа в железе отработала нормально. Единственно, что в железе придется следить, что б не возникало ситуаций, о которой мы писали в предыдущей статье – это одновременного обращения ведущих. Эту задачу мы уже должны решать сами. На рисунке ниже результат работы в железе.

Две Atmega и DS1307 по TWI в железе

Ниже выкладываю исходные файлы и проект в симуляторе. В общем пробуйте и экспериментируйте.

Два ведущих и одно ведомое по интерфейсу TWI ( Скачали: 120 чел. ) 

В следующей статье рассмотримспящий (ждущий) режим. Рассмотрим случаи его применения, настройку и прикрутим к своему проекту. На этом все. Всем пока.

Просмотрено 1919 раз.

Я на Google+

Применение двух ведущих AVR и DS1307 по TWI. Шаг №35.: 2 комментария

  1. Здравствуйте. У Вас описывается описывается здесь три режима. Это ведущий приемник/передатчик, ведомый передатчик. А какая функция отвечает за ведомый приемник, и как она работает?

    • Здравствуйте. Да действительно три режима. В режиме ведомый приемник нет ничего сложного. Если Вы посмотрите предыдущую статью №34, там мы использовали библиотеку. Для ведомого приемника используйте — void i2cSetSlaveReceiveHandler (void (*i2cSlaveRx_func)(u08 receiveDataLength, u08* recieveData)); В симуляторе она так же себя ведет как и ведомый передатчик. В следующей статье постараюсь применить ее в касестве примера с пробуждением по адресу.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting