Jump to content

Recommended Posts

Всем здравствуйте. Захотелось считать,в целях саморазвития, информацию с чипа DS2430A и заодно освоить способ связи по однопроводной шине. Посмотрел даташит, много гуглил, вроде более менее понял.С чипом можно связаться по интерфейсу 1-wire. И я решил попробовать это провернуть с помощью ардуины. Написал скетч. Пока получается только считать сигнал присутствия ведомого на шине,а считать из памяти ничего не получается,выдаются одни единицы.Пробовал менять РОМ команды,начинать со старшего бита,младшего,всё равно ничего не получается .Нужна хэлпа, подскажите пожалуйста, где мог допустить ошибку в скетче. И еще если можно мб какую нибудь литературу.

/*Подключить пин Мастера надо через полевой транзистор, чтобы отпускать линию было проще
  для прерывания будет использоваться пин №2 на плате(0 по обозначению)
  Подключаемся к DS2430A*/
unsigned long save;//переменная для хранения времени
byte pinMas = 5;//пин мастера
volatile byte pinRead = 6;// пин для чтения линии
volatile boolean infa = 1;//пин для хранения состояния линии
byte adr[256] = {};//массив для хранения данных
int i;
/***********************************************************/
void reader() //для записи состояния линии
{
  infa = digitalRead (pinRead);//  считвываем состояние линии
}
/***********************************************************/
void pulseReset()
{
  delayMicroseconds(480);//заряжаем линию, ждём 500 мкс
  /*___________________________________________________________________*/
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=опускаем линию на ноль
  delayMicroseconds(480);//ждём 480 мкр
  digitalWrite (pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  infa = 1;//чтобы в значение линии не сохранился ноль, когда линию дёргает ведущий
  delayMicroseconds (15);//ждём переходный процесс 15 мкр
  /*___________________________________________________________________*/
  save = micros();
  while (micros() - save < 240) {};//Здесь должно сработать прерывание и сохранение значения переменной
  Serial.print("Presence = ");//выводим состояние линии, если ведомый опустит линию, то
  Serial.println(infa);       //в infa запишется ноль
}
	void comWr0()//передача нуля
{ digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль
  delayMicroseconds(80);//ждём 80 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(20);//ждём переходный процесс 15 мкр
}
void comWr1()//передача единицы
{
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс
  delayMicroseconds(3);//ждём 3 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(90);//ждём переходный процесс 90 мкc
}
int comRead()
{
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс
  delayMicroseconds(2);//ждём 2 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(15);
  infa = digitalRead(pinRead);//читаем линию
  return infa;//возвращаем значение переменной infa
  delayMicroseconds(48);//ждём переходный процесс 48 мкc
}
	void setup() {
  Serial.begin(9600);
  attachInterrupt(0, reader, FALLING);
  pinMode(pinMas, OUTPUT);
  pinMode (pinRead, INPUT);
  pulseReset();
  /*******************************/
  //comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); 
  comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1();//SKIP ROM CCh с младшего бита
  /*******************************/
  comWr0(); comWr0(); comWr0(); comWr0(); comWr1(); comWr1(); comWr1(); comWr1();
  //comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1();
  //comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); //поcылаем AAh с младшего бита
  /*******************************/
  comWr0(); comWr0();  comWr0();  comWr0(); comWr0(); comWr0(); comWr0();  comWr0(); //посылаем адрес
  for ( i = 0; i < 256; i++) //записываем значение состояний линии в массив
  { comRead();
    adr[i] = comRead();
    /* Serial.print("Bit");
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(adr[i]);*/
  }
  for (i = 0; i < 256; i++) {
    Serial.print("Bit");
    Serial.print(i);
    Serial.print(" = ");
    Serial.println(adr[i]);
  }
}
	void loop() {

}
Скрытый текст

 

Edited by myhhyk
Жена гнала спать Т_Т

Share this post


Link to post
Share on other sites

А как насчет того,что он может быть пустой?Поэтому и единицы.

В 02.10.2018 в 00:16, myhhyk сказал:

Всем здравствуйте. Захотелось считать,в целях саморазвития, информацию с чипа DS2430A и заодно освоить способ связи по однопроводной шине. Посмотрел даташит, много гуглил, вроде более менее понял.С чипом можно связаться по интерфейсу 1-wire. И я решил попробовать это провернуть с помощью ардуины. Написал скетч. Пока получается только считать сигнал присутствия ведомого на шине,а считать из памяти ничего не получается,выдаются одни единицы.Пробовал менять РОМ команды,начинать со старшего бита,младшего,всё равно ничего не получается .Нужна хэлпа, подскажите пожалуйста, где мог допустить ошибку в скетче. И еще если можно мб какую нибудь литературу.


/*Подключить пин Мастера надо через полевой транзистор, чтобы отпускать линию было проще
  для прерывания будет использоваться пин №2 на плате(0 по обозначению)
  Подключаемся к DS2430A*/
unsigned long save;//переменная для хранения времени
byte pinMas = 5;//пин мастера
volatile byte pinRead = 6;// пин для чтения линии
volatile boolean infa = 1;//пин для хранения состояния линии
byte adr[256] = {};//массив для хранения данных
int i;
/***********************************************************/
void reader() //для записи состояния линии
{
  infa = digitalRead (pinRead);//  считвываем состояние линии
}
/***********************************************************/
void pulseReset()
{
  delayMicroseconds(480);//заряжаем линию, ждём 500 мкс
  /*___________________________________________________________________*/
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=опускаем линию на ноль
  delayMicroseconds(480);//ждём 480 мкр
  digitalWrite (pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  infa = 1;//чтобы в значение линии не сохранился ноль, когда линию дёргает ведущий
  delayMicroseconds (15);//ждём переходный процесс 15 мкр
  /*___________________________________________________________________*/
  save = micros();
  while (micros() - save < 240) {};//Здесь должно сработать прерывание и сохранение значения переменной
  Serial.print("Presence = ");//выводим состояние линии, если ведомый опустит линию, то
  Serial.println(infa);       //в infa запишется ноль
}
	void comWr0()//передача нуля
{ digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль
  delayMicroseconds(80);//ждём 80 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(20);//ждём переходный процесс 15 мкр
}
void comWr1()//передача единицы
{
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс
  delayMicroseconds(3);//ждём 3 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(90);//ждём переходный процесс 90 мкc
}
int comRead()
{
  digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс
  delayMicroseconds(2);//ждём 2 мкc
  digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию
  delayMicroseconds(15);
  infa = digitalRead(pinRead);//читаем линию
  return infa;//возвращаем значение переменной infa
  delayMicroseconds(48);//ждём переходный процесс 48 мкc
}
	void setup() {
  Serial.begin(9600);
  attachInterrupt(0, reader, FALLING);
  pinMode(pinMas, OUTPUT);
  pinMode (pinRead, INPUT);
  pulseReset();
  /*******************************/
  //comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); 
  comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1();//SKIP ROM CCh с младшего бита
  /*******************************/
  comWr0(); comWr0(); comWr0(); comWr0(); comWr1(); comWr1(); comWr1(); comWr1();
  //comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1();
  //comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); //поcылаем AAh с младшего бита
  /*******************************/
  comWr0(); comWr0();  comWr0();  comWr0(); comWr0(); comWr0(); comWr0();  comWr0(); //посылаем адрес
  for ( i = 0; i < 256; i++) //записываем значение состояний линии в массив
  { comRead();
    adr[i] = comRead();
    /* Serial.print("Bit");
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(adr[i]);*/
  }
  for (i = 0; i < 256; i++) {
    Serial.print("Bit");
    Serial.print(i);
    Serial.print(" = ");
    Serial.println(adr[i]);
  }
}
	void loop() {

}
  Показать содержимое

 

 

.Я бы советовал освоить библиотеку, записать и считать данные, потом считать записанное через библиотеку своим кодом, а потом писать и считывать своими силами. Так будет продуктивнее и проще отловить баги, когда есть заведомо рабочие куски кода.

 

Edited by Bohdan Soroka

Share this post


Link to post
Share on other sites
В 02.10.2018 в 00:16, myhhyk сказал:

С чипом можно связаться по интерфейсу 1-wire

1-wire -это передача и прием по одной линии. 

у  тебя 

byte pinMas = 5;//пин мастера

volatile byte pinRead = 6;// пин для чтения линии

ты передаеш по одному пину принимаеш по другому -это как?

Share this post


Link to post
Share on other sites

Литиевые ХИТы Fanso: устойчивость к высоким температурам

Литиевые ХИТы для широкого круга применений, в том числе в промышленности, соответствуют требованиям современного рынка и способны работать в самых жестких условиях. Основные требования – это длительность хранения и работы, высокая удельная емкость, а также защита от воздействия таких внешних факторов, как температура и влажность. ЛХИТ превосходят по плотности энергии и нормальному напряжению другие элементы автономного питания: 2,9…3,6 В против 1,2…1,5 В

Читать статью...

В 10/2/2018 в 00:16, myhhyk сказал:

подскажите пожалуйста, где мог допустить ошибку в скетче.

Весь ваш скетч - большая ошибка.

1-wire это протокл, весьма чувствительный к скорости исполнения кода, в нем есть участки, где на счету буквально каждая микросекунда. Что там делается при digitalRead(pinRead) никто не знает, а в итоге - ничего не работает. Разве я ошибусь, если скажу, что в ардуине должна быть готовая библиотека для работы с 1-wire?

Если же хочется самостоятельно все освоить, то про скетчи придется забыть, наверное...

Почитать можете вот здесь (писалось давно, кое-что не совсем удачно описано, но для начала сойдет).

Share this post


Link to post
Share on other sites
3 часа назад, skripach сказал:

1-wire -это передача и прием по одной линии. 

у  тебя 

byte pinMas = 5;//пин мастера

volatile byte pinRead = 6;// пин для чтения линии

ты передаеш по одному пину принимаеш по другому -это как?

мне кажется, он просто не знает, что пин можно потом переопределить на вход, поэтому использует 2 пина для общения с микрой. Ну или реально ошибся.

Share this post


Link to post
Share on other sites

Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту.

Подробнее...

Всем спасибо за ответы. Похоже,что реально без библиотеки 1-wire не удастся обмен,т.к. обычные команды занимают много времени и протокол не получается.Приобрел логический анализатор,оказалось,что ардуина без библиотеки не может выдать импульс ровно например 5 мкс. В общем возня с этим 1-wire увела ...к ассемблеру)

ЗЫ использовал два пина,чтобы не тратить время контроллера на переподключение порта.Хотя всё равно не вышло ничего)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By STmaster23
      Добрый день, дорогие читатели.

      Я хотел бы поделиться с вами историей, о том как я создал устройство из доступных всем материалов, за приемлемую цену, и как мне кажется, не особо уступающее по функционалу дорогим устройствам, такого рода.

      Устройство может измерять температуру и влажность, имеет 2 независимых реле которые коммутируют сеть 220 В на две независимых розетки (розетка влажности и розетка температуры).
      В ручном режиме, с помощью кнопок устанавливаются пределы включения и отключения реле, установленные пределы записываются в энергонезависимую память ARDUINO, и при перезапуске устройства, выставленные вами настройки восстанавливаются.

      При попытке поисков в интернете готовых устройств такого рода, я натыкался на огромные цены, из-за этого меня посетила мысль сделать такое устройство на базе Arduino.

      В основе устройства - Arduino NANO. Коммутация производится с помощью 2-х модулей реле для Ардуино с опторазвязкой. Управление выполняется с помощью самодельной клавиатуры на 5 кнопок. Для отображения информации с датчика и настроек используется LCD дисплей 16х2, подключенный по шине I2C к Ардуино. В качестве датчика температуры и влажности применен модуль SHT-31D.
      Все модули были заказаны на Aliexpress, из-за чего стоимость устройства значительно уменьшилась, чем если бы эти модули покупались в местных магазинах.

      В корпус было решено делать из распределительной коробки для электропроводки, потому как материал из которого сделана коробка, хорошо поддается проделывания всяческих отверстий с помощью подручных средств. Внутри я смонтировал две розетки, для подключения устройств, которые будет воздействовать на температуру и влажность т.е. холодильник и вентилятор. Дополнительно в корпусе были установлены двойной выключатель 220 В для отключения питания розеток. И выключатель блока питания на 5 В, для питания Ардуино и всех его модулей.

      И уже после окончательной сборки были ещё добавлены две индикаторные лампы на 220 В, для визуализации наличия напряжения в розетках.

      Основная часть времени создания устройства с нуля была потрачена на ожидание посылок из Китая и написание прошивки для Ардуино. В целом на создание ушло несколько месяцев. Несколько месяцев интернет серфинга в поисках информации по написанию скетчей для ардуино, пока ехали посылки, но и после этого штук 15 версий различных вариантов скетча и подбор наиболее подходящего.

      Датчик сделан выносной на проводе от какого то USB устройства, потому что датчик подключается по шине I2C, соответственно USB шнур с 4-мя провода пришелся как никогда кстати.

      Вот так выглядит устройство, уже в готовом виде...


    • By _qwerty
      Добрый день. Продам
      отладочные платы для STM32
      Отладочная плата на базе MCU STM32F429ZIT6 (ARM Cortex-M4) - 2600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F407VGT6 (ARM Cortex-M4) - 1600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F303VCT6 (ARM Cortex-M4) - 1200 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F103RBT6 (ARM Cortex-M3) - 1000 р. В наличии 2 шт. образовательный набор Амперка Tetra для обучения детей прикладному программированию на основе визуального языка Scratch - 4500 р. В наличии 2 шт.
      электронный конструктор БХВ-Петербург Дерзай 36608 Стартовый набор Arduino - 1500 р. В наличии 2 шт.
      Все новое, не использовалось, возможна отправка почтой по России


















    • By Aven
      Продам остатки от разработки, в наличии 4 штуки.
      Описание:
      Контроллер - Atmega328 с загрузчиком Ардуино Нано
      USB порт в преобразователем CH340 для работы с контроллером + Jack 2.5 UART
      4 тактовые кнопки
      2 разъема для подключения аккумулятора
      2 разъема Vcc+GPIO+GND
      5-контактный разъем для шагового двигателя
      Контроллер заряда АКБ (сигнальные линии заведены на контроллер)
      Делитель для измерения заряда АКБ.
      Дисплей 0,96/1,3 дюйма, OLED
      Цена:
      С дисплеем 0,96 - 1000руб
      С дисплеем 1,3 - 1200руб.
      Отправка за ваш счет.

       
    • By Aven
      Разработка устройств на базе Ардуино любой сложности, написание прошивки, проектирование печатной платы, производство прототипов.
      Быстро и качественно разработаю ардуиноподобные устройства под ваши требования, возможна сборка макета или разработка полноценной печатной платы под ваши требования.
      Быстро и качественно, за адекватную цену.
      КОнтакты: ЛС или Rough_ne@mail.ru
      Примеры:
      SDR приемник для анализа сетевых наводок на связке Ардуино+Raspberry.

       
      Часы на ГРИ.  Разработка полностью с нуля, до того как в сети появилось что-то подобное.
      Bluetooth, RGB подсветка, игры, календарь, будильник:) Проектировал на подарок.


       
      Оружейный хронограф для пневматики. Инициативная работа, может когда-нибудь начну продавать:)
      OLED дисплей, контроль заряда, несколько режимов работы.


       
      Кормушка для животных с Wi-Fi.

       
      И много чего еще:
       

    • By StilFer
      Доброго времени суток! Столкнулся с задачей передачи данных через оптоволокно, пробовал использовать такую связку Arduino (ATSAMD21G18) -> Ethernet модуль на W5500 -> Медиаконвертер(на IC IP101GR). Все работает, но теперь хочу сделать все по-человечески, развести на одной плате и на выходе под оптику поставить либо SFP трансивер, либо 1x9. Понятно что на прямую SFP или 1x9 трансивер к ардуине не подключить, надо использовать, так сказать, посредника, стал курить даташиты на W5500 и на IC IP101GR, но возникла сложность с поиском литературы про связь интерфейсов MII/RMII с контроллером, связь с SFP либо с 1x9 модулем. Не до конца понял, но показалось что можно к W5500 вместо RJ45 коннектора подключить напрямую 1x9 трансивер. Может кто-то имеет опыт в разработках сетевого оборудования, подскажет литературу по этой тематике или даст мудрый совет, а может посоветует другие чипы? Буду искренне благодарен! 
×
×
  • Create New...