С кабелем разобрался (взял экранированную витую пару и на обоих концах подтягивающие сопротивления по 5 к) теперь возник вопрос по программе, как написать опрос n -датчиков на разных портах МК. Если писать опрос температуры для каждого порта, то не хватает памяти программ (максимум хватило на 8 датчиков).
например Symbol A = PORTC.3 ...... OWrite А, 1, [$CC, $44] ........ опрос датчика на 4 порту С, а как сделать что бы перебирать порты . хотелось бы сделать 1 подпрограмму запроса температуры . и в зависимости от выбора датчика выбирать тот или иной порт для использования в качестве опроса температуры. И вообще возможно ли это?
Конечно возможно! Там меняется немного логика работы. Вы делаете общий запрос, а нужно обращаться непосредственно к датчику по ID. Вот Вам несколько ссылок, разберайтесь.
Это как я понял на одном порту цеплять несколько датчиков. мне хотелось бы на каждый порт по одному датчику и в строке OWrite PORTC.2, 1, [$CC, $44] менять порт в подпрограмме.
Тогда вообще не вижу трудностей! Если с одним разобрались, то сделайте процедуру (метку), где Ваш код с опросом датчика, но просто меняйте ноги. И в зависимости какая нога, присваивайте полученные данные соответствующей переменной. Но я еще такого не видел.
Тогда вообще не вижу трудностей! Если с одним разобрались, то сделайте процедуру (метку), где Ваш код с опросом датчика, но просто меняйте ноги. И в зависимости какая нога, присваивайте полученные данные соответствующей переменной. Но я еще такого не видел.
Как раз в этом и проблема. не могу переменной присвоить порт (чтобы их перебирать ), присваивается только значение или 0 или 1 . присваивал каждому порту имя (symbol A = portc.1 и тд) и с помощью команды LookUpL i, [A, "A", B, "B" и тд. ] присваивал переменной itemp ...... OWrite itemp, 1, [$CC, $44] ........ и ничего не выходило.
А вообще значение переменой присваивается элементарно: пременна = портв или переменная = портв.0. Еще если Вы присваиваете переменной значение portc.1, тогда все правильно, Ваша переменная будет или 1 или 0, так как третьего не дано. А вот если переменная = portc, тогда значение переменной может быть от 0 до 255. Думаю Вам следует сначало разобраться с портами, как они конфигурятся, что можно с ними делать, а потом уже в дебри лезть, типа даласа
Dim i As Byte Dim itemp As Byte Dim temp As Word Dim prov As Byte Symbol A = PORTB.0 Symbol B = PORTB.1 Symbol C = PORTB.2 Symbol D = PORTB.3 Symbol E = PORTB.4 Symbol F = PORTB.5 Symbol G = PORTB.6 Symbol H = PORTB.7 Symbol K = PORTC.1
main: i = 0 HRSIn Wait ("T01")
main1: itemp = LookUpL i, [A, B, C, D, E, F, G, H, K] Inc i
OWrite itemp, 1, [$CC, $44] ' Ïîñëàòü äàò÷èêó DS18S20 êîìàíäó ñòàðòà èçìåðåíèÿ òåìïåðàòóðû Repeat ' Íà÷àòü ñëóæåáíûé öèêë DelayMS 25 ' Æäàòü ïîëíîãî ïðåîáðàçîâàíèÿ ORead itemp, 4, [prov]Inc it ' ×èòàòü äàííûå â öèêëå áåç ñáðîñà Until prov <> 0 Or it = 254 ' Âûéòè èç öèêëà åñëè DS18S20 çàêîí÷èëî ïðåîáðàçîâàíèå. OWrite itemp, 1, [$CC, $BE] ' Ïîñëàòü äàò÷èêó DS18S20 êîìàíäó íà÷àëà ÷òåíèÿ èç ÎÇÓ ä ORead itemp, 2,[ temp.LowByte, temp.HighByte ] ' ×èòàòü çíà÷åíèå òåìïåðàòóðû If temp.HighByte = 0 And temp.LowByte <> 0 Then ;åñëè òåìïåðàòóðà âûøå íóëÿ òî ðàñ÷èòàòü çíà÷å temp = temp * 5 HRSOut "T", Dec i, Dec temp, 176 Else If temp.LowByte = 0 Then ; åñëè òåìïåðàòóðà = 0 òîãäà âûäàòü â ÑÎÌ -0 HRSOut "T", Dec i, "-", Dec temp, 176 Else temp = (256 - temp.LowByte) * 5 ;åñëè òåìïåðàòóðà íèæå íóëÿ âûäàòü â ÑÎÌ - òåìïåðàòóðà HRSOut "T", Dec i, "-", Dec temp, 176 EndIf EndIf
DelayMS 500 If i < 9 Then GoTo main GoTo main1
Сообщение отредактировал
serfo0185 - Чт, 19.03.2015, 18:29
serfo0185, Вы читали как работает команда lookup? Так работать и не будет! А где настройка портов? Lookup вообще не нужно! Попробуйте перед каждым опросом переменной itemp=протв.0 нужный порт.
Dim i As Byte Dim it As Byte Dim itemp As Byte Dim temp As Word Dim prov As Byte
main: i = 0 HRSIn Wait ("T01")
main1: Inc i If i = 1 Then itemp = PORTB.0 If i = 2 Then itemp = PORTB.1 If i = 3 Then itemp = PORTB.2 If i = 4 Then itemp = PORTB.3 If i = 5 Then itemp = PORTB.4 If i = 6 Then itemp = PORTB.5 If i = 7 Then itemp = PORTB.6 If i = 8 Then itemp = PORTB.7 If i = 9 Then itemp = PORTC.1 If i = 10 Then itemp = PORTC.2
OWrite itemp, 1, [$CC, $44] Repeat DelayMS 25 ORead itemp, 4, [prov]Inc it Until prov <> 0 Or it = 254 OWrite itemp, 1, [$CC, $BE] ORead itemp, 2,[ temp.LowByte, temp.HighByte ] If temp.HighByte = 0 And temp.LowByte <> 0 Then temp = temp * 5 HRSOut "T", Dec i, Dec temp, 176 Else If temp.LowByte = 0 Then HRSOut "T", Dec i, "-", Dec temp, 176 Else temp = (256 - temp.LowByte) * 5 HRSOut "T", Dec i, "-", Dec temp, 176 EndIf EndIf
DelayMS 500 If i = 10 Then GoTo main GoTo main1
Сообщение отредактировал
serfo0185 - Пт, 20.03.2015, 12:07
как то и я заморочился этим датчиком,но и у меня он отказывался работать если длинна кабеля была чуть более метра не говоря уже от трех,пяти метрах. Вышел из положения очень интересным способом. У меня много датчиков температуры от автомобильных сигналок. Ну типа простой резистивный датчик так я его оцифровал с помощью ds18s20. составил таблицу зависимости температуры от сопротивления и забыл про всякие там помехи получилось довольно сносно.
Добавлено (20.03.2015, 17:25) --------------------------------------------- написал программку опустил два датчика в емкость с водой и заморозил.а потом потихоньку отогревал и нагрел эту емкость. И в микроконтроллере у меня получилась таблица зависимости температуры от сопротивления. Теперь использую эту таблицу. А датчиков от сигналок у меня мешок )))
Ds18s(b)20 работает отлично! Даже не оригинальные прекрасносебя ведут. Пишите правильно код и самое главное читайте мануал на любую переферию! И тогда успех гарантирован