1 сообщение в этой теме

myhhyk    0

Всем здравствуйте. Захотелось считать,в целях саморазвития, информацию с чипа 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() {

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

 

Изменено пользователем myhhyk
Жена гнала спать Т_Т

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: AronIIStone
      Добрый день
      Возникла ситуация: имеется ноутбук IBM ThinkPad t20 с запароленым Bios. Пароль никто не помнит, но он зашит в 24rf08. Его можно прочитать програмкой для считывания данной микросхемы, но для этого нужен программатор. Можно ли использовать в качестве такого программатора Ардуино, чтобы он вопринимался этой программой как надо, и если можно, то как нужно подключить их и какой скетч залить в ардуинку? 
      Саму программу выложу чуть позже, если необходимо - с мобильника сижу. 
      Спасибо 
    • Автор: Kudich
      Всех приветствую!
      Сам я программирую на стандартной среде ардуинки, и в одном проекте потребовалось увеличить частоту ШИМ на портах 5,6,9,10,11,13 Arduino Micro. На этой ардуино стоит Atmega32u4, есть тут знатоки avr? Как повысить частоту на этих пинах?
    • Автор: Kirillius Labutin
      Добрый день.
      Небольшая предыстория: имеется инвертор 12DC -> 220AC с функцией подзарядки АКБ, который обеспечивает питанием оборудование для видеонаблюдения в небольшом магазинчике. Иными словами это некоторое подобие ИБП.
      Планирую сделать модуль для мониторинга инвертора, чтобы удалённо знать о пропадании электропитания и отслеживать степень разряда АКБ.
      Лезть внутрь инвертора не хочу, поэтому наличие внешнего питания я решил определять по силе и направлению тока в кабеле между инвертором и АКБ. Если есть внешнее питание - идёт зарядка и ток, допустим -1,5 Ампер, либо 0 когда АКБ заряжен. Если же внешнее питание пропадает, то инвертор нагружает АКБ и получаем ток +30-35А.
      Вопрос касается измерения такой силы тока, наиболее простым и логичным решением мне показалось использование измерительного шунта и усиление напряжения на нём с помощью операционного усилителя. В интернете нашёл такую схему:
       
      У меня совершенно нет никакого опыта работы с ОУ и я с трудом представляю как они работают. Если я правильно понял, то данная схема на выходе даст либо положительное, либо отрицательное напряжение.
      Поэтому, прошу подсказать каким образом я могу модифицировать данную схему и какие номиналы R и Rш использовать (теоретически максимально возможный ток в цепи 75А), чтобы на выходе получить постоянное напряжение в диапазоне 0-5 Вольт, при этом сам микроконтроллер и ОУ питаются от той же цепи, где производится измерение.
      P.S. Высокая точность не важна. Важно только знать ток разрядки АКБ.
      В общем виде схема примерно такая:

    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Гость Andrey-Docent
      Автор: Гость Andrey-Docent
      Всем привет! Планируется сделать на базе arduino устройство, ведущее обмен данными с переферийным устройством по интерфейсу rs-232 и также необходимо контролировать работу arduino с помощью компьютера тоже посредством интерфейса rs-232. Но у arduino только один такой порт. Первая мысль в связи с этим - сделать ещё один порт и вывести линии RX и TX на другие (например цифровые) ножки порта. Можно ли как-то это сделать? Нет ли готовых библиотек для этого (на данный момент не нашёл таковых в интернете)? Может есть ещё какой-нибудь обходной путь? Заранее спасибо.
  • Сообщения

    • Меньше народу - меньше проблем! Золотое правило наших "слуг народа!"  Что мы о грустном! Жизнь такая пошла, что плакать хочется!   Кое что о дружбе. Народы Кавказа, испытавшие жестокость набегов от турков и персов тоже очень дружные. Кто служил в армии это прекрасно знают!     Экскурсия по аду. Видят, в двух котлах варятся грешники. Около одного котла — ватага чертей с вилами, а около другого — никого. 
      — Почему вы все у одного котла?
      — Да тут евреи варятся. Стоит на секунду отойти, как они все собираются, подсаживают друг друга, один вылезет — других вытаскивает. Если их не сторожить — все разбегутся!
      — А почему тогда второй котел не охраняете?
      — Там варятся русские. Отличные ребята! Если один пробует удрать, другие его назад тащат: "Ты чё, лучше других хочешь быть?!" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    • Этой статьёй мы открываем серию уроков по программированию ESP32 на языке microPython. Введение. Цель данного урока - рассказать о том, как загрузить в ESP32 простейшую программу "Hello World!", написанную на языке MicroPython. MicroPython - это реализация языка программирования Python 3, оптимизированная для применения в микроконтроллерах и включающая в себя небольшую часть стандартной библиотеки Python. К счастью, теперь есть реализация microPython не только под ESP8266, но и для ESP32. Подробно познакомиться с деталями реализации можно здесь. Чтобы начать программировать на нём ESP32, можно, конечно, собрать весь  проект самостоятельно (по этой инструкции). Но проще всего скачать уже готовую прошивку и загрузить её на плату. Это мы и проделаем в нашем уроке. Все уроки были выполнены в Windows. Необходимый софт. Для работы надо установить Python на ваш компьютер. Мы будем использовать Python 2.7, но всё должно работать и для более поздних версий. Также потребуется софт под названием esptool, чтобы заливать в наш ESP32 бинарные файлы MicroPython. Можно скачать его через pip или другие менеджеры пакетов Python, но мы покажем, как это сделать вручную. Итак, качаем последнюю версию esptool отсюда.  После загрузки esptool распакуйте его в папку. Убедитесь, что там есть файл setup.py. Если Python на Ваш компьютер уже установлен, откройте консоль, перейдите в распакованную папку и введите следующую команду: python setup.py install Она должна установить esptool. Также процесс установки описан и в репозитории esptool. Далее нам потребуется бинарный файл с MicroPython, который можно скачать отсюда.  Процедура установки MicroPython. В первую очередь надо очистить память ESP32. Для этого просто введите в консоли команду, указанную ниже, только перед этим замените “COM5” на тот номер порта, к которому подключена ваша плата ESP32: esptool.py --port COM5 erase_flash После этого надо загрузить бинарный файл в ESP32, используя следующую. Снова замените COM5 на тот порт, к которому подключен ESP32 у вас. Также замените "pathToYourFile/BinaryFile" на путь, куда Вы сохранили бинарный файл microPython, и имя самого файла. В Windows есть небольшая хитрость - просто перетащите сам файл в консоль. esptool.py --port COM5 --baud 460800 write_flash --flash_size=detect 0 pathToYourFile/binaryFile После этого microPython должен быть загружен в вашу плату ESP32. Убедимся в этом через минуту. Не переключайтесь.  Проверка установки. Для проверки нам потребуется дополнительный софт для взаимодействия с консолью Python. Вообще можно использовать любое приложение, позволяющее осуществлять подключение по последовательному порту. Мы будем использовать PuTTy, который можно скачать отсюда.  Откройте загруженный *.exe файл из предыдущей ссылки и увидите окно PuTTy. В нём надо выбрать тип протокола “Serial”, а в строке “Serial line” ввести имя порта, к которому подключен ESP32 (у меня это COM5), и скорость 115200, как показано на Рисунке 1.   Риуснок 1. Подключение ESP32 к консоли MicroPython с помощью Putty   После того, как указали все параметры соединения, жмите Open. Если всё введено правильно, должно появиться окно с доступной консолью MicroPython (Рисунок 2).   Рисунок 2. Консоль MicroPython в ESP32. Программа Hello World Как и было обещано в начале урока, отправим в консоль простое сообщение “Hello World”. Введите следующую команду и нажмите Enter: print ("Hello World From ESP32 MicroPython") Должно получится что-то похожее на Рисунок 3. В этом примере я отправил команду дважды. Рисунок 3. “Hello World” на ESP32 MicroPython. Ну а теперь можно начинать играть с Python на ESP32!   И напоследок. Хочется отдельно поблагодарить команду, портировавшую MicroPython под ESP32, которая быстро сделала доступными бинарники после моего запроса на гитхабе. Спасибо им за то, что сделали этот замечательный инструмент доступным каждому! Важно: Этот пост - перевод статьи, написанной Nuno Santos из Лиссабона (Португалия), инженером в области электроники и компьютерной техники. Можно познакомиться с его оригинальными статьями здесь. Он написал ещё много полезных уроков и проектов про ESP32, ESP8266, и, если интересно, можно почитать его блог. У DFRobot есть много других обучающих статей по ESP32 и готовых проектов на основе ESP32.
    • На 6 (шести) Амперах - живут, но у меня, т.е. через силиконовые прокладки на радиаторе из половинки АМДшного радиатора (времен 4-х Пеньков) с обдувом 60..80-м "карлсоном" и при 63..65 кГц (т.е. см. "Fig.11" из даташита на 840-е). Потихоньку работаю над тем, чтоб жили при 8 Амперах. Еще закавыка в том, что если окажется разогрет сам токоизмерительный шунт, величина уставки снижается (с одной стороны это мешает, а с другой так возникает дополнительная защита).  
    • Тогда частоту надо смотреть. Обороты меняются, но они занижены ?
    • Я выставил амплитуду на двигателе 6 Вольт, про это напряжение разговор? Ну, без лампы бы меток не было, кстати, лампа там в хитром корпусе..
    • Ну, ещё чуть-чуть осталось. В функции segchar() кладите в переменную dat свои нолики-единички и затем посылайте data_submit(dat). Кстати, на всякий случай, для единички число 0b10011111 равно 0x9F, для двойки число 0b00100101 равно 0x25, для тройки число 0b00001101 =  0x0D и т.д. Это просто разные формы записи одних и тех же чисел: двоичная запись и шестнадцатеричная запись. У Вас в коде эти числа уже записаны в segchar(). Правда немного другие, для двойки и тройки по крайней мере. Надо бы проверить.