Пятница, 19.04.2024, 18:26
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по МК » IButton (1wire) (DS1990)
IButton (1wire)
vit701-Дата: Вторник, 10.08.2010, 23:58 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 1
Статус: Offline
Решил сделать эмулятор ключа домофона. Считывать код ключа научился, проверил в proteus. Все хорошо.
Вот только никак не могу понять, как посчитать контрольную сумму CRC.

Например 01 A9 F9 1D 05 00 00 (CRC???)

Может у кого есть какие наработки по подсчету crc.

Сообщение отредактировал vit701- - Среда, 11.08.2010, 18:04
 
HiSERДата: Среда, 11.08.2010, 09:02 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
В даташите к ds1990 написан пример расчета CRC8

Code

#define DS1990_FAMILY 1

typedef unsigned char byte;
//|8-bit family|48-bit serial number|8-bit crc|
typedef struct {
byte family;
byte sn[6];
byte crc;
}t1wds;

t1wds ibutton;

//calc crc 7 bytes, to 8 byte crc
#pragma warn-
void ds_crc(byte *b) {
#asm
push r16
push r17
push r18
push r26
push r27
clr r31
ldi r18,0x18
ld r26,y
ldd r27,y+1
ldi r17,7
_do_crc:
ld r30,x++
push r30
ldi r16,8
_crc_loop:
eor r30,r31
ror r30
mov r30,r31
brcc _zero
eor r30,r18
_zero:
ror r30
mov r31,r30
pop r30
lsr r30
push r30
dec r16
brne _crc_loop
pop r30
dec r17
brne _do_crc
st x,r31
pop r27
pop r26
pop r18
pop r17
pop r16
#endasm
}
#pragma warn+

..........................

ibutton.family=DS1990_FAMILY;
ibutton.sn[0]=0;
ibutton.sn[1]=0;
ibutton.sn[2]=0;
ibutton.sn[3]=0;
ibutton.sn[4]=0;
ibutton.sn[5]=0;

ds_crc((byte*)&ibutton); //ibutton.crc=0x3d;
 
HiSERДата: Четверг, 12.08.2010, 09:40 | Сообщение # 3
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
А что там связывать, в регистре Y хранится передаваемые параметры функции, в регистре Z возвращаемые параметры функции.
t1wds это тип, который описан выше.

библиотека 1wire.h написана для master'а, в данном случае делается устройство slave.

reset:
мастер опускает линию на 480us<=x<960us.
после чего слейв должен ответить
presence:
слейв опускает линию на 60us<=x<240us, кадр должен быть 480<=x<пока не восстановится линия (pullup)
после чего слейв читает первую команду.

передача бит от слейва к мастеру, инициализируется мастером, а не слейвом.

в даташите все это описано.

Добавлено (12.08.2010, 09:40)
---------------------------------------------
И слейв должен ловить мастера по внешнему прерыванию (INTx)

 
Форум » Микроконтроллеры » Вопросы по МК » IButton (1wire) (DS1990)
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz