Jump to content

Recommended Posts

В общем добился я результата по твоим рекомендациям 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

Share this post


Link to post
Share on other sites
 

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

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

Share this post


Link to post
Share on other sites
 

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

for Sensor = 0 to 3

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

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

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

 

Share this post


Link to post
Share on other sites
 

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

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

 

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

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

Share this post


Link to post
Share on other sites
 
 
 

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

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



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

Share this post


Link to post
Share on other sites
 
 

 

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

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

 

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

Share this post


Link to post
Share on other sites
 

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

Share this post


Link to post
Share on other sites
 

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

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

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. Которые не участвуют в отображении. Видимо издержки "языка".  В общем все работает, даже влезаю в объем камня.

Share this post


Link to post
Share on other sites
 

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

 

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



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

Share this post


Link to post
Share on other sites
 
 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
  • Create New...