Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.10.2006, 19:03  
wawchuk
Частый гость
 
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wawchuk на пути к лучшему
По умолчанию

Это что попытка втянуть в диспут об отношении к жизни, к трудолюбию,соответственно далее перейти к личности и закончить национальным вопросом.
"Минуточечку" Вы на форуме по микроконтроллерам где задают вопросы-помощь и терпеливо ожидают ответа или помощи от всех я так понимаю желающих и конечно знающих и не зависимо от возраста и лица.
Единственное желание это ускориться в получении знаний.Если можете подскажите,не можете не беда спросите может и Вам подскажут.
Всеравно с глубоким уважением.
Реклама:
wawchuk вне форума  
Непрочитано 13.10.2006, 10:46  
paha1956
Временная регистрация
 
Регистрация: 17.05.2006
Сообщений: 72
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
paha1956 на пути к лучшему
По умолчанию

Господа инженеры! Отошли от темы - человек уже замок собирает с iButton, можно успокоиться.

PS Кстати, если чего не понятно с ключами iButton, могу попробовать помочь, имел опыт программирования под эти ключи.
__________________
"Имею честь иметь Вашу честь в своём доме..."
paha1956 вне форума  
Непрочитано 13.10.2006, 19:33  
wawchuk
Частый гость
 
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wawchuk на пути к лучшему
По умолчанию

на Си начал процесс написания программы чтения,записи ds1990 и если прописан в EEPROM т.е ОН, то засветить светодиод,а начал потому что пока трудно сразу сесть и написать.С чего начать?
wawchuk вне форума  
Непрочитано 14.10.2006, 22:51  
wawchuk
Частый гость
 
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wawchuk на пути к лучшему
По умолчанию

пока изучаю теорию благо ее много может кто поделится практическими программами наработками связанными с теорией написания на Си для чтения ключа ds1990a понятен WINAVR и СodeVision может я не наверном пути
заранее благодарен.
wawchuk вне форума  
Непрочитано 16.10.2006, 15:16  
paha1956
Временная регистрация
 
Регистрация: 17.05.2006
Сообщений: 72
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
paha1956 на пути к лучшему
По умолчанию

Начать надо с изучения протокола обмена с ключом.
Вот кусок кода, который обеспечивает считывание кода далласовского ключа (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-го контроллера методом прямого преобразования асмовских команд в сишный текст. Зато работает.
__________________
"Имею честь иметь Вашу честь в своём доме..."
paha1956 вне форума  
Непрочитано 16.10.2006, 19:47  
wawchuk
Частый гость
 
Регистрация: 28.06.2006
Сообщений: 33
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wawchuk на пути к лучшему
По умолчанию

Большое спасибо.
Есть НАЧАЛО от чего отталкнуться.
wawchuk вне форума  
Непрочитано 05.02.2007, 21:36  
lech196
Прохожий
 
Регистрация: 24.01.2007
Сообщений: 2
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
lech196 на пути к лучшему
По умолчанию

Пытаюсь реализовать считыватель 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;
}
lech196 вне форума  
Непрочитано 05.02.2007, 22:06  
Slava1355
Прописка
 
Аватар для Slava1355
 
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
Slava1355 на пути к лучшему
По умолчанию

Предлагаю почитать здесь: http://www.masterkit.ru/info/magshow.php?num=22
тут описана похожая разработка, но более интересная с точки зрения схемотехники: автономное питание, большой срок службы батарей, режим накачки заряда, работа с разными электромеханическими замками и т.д.
Slava1355 вне форума  
Непрочитано 08.02.2007, 16:07  
lech196
Прохожий
 
Регистрация: 24.01.2007
Сообщений: 2
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
lech196 на пути к лучшему
По умолчанию

Помочь никто не захотел, поэтому всё пришлось делать самому Выкладываю тут исходник, который работает только с одним устройсвом на шине (у меня это был DS1990A), определяет его, шлёт команду о выдачи идентификационного кода, читает код, проверяет CRC.

з.ы. Три алгоритма расчёта CRC хорошо показаны здесь http://www.dattalo.com/technical/sof...pic/crc_8bit.c

Прикрепленный файл: 8026763.rar
lech196 вне форума  
Непрочитано 08.02.2007, 22:10  
avgust75
Прописка
 
Регистрация: 01.11.2006
Сообщений: 199
Сказал спасибо: 0
Сказали Спасибо 15 раз(а) в 13 сообщении(ях)
avgust75 на пути к лучшему
По умолчанию

Журнал Радио 2003 - 10 , только исправить прогу (задержки) по протоколу!
Прикрепленный файл не читать, случайно тот же прикрепился

Прикрепленный файл: 8026763.rar
avgust75 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot