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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> DS1307Z +AtMega128, Нет старта на TWI
MaksimYrievich
сообщение Jul 11 2011, 20:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Здравствуйте! Столкнулся с проблемой. Модуль TWI отказывается инициировать на шине состояние START. Точнее я не знаю, может оно и создается, но только после установки флага TWINT в TWCR в регистр TWSR почему то загружается значение (0xEC) вместо обещанного (0x08). Я в шоке. Чего я только не пробовал. Сразу приведу функцию установки состояния START. Если кто сталкивался с подобной проблемой подскажите в чём тут дело?
Код
                   //Инициализация i2c шины.
    TWBR     |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0; //Резонатор 14.7456МГц.
    TWSR     &= (~((1<<TWPS1)|(1<<TWPS0)));  
    TWAR    |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5;  //задано произвольно просто чтоб было. МК - мастер.
    TWAR    &= (~((1<<TWGCE)));                                    //запрещаю всякие там общие вызовы моего МК.
    DDRD    |= 1<<PD0|1<<PD1;                                      //SDA и SCL делаю как выходы + PullAp.
    PORTD    |= 1<<PD0|1<<PD1;

//*************************************************
//А это сама функция старт i2c соединения
//*************************************************
static unsigned char i2c_start(void)
{

TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);     //Устанавливается состояние START
while (!(TWCR & (1<<TWINT)));           //Задержка до установки флага TWINT. Он означает что
                    //состояние START было передано
if ((TWSR & 0xF8) == START)            //Проверяем значение в TWI Status Register
        {WriteDisplay(0x30);
      return(0);}
   else
      {WriteDisplay(0x31);
      WriteIndLed(TWSR);
      return(1);}
}

Почему то после прогона МК этой функции светодиоды зажигаются так, что это соответствует коду (0xEC). Значение "0" на дисплее не видел ни разу хоть умри. Кстати для чистоты эксперимента выпаял с шины все девайсы кроме DS1307Z - часы. sad.gif

Сообщение отредактировал IgorKossak - Jul 12 2011, 07:29
Причина редактирования: Оформление кода
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 12 2011, 04:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



1. Инициализировать регистры надо полностью, избавьтесь от &= и |=
Код
TWBR = (1<<TWBR6) | (1<<TWBR5) | (1<<TWBR1) | (1<<TWBR0);
TWSR = 0;
TWAR = 0;


2. i2c_start() вызывается в цикле или однократно? питание DS1307 скорее всего не скидывается?
Можно предположить, что ваши светодиоды зажигаются другой полярностью и ((~0xEC) & 0xF8)=0x10 - Restart transmitted
Значения 0xEC вообще нет в таблицах статусных кодов TWI

3. перепишите условие так:
Код
#define START     0x08
#define RESTART 0x10
......
......
unsigned char st;
......
......
st = TWSR & 0xF8;
if ((st== START) || (st==RESTART))
........


4. осциллом что видно на шине?
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 12 2011, 08:12
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Нет осциллографа. Сейчас попробую переписать код избавиться от &. После обязательньо отпишусь Функция i2c_start(); сейчас в коде вызывается однократно, питание на DC1307 не скидывается исключено.

Избавился от &. Ничего не дало. Код инициализации МК теперь такой:

//Инициализируем i2c шину.
TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0;
TWSR = 0; //&= (~((1<<TWPS1)|(1<<TWPS0)));
TWAR = 0; //|= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5;
//TWAR //&= (~((1<<TWGCE)));
DDRD |= 1<<PD0|1<<PD1;
PORTD |= 1<<PD0|1<<PD1;

Теперь на светодиодах ничего не горит.Это как бы означает, что в TWSR всё по нулям. Диоды зажигаются не в инверсии. На экране горит единица. Да и еще заработал зумер, у меня это значит что МК начал проходить через начало программы, то есть через сторожевой таймер.

Если в TWSR всё по нулям значит ошибка формирования состояния старт. Буду приподнимать ноги у DS1307 c шины.

Приподнял ноги у DS1307 над платой и ничего не изменилось. На экране единица. Код я не изменял. На светодиодах пусто. Ничего не понимаю!!

Сообщение отредактировал MaksimYrievich - Jul 12 2011, 07:55
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jul 12 2011, 08:17
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



погоняй в цикле старт-condition и стоп-condition с задержкой после старт в ~10 ms, и после стоп в несколько секунд.
И ищи осцилл
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2011, 10:44
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Не знаю , конечно , но вот эти строчки мне абсолютно не нравятся.
Цитата
TWBR |= 1<<TWBR6|1<<TWBR5|1<<TWBR1|1<<TWBR0;
TWSR = 0; //&= (~((1<<TWPS1)|(1<<TWPS0)));


Поставька вместо них формулу
TWBR|=SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR
SYSCLK=14.7456МГц
SCL_Freq= 100Khz
В итоге в TWBR пишется 0х41 так, что ещё и прескалер нафинг не нужон
TWSR = 0; //&= (~((0<<TWPS1)|(0<<TWPS0)));


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 12 2011, 21:30
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(ILYAUL @ Jul 12 2011, 14:44) *
Не знаю , конечно , но вот эти строчки мне абсолютно не нравятся.


Поставька вместо них формулу
TWBR|=SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR
SYSCLK=14.7456МГц
SCL_Freq= 100Khz
В итоге в TWBR пишется 0х41 так, что ещё и прескалер нафинг не нужон
TWSR = 0; //&= (~((0<<TWPS1)|(0<<TWPS0)));


Да согласен так лучше. Видать ассемблер во мне еще не совсем переломался. Очень по деловому замутчено. Я поменял МК на мегу 64 и то же самое почти осталось за исключением кода в TWSR. Теперь в нем код стал читабельным и светодиоды его высветили как $A0, что, насколько я понимаю, означает "Было обнаружено состояние СТАРТ или ПОВСТАРТ в то время, когда устройство было адресовано в качестве ведомого". Всетаки 128 Мегу я чем то кайфанул maniac.gif . Да, но теперь, когда я от шины i2c откинул все ноги - шина сейчас пустая! Как может быть 0xA0?

Сообщение отредактировал MaksimYrievich - Jul 12 2011, 22:02
Прикрепленные файлы
Прикрепленный файл  AtMega128_PHR_04_02_Init.rar ( 1.15 килобайт ) Кол-во скачиваний: 29
 
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 06:06
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(MaksimYrievich @ Jul 13 2011, 01:30) *
Да согласен так лучше. Видать ассемблер во мне еще не совсем переломался. Очень по деловому замутчено. Я поменял МК на мегу 64 и то же самое почти осталось за исключением кода в TWSR. Теперь в нем код стал читабельным и светодиоды его высветили как $A0, что, насколько я понимаю, означает "Было обнаружено состояние СТАРТ или ПОВСТАРТ в то время, когда устройство было адресовано в качестве ведомого". Всетаки 128 Мегу я чем то кайфанул maniac.gif . Да, но теперь, когда я от шины i2c откинул все ноги - шина сейчас пустая! Как может быть 0xA0?

Ну и что я увидел в приложенном коде
Цитата
TWSR = 0; //&= (~((1<<TWPS1)|(1<<TWPS0)));

а что было написано чуть выше?
Ну и проц заменен , тогда и это надо менять
#include "AtMega128_PHR_04_02_Init.h"

ЗЫ Кстати формула взята из проекта на asm

ЗЫ ЗЫ И вот ещё
Цитата
DDRD |= 1<<PD0|1<<PD1;
//PORTD |= 1<<PD0|1<<PD1;

Шина TWI она же I2C требует внешних PULL резисторов - приблизительно 4,7 Ком поэтому внутренняя подтяжка (строчка 2) ей пофинг. Они у Вас есть? Внутренние ~ 30 Kom
Портам ,в режиме альтернатыных функций , например TWI - плевать как сконфигурирован порт (кроме специально обговорённых режимов- читать DS) . Вход он или выход, начхать, так что удаляйте эти две строки и если резисторов нет - "вешайте"


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 13 2011, 09:27
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(ILYAUL @ Jul 13 2011, 10:06) *
Шина TWI она же I2C требует внешних PULL резисторов - приблизительно 4,7 Ком поэтому внутренняя подтяжка (строчка 2) ей пофинг. Они у Вас есть? Внутренние ~ 30 Kom


Да внешние резисторы висят 4.7 кОм. Всё равно пишет что устройство уже адресовано код я тоже переделал. А может быть это какая нибудь наводка на шину идет? Может конденсаторы на нее прилепить?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 09:45
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вы прескалер убрали?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 13 2011, 09:48
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(ILYAUL @ Jul 13 2011, 13:45) *
Вы прескалер убрали?


Да я Убрал прескаллер

Сообщение отредактировал MaksimYrievich - Jul 13 2011, 09:49
Прикрепленные файлы
Прикрепленный файл  AtMega128_PHR_04_02_Init.rar ( 1.14 килобайт ) Кол-во скачиваний: 22
 
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 10:28
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(MaksimYrievich @ Jul 13 2011, 13:48) *
Да я Убрал прескаллер

Вы , что старый код положили?

Цитата
//Инициализируем i2c шину.
TWBR |= SYSCLK/(2*SCL_Freq)-8 ;
//TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); здесь деление частоты на 64 - эта строчка должна быть удалена. Это прескалер и где Вы его убрали?
TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5;
//TWAR &= (~((1<<TWGCE)));
//DDRD |= 1<<PD0|1<<PD1;
//PORTD |= 1<<PD0|1<<PD1;
Эти две тоже - удалить


В asm ,раз уж Вы его знаете, это всё что нужно для инит I2C (TWI):
Код
;**************************************************
;*        ;;/Init Bit Rate fot TWI;;*              *
;**************************************************
        ldi    temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR
        sts    TWBR,temp            ;+ TWI=384 Khz
;**************************************************


А так выглядит START и ПОВСТАРТ:

Код
;**************************************************
;*     ;;+Подпрограмма Init TWI_START;;*         *
;*  ;;+Формирование START и проверка ответа.;;*  *
;**************************************************
TWI_START:
        ldi        temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
        sts        TWCR,temp        ; формирование режима START
waitST:
        lds        temp,TWCR        ; Проверка бита TWINT
        sbrs    temp,TWINT
        rjmp    waitST            ; Не получен -цикл
        lds        temp,TWSR        ; Проверка кода ответа
        cpi        temp,START
        breq    RETURN            ; Правильный код -выход из подпрограммы
        cpi        temp,REPSTART
        brne    TWI_START        ; Нет - повтор.
RETURN:
        ret


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 13 2011, 10:38
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(ILYAUL @ Jul 13 2011, 14:28) *
Вы , что старый код положили?


Так они же закоментированы?

Сообщение отредактировал MaksimYrievich - Jul 13 2011, 10:41
Прикрепленные файлы
Прикрепленный файл  AtMega128_PHR_04_02_Init.rar ( 1.08 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 10:44
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(MaksimYrievich @ Jul 13 2011, 14:38) *
Так они же закоментированы?

Да,не обратил внимание. SCL SDA не перепутали?

И закоментируйте
Цитата
TWAR |= 1<<TWA0|1<<TWA1|1<<TWA3|1<<TWA5;


И это почему осталось старой , если проц уже другой

Цитата
#include "AtMega128_PHR_04_02_Init.h"


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Jul 13 2011, 10:46
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Цитата(ILYAUL @ Jul 13 2011, 14:44) *
SCL SDA не перепутали?


Нет не перепутал. причем даже если ноги у МК оторвать от шины то всё равно в TWSR 0xA0 получается
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 13 2011, 11:04
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(MaksimYrievich @ Jul 13 2011, 14:46) *
Нет не перепутал. причем даже если ноги у МК оторвать от шины то всё равно в TWSR 0xA0 получается

Да, нужен осцил . У Вас питания проца и DS не разные случайно? И судя по коду 0xA0 проц находится в режиме "ведомого приемника". И это из-за TWAR т.к. Вы внесли в него адрес
А как только в TWCR Вы устанавливаете TWEA и TWEN - он вкл. режим "Ведомый приемник" и ждёт когда его адресуют
TWAR - заносится личный адрес процессора на шине TWI, если процессоров в проекте не один и они могут адрресовать друг друга - в режиме с одним процем и если он должен быть мастером там должны быть 00000000


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


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


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