Jump to content

Welcome to vip-cxema.org

logo3.png

The forum has a section for guests, where you can ask your questions without registration: Вопросы и ответы

By registering, you will be able to send private messages, receive notification of replies to topics. You can always send a message, many restrictions are removed.


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
 
 
 

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

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

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
 
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...



×
  • Create New...