Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.10.2006, 19:03
|
|
Частый гость
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Это что попытка втянуть в диспут об отношении к жизни, к трудолюбию,соответственно далее перейти к личности и закончить национальным вопросом.
"Минуточечку" Вы на форуме по микроконтроллерам где задают вопросы-помощь и терпеливо ожидают ответа или помощи от всех я так понимаю желающих и конечно знающих и не зависимо от возраста и лица.
Единственное желание это ускориться в получении знаний.Если можете подскажите,не можете не беда спросите может и Вам подскажут.
Всеравно с глубоким уважением.
|
|
|
|
13.10.2006, 10:46
|
|
Временная регистрация
Регистрация: 17.05.2006
Сообщений: 72
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Господа инженеры! Отошли от темы - человек уже замок собирает с iButton, можно успокоиться.
PS Кстати, если чего не понятно с ключами iButton, могу попробовать помочь, имел опыт программирования под эти ключи.
__________________
"Имею честь иметь Вашу честь в своём доме..."
|
|
|
|
13.10.2006, 19:33
|
|
Частый гость
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
на Си начал процесс написания программы чтения,записи ds1990 и если прописан в EEPROM т.е ОН, то засветить светодиод,а начал потому что пока трудно сразу сесть и написать.С чего начать?
|
|
|
|
14.10.2006, 22:51
|
|
Частый гость
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
пока изучаю теорию благо ее много может кто поделится практическими программами наработками связанными с теорией написания на Си для чтения ключа ds1990a понятен WINAVR и СodeVision может я не наверном пути
заранее благодарен.
|
|
|
|
16.10.2006, 15:16
|
|
Временная регистрация
Регистрация: 17.05.2006
Сообщений: 72
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Начать надо с изучения протокола обмена с ключом.
Вот кусок кода, который обеспечивает считывание кода далласовского ключа (iButton).
ВНИМАНИЕ!!!
Этот код написан для меги32 с тактовой 16 МГц! На другой частоте работать не будет!
Прекрасно понимаю, что код написан непрофессионально. Использование задержек в виде пустых циклов - дурной стиль. Но этому есть следующие объяснения:
1. временные промежутки протокола очень малы и сделать их анализ даже при частоте 16 МГц с помощью таймеров сложновато. Правда, можно использовать вход ICP процессора и мерять промежутки времени между сменами сигнала, но это следующий этап;
2. данный код абсолютно последователен и понятен для чтения.
Данный код работоспособен, но надо перед его выполнением запретить все прерывания. Иначе временные промежутки поплывут и работать он перестанет.
Можно его самого запихнуть в обработчик от таймера, но всё равно - вложенных прерываний быть не должно.
Код:
|
// 1. Выдать сброс линии
RESET_iB_LINE
// 2. Задержка на 500 мкс. 1 цикл ~ 0.5 us для тактовой частоты 16 МГц
timer=0;
while (timer ‹ 1000) {timer++;}
// 3. Установить линию в 1
SET_iB_LINE
// 4. Задержка на 5 мкс
timer=0;
while (timer ‹ 10) {timer++;}
// 5. Ожидание ответа в течении 70 мкс. 1 цикл ~ 0.7 us для тактовой частоты 16 МГц
flg=NO;
timer=0;
while (timer‹100 && flg==NO)
{
timer++;
if (iB_LINE == 0)
flg=YES;
}
// 6. Если получен ответ, то дождаться его снятия в течении 250 мкс. 1 цикл ~ 0.7 us
if (flg == YES)
{
flg=NO;
timer=0;
while (timer‹357 && flg==NO)
{
timer++;
if (iB_LINE != 0)
flg=YES;
}
// 7. Если ответ снят, то передать команду "Запрос кода"
if (flg == YES)
{
// 7.1. Задержка 2,5 мкс
timer=0;
while (timer ‹ 5) {timer++;}
data_mask=0x01;
do
{
// 7.2. Задержка 10 мкс
timer=0;
while (timer ‹ 20) {timer++;}
// 7.3. Установка СТАРТа
RESET_iB_LINE
// 7.4. Задержка 10 мкс
timer=0;
while (timer ‹ 20) {timer++;}
// 7.5. Выдача бита
if ((REQUEST_BYTE & data_mask) != 0)
SET_iB_LINE
data_mask‹‹=1;
// 7.6. Задержка 75 мкс
timer=0;
while (timer ‹ 150) {timer++;}
// 7.7. Установка СТОПа
SET_iB_LINE
}
while (data_mask != 0);
// 7.8. Задержка для вывода СТОПа 2,5 мкс
timer=0;
while (timer ‹ 5) {timer++;}
// 8. Приём данных
byte_count=0;
do
{
data_mask=0x01;
iB_reg=0;
do
{
// 8.1. Установка СТАРТа
RESET_iB_LINE
// 8.2. Задержка 6 мкс
timer=0;
while (timer ‹ 12) {timer++;}
// 8.3. Снятие СТАРТа
SET_iB_LINE
// 8.4. Считывание значения бита через 4 мкс
timer=0;
while (timer ‹ 8) {timer++;}
if (iB_LINE != 0)
iB_reg |=data_mask;
data_mask‹‹=1;
// 8.5. Задержка для вывода СТОПа 50 мкс
timer=0;
while (timer ‹ 100) {timer++;}
}
while (data_mask != 0);
P_Data.iButton.iB_Data[P_Data.iButton.EndPointer].Data[byte_count]=iB_reg;
byte_count++;
}
while (byte_count != NUM_iB_DATA);
// 9. Закончен приём данных
P_Data.iButton.EndPointer++;
if (P_Data.iButton.EndPointer == NUM_MESS_iB)
P_Data.iButton.EndPointer=0;
P_Data.iButton.MesCounter++;
}
} |
Кстати, там есть ещё одна фича - подсчёт CRC.
Я использую такую функцию:
Код:
|
/*
Функция подсчёта CRC для полинома {10011001}
*/
unsigned char CRC_calc(unsigned char *data)
{
unsigned char CRC, A, C, ACC, byte, bit, zero;
CRC=0;
zero=0;
for (byte=0; byte ‹ (NUM_iB_DATA-1); byte++)
{
zero|=data[byte];
A=data[byte];
ACC=A;
for (bit=0; bit ‹ 8; bit++)
{
A^=CRC; // XRL A,CRC
if (C==0) { if ((A&0x01) == 0) C=0; else C=1; // RRC A
A››=1;
}
else { if ((A&0x01) == 0) C=0; else C=1;
A››=1; A|=0x80;
}
A=CRC; // MOV A,CRC
if (C != 0) // JNC ZERO
A^=0x18; // XRL A,#18H
if (C==0) { if ((A&0x01) == 0) C=0; else C=1; // ZERO: RRC A
A››=1;
}
else { if ((A&0x01) == 0) C=0; else C=1;
A››=1; A|=0x80;
}
CRC=A; // MOV CRC,A
ACC››=1; // RR ACC
A=ACC;
}
}
if (CRC == data[NUM_iB_DATA-1] && zero != 0)
return TRUE;
else
return FALSE;
} |
Опять же, простите за непрофессионализм, но эта функция была переделана из асмовской функции для 51-го контроллера методом прямого преобразования асмовских команд в сишный текст. Зато работает.
__________________
"Имею честь иметь Вашу честь в своём доме..."
|
|
|
|
16.10.2006, 19:47
|
|
Частый гость
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Большое спасибо.
Есть НАЧАЛО от чего отталкнуться.
|
|
|
|
05.02.2007, 21:36
|
|
Прохожий
Регистрация: 24.01.2007
Сообщений: 2
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пытаюсь реализовать считыватель DS1990A (ATmega8, кварц 7.3728, подтягивающий резистор на линии данных 5.1 кОм, таблетка рабочая).
На импульс сброса "таблетка" отвечает, однако послав команду 0x33 в ответ читаю восемь байт 0xff. Основной вопрос верна ли моя последовательность действий при считывании, я делаю так:
Код:
|
while (1)
{
if (ib_DetectPresence() == 0x00) // Обнаружен ответный сигнал
{
ib_write(0x33);
for (g=1; g‹=8; g++)
USART_Transmit(ib_read());
}
} |
Программа полностью. Данные шлются на ПК по UART.
Код:
|
#include ‹avr/io.h›
#include ‹mylib.h›
#include ‹uart.h›
#include ‹avr/delay.h›
#define F_CPU 7372800
// определение портов для шины 1-wire
#define OW_PORT PORTC
#define OW_DDR DDRC
#define OW_PIN PINC
#define OW_BUS PC1
#define OW_BUS_MASK (1 ‹‹ OW_BUS)
/************************************************** ***************************
Задержки Bit Transfer Layer, рекомендованные в AN126 от Dallas Semicondactors
и в AN318 от ATMEL
************************************************** ***************************/
#define CPU_CYCLE 137// длительность командного цикла МК в нс для 7.3728 MHz
#define COMM_PER_US (1000 / CPU_CYCLE) // количество команд CPU за микросекунду
#define OW_DEL_A 10 * COMM_PER_US
#define OW_DEL_B 60 * COMM_PER_US
#define OW_DEL_C 70 * COMM_PER_US
#define OW_DEL_D 10 * COMM_PER_US
#define OW_DEL_E 9 * COMM_PER_US
#define OW_DEL_F 55 * COMM_PER_US
#define OW_DEL_G 0 * COMM_PER_US
#define OW_DEL_H 480 * COMM_PER_US
#define OW_DEL_I 70 * COMM_PER_US
#define OW_DEL_J 410 * COMM_PER_US
void wait_us(unsigned short time_us) // max time_us 65536 = max delay 262144 cucles
{
if (time_us‹255)
{
_delay_loop_1(time_us/3);
}
else
{
_delay_loop_2(time_us/4);
}
}
/************************************************** ***************************
Определение устройства на шине.
************************************************** ***************************/
char ib_DetectPresence(void)
{ char status;
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка H нахождения шины в 0
wait_us(OW_DEL_H);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка I до окончания таймслота 70us
wait_us(OW_DEL_I);
// читаем состояние шины
status = OW_PIN & OW_BUS_MASK;
// задержка J до окончания таймслота
wait_us(OW_DEL_J);
return status;
}
/************************************************** ***************************
Запись на шину 1
Шина должна быть установлена в 0 на время 1-15 мкс
************************************************** ***************************/
void OW_WriteBit1(void)
{
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка A нахождения шины в 0 (10 мкс)
wait_us(OW_DEL_A);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка B до окончания таймслота (60)
wait_us(OW_DEL_B);
}
/************************************************** ***************************
Запись на шину 0
Шина должна быть установлена в 0 на время 60-120 мкс
************************************************** ***************************/
void OW_WriteBit0(void)
{
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка C нахождения шины в 0 (60 мкс)
wait_us(OW_DEL_C);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка D до окончания таймслота (10)
wait_us(OW_DEL_D);
}
/************************************************** ***************************
Посылка байта в устройство
************************************************** ***************************/
void ib_write(char data)
{ char count;
// формируем счетчик бит
count = 8;
// цикл вывода бит на шину
do
{ //выводим очередной бит начиная с младшего
if(data & 0x01)
{ OW_WriteBit1();
}
else
{ OW_WriteBit0();
}
// сдвигаем данные вправо и проверяем окончание цикла
data ››= 1;
wait_us(20);
}
while(--count);
}
/************************************************** ***************************
Сигнал чтения шины
Шина должна быть установлена в 0 на время 1-15 мкс. После этого, в течении
15 мкс устройство должно удерживать шину в 0, если требуется послать 0, если
требуется послать 1, устройство не подает никаких сигналов по шине
Выход: status содержит состояние шины (0 при 0 или не 0 при 1)
************************************************** ****************************/
char OW_ReadBit(void)
{ char status;
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка A нахождения шины в 0 (10)
wait_us(OW_DEL_A);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка E до удержания датчиком сигнала на линии (9)
wait_us(OW_DEL_E);
// читаем состояние шины
status = OW_PIN & OW_BUS_MASK;
// задержка F до окончания таймслота (55)
wait_us(OW_DEL_F);
return status;
}
/************************************************** ***************************
Прием байта из устройства.
Возвращает принятый байт.
************************************************** ***************************/
char ib_read(void)
{ char count, data;
//формируем счетчик бит
count = 8;
// цикл чтения бит с шины
do
{ // сдвигаем данные вправо
data ››= 1;
// формируем бит в байте данных
if(OW_ReadBit())
{ data |= 0x80;
}
}
while(--count);
return data;
}
int main(void)
{
int g;
PORTC = 0x00;
DDRC |= 0x20;
Init_uart();
SendText("iButton reader");
CRLF();
SendText("Please touch the ibutton...");
CRLF();
while (1)
{
if (ib_DetectPresence() == 0x00)
{
ib_write(0x33);
for (g=1; g‹=8; g++)
USART_Transmit(ib_read());
}
wait_us(65000);
}
return 0;
} |
|
|
|
|
05.02.2007, 22:06
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Предлагаю почитать здесь: http://www.masterkit.ru/info/magshow.php?num=22
тут описана похожая разработка, но более интересная с точки зрения схемотехники: автономное питание, большой срок службы батарей, режим накачки заряда, работа с разными электромеханическими замками и т.д.
|
|
|
|
08.02.2007, 16:07
|
|
Прохожий
Регистрация: 24.01.2007
Сообщений: 2
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помочь никто не захотел, поэтому всё пришлось делать самому Выкладываю тут исходник, который работает только с одним устройсвом на шине (у меня это был DS1990A), определяет его, шлёт команду о выдачи идентификационного кода, читает код, проверяет CRC.
з.ы. Три алгоритма расчёта CRC хорошо показаны здесь http://www.dattalo.com/technical/sof...pic/crc_8bit.c
Прикрепленный файл: 8026763.rar
|
|
|
|
08.02.2007, 22:10
|
|
Прописка
Регистрация: 01.11.2006
Сообщений: 199
Сказал спасибо: 0
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
|
Журнал Радио 2003 - 10 , только исправить прогу (задержки) по протоколу!
Прикрепленный файл не читать, случайно тот же прикрепился
Прикрепленный файл: 8026763.rar
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
iButton ds1990a
|
Conjurer |
Микроконтроллеры, АЦП, память и т.д |
16 |
21.11.2007 14:07 |
iButton на LPT (COM)
|
master-ruden |
Микроконтроллеры, АЦП, память и т.д |
5 |
16.04.2007 23:03 |
Клоны iButton
|
avgust75 |
Микроконтроллеры, АЦП, память и т.д |
8 |
09.01.2007 12:31 |
PIC и ibutton
|
Hellka |
Микроконтроллеры, АЦП, память и т.д |
5 |
07.01.2007 04:46 |
Pic16f73 + Ibutton
|
Hellka |
Микроконтроллеры, АЦП, память и т.д |
0 |
12.12.2006 22:38 |
Часовой пояс GMT +4, время: 22:49.
|
|