Всем привет! Столкнулся с проблемой, сижу туплю, ничего не понимаю. Делал я как-то давно устройство для считывания температуры с нескольких датчиков 1-Wire DS18B20. Изначально оно было сделано на ATmega8. На одной шине сидело несколько датчиков и я по персональному ID стучался к каждому датчику и читал с него температуру. Сначала ID каждого датчика жестко прописывал в прошивку, потом, когда датчики начали выходить из строя, чтобы каждый раз контроллер не перепрошивать прикрутил считывание из ROM датчика его ID и сохранение в EEPROM контроллера. Все работало как часы (только время не показывало ). Но вот решил я пересесть с AVR-ок на STM-ки. Попробовал сначала с одним датчиком через команду игнора адреса датчика (0xCC). Работает. Потом жестко прописал адреса нескольких датчиков в прошивке и посадил их на одну шину. РАБОТАЕТ. Начал прикручивать считывание ID из ROM датчика и .... уперся. ОНО НЕ СЧИТЫВАЕТСЯ. Вернее считывается правильно только первый байт, потом полная ахинея. Я просто в ногдауне. Если все остально еработает - следовательно с протоколом все в порядке, код портирован правильно. Именно считывание адреса из ROM не работает и именно на STM32 (кстати не толко на F103, но и на F303). Не могу понять в чем прикол.
Я намеренно не выкладываю свой код, т.к. имею достаточно опыта, чтобы понять, что криминала там нет и забивать вам голову не обязательно.
Вопрос решился, хотя яснее не стало. Читать 64-байтный ROM из датчика нужно не в массив из 8-байт, в 64 байтную переменную. В чем разница - не понятно, по факту абсолютно теже операции.... В AVR работало
long long sens_address
one_wire_reset();
one_wire_send(0x33);
sens_address=one_wire_read_rom();
long long one_wire_read_rom(void)
{
long long bit=0;
long long a=0;
for (int i=0; i<64; i++)
{
one_wire_low();
delay_us(5);
one_wire_hight();
delay_us(15);
bit = one_wire_level();
a |= bit<<i;
delay_us(90);
}
return a;
}
первый вариант работает на AVR, на STM32 не работает. Второй вариант работает на STM32, на AVR не пробовал.
[uquote="ddimochka",url="/forum/viewtopic.php?p=3849016#p3849016"]вы бы прям так сразу мне: Ну ты чё, чувак, ну разве можно так делать? Нельзя побайтно в массив читать, надо переменную завести 64-разрядную.[/uquote]
не надо - тут говнокодик, работает на пиках аврах стм8 стм32... https://radiokot.ru/forum/viewtopic.php ... 1#p2071361
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
VladislavS, так ведь и подход абсолютно разный: на аврке нет DMA, там реализовать 1-wire можно только двумя способами: таймер+прерывание или UART. А на STM32 можно таймер с DMA, можно USART с DMA…
// вообще, мегадебильнейший протокол: аппаратно МК не поддерживает, значит, оно нафиг никому не нужно! Я так считаю. И ту древнюю реализацию, код которой скинул, уже давно не поддерживаю, т.к. выкинул из головы эту блажь — использовать идиотские DS18B20, когда есть нормальные датчики, работающие на I2C или SPI!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Да чего вы кинулись код то кидать? ТС всего лишь разницу между 8 и 32 битным процом не видит.
"Разрядность" - ну ни фига себе. Надо в словарик записать....
Чем отличаются русский, американский и еврейский форумы?
- на американском форуме вы задаете вопрос и вам дают ответ
- на еврейском форуме вы задаете вопрос и вам задают встречный вопрос
- на русском форуме вы задаете вопрос и вам долго объясняют почему вы такой мудак.
ddimochka, я первым же сообщением под вашим кодом дал информацию для размышления. Это куда полезней, чем просто пережёванное в ротик положить. Я на 95% уверен, что дело в "индейцах".
[uquote="Мурик",url="/forum/viewtopic.php?p=3849202#p3849202"]Почему не USART?[/uquote]Ещё один Вопрос не в этом был!!!
240265, очень даже идиотский, т.к. в низшей ценовой категории нет ни одного микроконтроллера, аппаратно поддерживающего 1-wire.
И приходится городить велосипед-квадратные-колеса, абы этот говнопротокол реализовать!
В итоге теряем 1 канал DMA + USART или таймер!
А был бы датчик на I2C или SPI, ничего терять не пришлось бы... Ну или хотя бы взять 5-рублевый терморезистор и повесить его на свободный канал АЦП! Всяко более удачное решение (да и врать будет ничуть не хуже DS18).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Мурик",url="/forum/viewtopic.php?p=3849414#p3849414"]Допустим нужно подключить 100 датчиков на значительном (десятки метров) расстоянии от МК. У I2C или SPI будет преимущество?[/uquote]
Конечно: городим по узлу на гроздь датчиков, узлы соединяем по CAN-шине — вуаля! Вот — работает, 5 узлов, CAN-шина, 80 термодатчиков (но я тоже через одно место сделал: по-человечески, надо было брать аналоговые платиновые калиброванные термодатчики и городить на каждой "грозди" АЦП с мультиплексорами по трехпроводной схеме, тогда можно было бы действительно достигнуть точности в 0.01°C в заданном диапазоне).
А 1-wire вам в этом случае вообще никак не поможет, потому что 100 датчиков на десятках метров удаления вы на одну шину не посадите! В случае же с CAN-шиной по витухе пускается и 12..36В напруги, в итоге и связь есть, и питание. А датчики подключаем к узлам кабелями не длинней 2..3м.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Eddy_Em писал(а):Конечно: городим по узлу на гроздь датчиков, узлы соединяем по CAN-шине — вуаля!
Что конечно? Вы считаете преимуществом кучу дополнительных электронных компонентов?
Eddy_Em писал(а):А 1-wire вам в этом случае вообще никак не поможет, потому что 100 датчиков на десятках метров удаления вы на одну шину не посадите!
Почему же можно.
Eddy_Em писал(а):А датчики подключаем к узлам кабелями не длинней 2..3м.
Доп. компоненты, доп. расходы. Они должны быть обоснованными. В таком случае на 100 датчиков понадобится 100 преобразователей CAN<->интерфейс датчика. Получится слишком дорого и громоздко.
ddimochka, я первым же сообщением под вашим кодом дал информацию для размышления. Это куда полезней, чем просто пережёванное в ротик положить. Я на 95% уверен, что дело в "индейцах".
Ды я понял. И так уж размышляю в этом направлении. Но пока в принципе все получается, я не буду лезть в дебри - не до того, хотя на досуге нужно бы плотно разобраться.
Мурик писал(а):
Почему не USART?
Ещё один Вопрос не в этом был!!!
USART занят под другие нужды. Ну и да, вопрос не об этом.