Перейти к содержанию

Рекомендуемые сообщения

В общем добился я результата по твоим рекомендациям http://forum.vip-cxema.org/index.php?/topic/891-eeprom/page-2

Но никак не могу въехать почему так получается в цикле.

 

main:
    for Sensor = 0 to 2
    Lookup Sensor,[8,16,24], Adr
    read Adr,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7]
    gosub   DS18B20
    next Sensor
    gosub   Display
GoTo main

DS18B20:
OWOUT DQ, 1, [$55, str ID\8, $44]      
    ReadBusy:
    OWIN DQ, 4, [busy]        
    If Busy = 0 Then ReadBusy      
OWOUT DQ, 1, [$55, str ID\8, $BE]       
OWIN DQ, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] 

If SignBit <> 1 Then 
    TerC[sensor] = rawtemp / 16
    TerD[sensor] = (rawtemp // 16) * 10 / 16
    TempA[sensor] = TerC[sensor] * 10 + TerD[sensor]   
    Else
    TerC[sensor] = 65535 - rawtemp
    tempdat = TerC + 1
    TerC[sensor] = tempdat / 16
    TerD[sensor] = ((tempdat + 1) // 16) * 10 / 16
    TempA[sensor] = TerC * 10 + TerD[sensor]
EndIf
RETURN

Получаем:

3.jpg

3.jpg

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


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

Попробовал немножко другим способом:

main:
    for Sensor = 0 to 2
    gosub   ReadID
    gosub   DS18B20
    next Sensor
    gosub   Display
GoTo main

DS18B20:
OWOUT DQ, 1, [$55, str ID\8, $44]      
    ReadBusy:
    OWIN DQ, 4, [busy]        
    If Busy = 0 Then ReadBusy      
OWOUT DQ, 1, [$55, str ID\8, $BE]       
OWIN DQ, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] 

If SignBit <> 1 Then 
    TerC[sensor] = rawtemp / 16
    TerD[sensor] = (rawtemp // 16) * 10 / 16
    TempA[sensor] = TerC[sensor] * 10 + TerD[sensor]   
    Else
    TerC[sensor] = 65535 - rawtemp
    tempdat = TerC + 1
    TerC[sensor] = tempdat / 16
    TerD[sensor] = ((tempdat + 1) // 16) * 10 / 16
    TempA[sensor] = TerC * 10 + TerD[sensor]
EndIf
RETURN

ReadID:
    select case Sensor
        Case 1: read 8,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7]
        Case 2: read 16,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7]
        Case 3: read 24,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7] 
    end select
return

Получаем:

2.jpg

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


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

Но если меняем (удлиняем) цикл:

for Sensor = 0 to 3

то получаем соответственно

К первому листингу:

4.jpg
 
Ко второму:
1.jpg

 

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


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

В общем не могу понять почему так. Вроде все должно работать.

Остановился пока на последнем варианте, с правильными данными.

 

P.S. Вывод на экран

Display:
    LCDOUT $FE,1                
    LCDOUT "D1= ",dec3 TempA0," D2= ",dec3 TempA1
    LCDOUT $FE,$C0              
    lcdout "D3= ",dec3 TempA2
return

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


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

Попробуй перед обращением к датчикам сформировать импульс сброса. Выставить на порт, к которому прицеплены датчики, 0 на время ~500-600мкс.

Может несколько датчиков отвечают.



Файл как и картинки загружаются.

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


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

 

11.pbp - последний

111.pbp - до изменений

 

P.S. Сильно меня не ругай. В листинге "рабочий беспорядок"  :)

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


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

Попробовал скинуть в "0" на секунду, не помогло. Теоретически, запрос то идет по ID датчиков.

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


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

Все получилось. Работает.

Всплыл еще один необъяснимый косяк с отображением.

Display:
    LCDOUT $FE,1                
    LCDOUT SignC0, dec TerC0,".",DEC TerD0,$DF," Ust=",dec teruc,".",dec terud,$DF
    LCDOUT $FE,$C0              
    lcdout "OBOGREV = ",DEC pwrm,"%"
return

TerD0 показывал "фигню" пока не объявил переменные TerC1, TerD1. Которые не участвуют в отображении. Видимо издержки "языка".  В общем все работает, даже влезаю в объем камня.

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


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

Когда датчиками отправляет ид, они сравнивают его со своим, если не совпадает, то датчик на дальнейшие команды не реагирует, пока не произойдёт сброс длительностью не менее 500мкс (по даташитут). Перед обращением к датчиками, если требуется сменить его, необходимо произвести сброс.

 

Переменные TerC1, TerD1 в отображении не участвуют, зато в них вроде как идёт запись температуры при опросе датчика. Может я ошибаюсь, надо код смотреть.



Главное работает без косяков и код влез в камень  :D

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти



×
  • Создать...