Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 1-Wire
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
D H
Не получается корректно прочитать iButton. Т.е. читается что-то из линии, но совсем не то.
В наличии имею две iButton, считанный код для каждой уникальный и повторяется при каждом чтении.
Ткните носом, где не прав.

Запись:
CODE
void Wire1_WriteBit(unsigned char cBit)
{
WIRE1_DN();
if(cBit==0) delay_us(60);
if(cBit==1) delay_us(1);
WIRE1_UP(); // Отпускание линии
if(cBit==0) delay_us(1);
if(cBit==1) delay_us(60);
}



void Wire1_SendByte(unsigned char data)
{
unsigned char temp;
unsigned char i;

SetBit(Wire1DDR,Wire1Bit); // Перевод порта в режим записи

for (i = 0; i < 8; i++) // Отправка байта в линию
{
temp = data & 0x01;
if (temp)
{
Wire1_WriteBit(1);
}
else
{
Wire1_WriteBit(0);
}
data >>= 1;
}

ClearBit(Wire1DDR,Wire1Bit); // Перевод порта в режим чтения
}


Чтение:
CODE
unsigned char Wire1_ReadBit()
{
unsigned char ReadBit=0;

SetBit(Wire1DDR,Wire1Bit); // Перевод порта в режим записи
WIRE1_DN(); // Линия вниз
delay_us(1);
WIRE1_UP(); // Линия вверх

ClearBit(Wire1DDR,Wire1Bit); // Перевод порта в режим чтения
delay_us(14);

// Чтение линии 1-Wire
if( IsBitSet(Wire1Pin, Wire1Bit) ) ReadBit=1; // В линии 1

return ReadBit;
}


unsigned char Wire1_ReadByte()
{
unsigned char data;
unsigned char i;

data = 0x00;

for (i = 0; i < 8; i++)
{
data >>= 1;
if (Wire1_ReadBit())
{
data |= 0x80;
}
}
return data;
}


После посылки Reset и приема Presence
Делаю так:
CODE

Wire1_SendByte(0x33); // Отправка команды чтения серийного номера

lcd_gotoxy(0,0);
for(i=0;i<8;i++)
{
cByte[i]=0; // Чтение одного байта из устройства
cByte[i]=Wire1_ReadByte(); // Чтение одного байта из устройства
if(i==5) lcd_gotoxy(0,1);
sprintf(cStr, "%2x ", cByte[i]);
lcd_puts(cStr);
}
Палыч
На форуме в настоящее время уже обсуждаются две темы с таким же названием:
http://electronix.ru/forum/index.php?showtopic=80541
http://electronix.ru/forum/index.php?showtopic=80508

Вы читали эти обсуждения? Остались вопросы?
D H
Цитата(Палыч @ Sep 21 2010, 10:24) *
На форуме в настоящее время уже обсуждаются две темы с таким же названием:
http://electronix.ru/forum/index.php?showtopic=80541
http://electronix.ru/forum/index.php?showtopic=80508

Вы читали эти обсуждения? Остались вопросы?


Спасибо, прочитал. Ошибку нашел. В конце функции чтения бита необходимо было сделать задержку 45us, для выдержки тайминга в соответствии с даташитом.

CODE

unsigned char Wire1_ReadBit()
{
unsigned char ReadBit=0;

SetBit(Wire1DDR,Wire1Bit); // Перевод порта в режим записи
WIRE1_DN(); // Линия вниз
delay_us(1);
WIRE1_UP(); // Линия вверх

ClearBit(Wire1DDR,Wire1Bit); // Перевод порта в режим чтения
delay_us(14);

// Чтение линии 1-Wire
if( IsBitSet(Wire1Pin, Wire1Bit) ) ReadBit=1; // В линии 1
delay_us(45); // <------------------------------------------------- Ошибка была здесь

return ReadBit;
}
domowoj
Чтобы не плодить темы, задам вопрос здесь!
Имеем.
Простейшая читалка идентификационного кода устройств с протоколом 1-Wire на Tiny24 с МЕЛТовским индикатором.
Отлично работает.
НО
некоторые таблетки iButton не читает или читает все "0".
Стал разбираться, оказывается таблетка садит сигнал почти до 1 вольта,
причем в домофоне эта же табл. отлично работает.
Подтягивающий резистор 3кОм.
Кто с таким сталкивался.
ukpyr
может нужен active pullup?
domowoj
Цитата(ukpyr @ Sep 25 2010, 14:01) *
active pullup?

А это как?
xemul
Цитата(ukpyr @ Sep 25 2010, 11:01) *
может нужен active pullup?

Active pullup вряд ли нужен для работы с одним слэйвом на стандартной скорости и на минимальном (судя по ...) расстоянии.
Если Вы про strong pullup, то чтобы оно стало нужно, мастер сначала должен подать слэйву команду, требующую спецпайка. Здесь же всё затыкается ещё на READ ROM.
Могу предположить, что проблемы возникают не с оригинальными таблетками, а с китайскими аналогами - с ними желательно обеспечить >=10 мкс между битами (или вообще увеличить этот интервал в 1.5-2 раза; далласовские таблетки работают и на 6-7 мкс паузе).
domowoj
Да, похоже, китайские.
Вот картинка на фоне команды 33Н
масштабы 2В/см и 100мксек/см
xemul
Цитата(domowoj @ Sep 26 2010, 19:22) *
Да, похоже, китайские.
Вот картинка на фоне команды 33Н
масштабы 2В/см и 100мксек/см

Что-то очень стра[нш]ное. Где команда, непонятно, но мастер явно не может обеспечить 0 на шине.
Китайские аналоги может и не однояйцевые близнецы с оригиналом, но и не настолько отличаются, чтоб такое безобразие устроить.
domowoj
Красная линия - "0" , масштаб - 2В/см, резистор подтяжки уже 560Ом поставил,
так что мастер нуль обеспечивает.
(два коротких, два длинных, два коротких, два длинных импульса к 0 и есть команда 33Н)
Самое интересное, что эта табл. с домофоном-то работает!!!

Надо наверно временами попробовать поиграться
xemul
Цитата(domowoj @ Sep 27 2010, 05:44) *
так что мастер нуль обеспечивает.

Иногда, когда совпадают желания мастера и слэйва. Третий уровень - имхо, конфликт мастера, _активно_ тянущего вверх, и слэйва, тянущего вниз.
Цитата
Надо наверно временами попробовать поиграться

Скорее, где-то 1 досылается и в DDR, и в PORT (AVR assumed).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.