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

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

Возникла необходимость записать число (пусть будет 377) в память. Методом проб, ошибок и эксперементов удалось получить желаемый результат, но думаю как-то это не правильно (в общем считаю, что у меня делается это через одно место).

 

Мой вариант:

Имеется переменная (O) со значением 377. Необходимо ее запомнить, потом считать при необходимости

В ячейку EEPROM можно записать число 255 (максимум, как не пытался. может плохо пытался).

Записываю 255 в 0 (нулевой) адрес. Остатки записываю в 1-й адрес.

Считываю так

читаем 0 адрес пишем в I

читаем 1 адрес пишем в U

O = I + U

Что я получаю в итоге? Маленький диапазон температур с которыми можно работать от 25,5 до 51 градуса.

******************************************************************

Итак. Как же реализовать запись, чтоб можно было работать во всем диапазоне температур? (в диапазоне позволяющий датчиком)

Может если выйдет урок по этой теме будет понятнее.

Заранее всем спасибо.

 

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


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

 

В ячейку EEPROM можно записать число 255 (максимум, как не пытался. может плохо пытался).

больше и не получится максимальное значение в шестнадцатиричном  коде FF, в двоичном коде 1111 1111 или в десятичном 255

 

Записываю 255 в 0 (нулевой) адрес. Остатки записываю в 1-й адрес. Считываю так читаем 0 адрес пишем в I читаем 1 адрес пишем в U O = I + U Что я получаю в итоге? Маленький диапазон температур с которыми можно работать от 25,5 до 51 градуса. ****************************************************************** Итак. Как же реализовать запись, чтоб можно было работать во всем диапазоне температур? (в диапазоне позволяющий датчиком)

 

а если попробовать записывать в ячейку с "0" адресом записывать целые значения градусов, а ячейку с адресом "1" десятые доли градуса, правда не знаю как это реализовать программно, но думаю можно

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


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

Было бы супер, уже думал. Целые значения извлечь могу, а как быть с десятыми...  

377 получается из формулы = TerA * 10 + TerC (где TerA целые значения, TerC - десятичные). Вот с десятичными и загвоздка.

Если бы значение приходило с датчика, то проблем нет. Но значение приходит от "пользователя" .  То есть счетчик работает уже с преобразованным числом. Может есть какой-то вариант разложить число? Чую, что где-то близко ползаю, но пока не допендрил.

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


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

Было бы супер, уже думал. Целые значения извлечь могу, а как быть с десятыми...  

377 получается из формулы = TerA * 10 + TerC (где TerA целые значения, TerC - десятичные). Вот с десятичными и загвоздка.

Если бы значение приходило с датчика, то проблем нет. Но значение приходит от "пользователя" .  То есть счетчик работает уже с преобразованным числом. Может есть какой-то вариант разложить число? Чую, что где-то близко ползаю, но пока не допендрил.

вряд ли я вам помогу чем то, программирование не мой профиль, может еще кто подтянется, но в любом случае вам следовало бы подробно объяснить суть проблемы.

что значит: "от пользователя", преобразованное число, разложить число на какие части и т.д.?

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


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

Плюсовать получилось:

 

377=TerU = TerUC * 10 + TerUD

plus:
TerUD = TerUD + 1
if TerUD > 9 then
TerUD = 0
TerUC = TerUC + 1
endif
write 0, TerUC
write 1, TerUD
pause 1000
goto main

С отниманием косяк: 

minus:
TerUD = TerUD - 1 
if TerUD < 0 then
TerUD = 9
TerUC = TerUC - 1
endif
write 0, TerUC
write 1, TerUD
pause 1000
goto main

Что происходит при отнимании:

На индикаторе

TerUC=37 TerUD=7 TerU=377

Начинаю отнимать

TerUC=37 TerUD=6 TerU=376

TerUC=37 TerUD=5 TerU=375

.......

TerUC=37 TerUD=0 TerU=370

TerUC=37 TerUD=5 TerU=369

 

То есть сразу же после "0" появляется "5". И если продолжить отнимание, то оно будет с 5, а не с 9, как должно быть.

Я в ступоре.

 

P.S. 

"от пользователя"

 Какое число понажимал пользователь по кнопкам.

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


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

TerUC=37 TerUD=TerU=369

Нажимаю "плюсик"

TerUC=37 TerUD=TerU=370

Отнимаю

TerUC=37 TerUD=TerU=369

TerUC=37 TerUD=TerU=368

TerUC=37 TerUD=TerU=367

TerUC=37 TerUD=TerU=366

TerUC=37 TerUD=TerU=365

TerUC=37 TerUD=TerU=364

TerUC=37 TerUD=TerU=363

TerUC=37 TerUD=TerU=362

TerUC=37 TerUD=TerU=361

TerUC=37 TerUD=TerU=360

TerUC=37 TerUD=TerU=359

TerUC=37 TerUD=TerU=358

TerUC=37 TerUD=TerU=357

TerUC=37 TerUD=TerU=356

TerUC=37 TerUD=TerU=355

TerUC=37 TerUD=TerU=354

Плюсую

TerUC=38 TerUD=TerU=380

Отнимаю

TerUC=38 TerUD=TerU=379

Плюсую

TerUC=38 TerUD=TerU=380

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


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

т.е. получается что вычисляет программа правильно, а значения переменных TerUC и TerUD отображает при индикации не правильно?

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


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

Числа выше 255 - это двухбайтовые числа, и при записи в EEPROM записываются 2 байта! Естественно переменные должны быть объявлены как WORD.

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


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

terUD меньше нуля неможет быть! Если от нуля отнять единицу, будет 255! Попробуй условие поменять на if terUD > 9....

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


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

Жень, ты прям чуял, что тебя тут ждут. И спасибо за видео урок  ;)   Сча сделаю уроки (№9) потом буду ковырять у себя.

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


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

Поэксперементировал немного.

на экран выводил так 

LCDOUT " TerUD ",dec terud  (то есть мне как бы больше одного значения не нужно)

 

Если от нуля отнять единицу, будет 255!

 

Решил проверить что же мне там выдавало.

LCDOUT " TerUD ",dec5 terud (так и оказалось 255, а если "TerUD var WORD" - 65535) тоесть всеравно бы показывало мне "5"

 

Это я так, на земетку, на будущее.

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


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

Быстро учишся! Молодец!

В некоторых программах я счёт повышают на единицу, а при индикации из переменной сначала вычитаю эту единицу. Это как вариант.

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


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

Есть ли другой способ (короче код) записать данные в EEPROM или это оптимально?

data @8, $28,$30,$C7,$B8,$00,$00,$00,$0D,$28,$37,$C6,$B8,$00,$00,$00,$45,$28,$36,$C5,$B8,$00,$00,$00,$3C
'dlabel data @8,  word 2896034153487138829     'Слишком большое число (макс 65535)
'dlabel data @16, word 2898003378812485701
'dlabel data @24, word 2897720804324147260
'2830C7B80000000D = 2896034153487138829
'2837C6B800000045 = 2898003378812485701
'2836C5B80000003C = 2897720804324147260

 

И как короче считать?

ReadID:
    read 8,  ID1[0]
    read 9,  ID1[1]
    read 10, ID1[2]
    read 11, ID1[3]
    read 12, ID1[4]
    read 13, ID1[5]
    read 14, ID1[6]
    read 15, ID1[7]
    read 16, ID2[0]
    read 17, ID2[1]
    read 18, ID2[2]
    read 19, ID2[3]
    read 20, ID2[4]
    read 21, ID2[5]
    read 22, ID2[6]
    read 23, ID2[7]
    read 24, ID3[0]
    read 25, ID3[1]
    read 26, ID3[2]
    read 27, ID3[3]
    read 28, ID3[4]
    read 29, ID3[5]
    read 30, ID3[6]
    read 31, ID3[7]
    pause 50
return

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


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

Короче получилось одной строкой

read 8,  id1[0],ID1[1],ID1[2],ID1[3],ID1[4],ID1[5],ID1[6],ID1[7],id2[0],ID2[1],ID2[2],ID2[3],ID2[4],ID2[5],ID2[6],ID2[7],id3[0],ID3[1],ID3[2],ID3[3],ID3[4],ID3[5],ID3[6],ID3[7]

А еще как-то короче можно?

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


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

Пробовал, получается длиннее, чем одной строкой читать.

А вот не получается сделать цикл на измерение температуры.

На третий датчик не хватает места.

DS18B20:
OWOUT DQ, 1, [$55, str ID1\8, $44]       ' Çàïðîñ íà ïîëó÷åíèå äàííûõ
    ReadBusy:
    OWIN DQ, 4, [busy]        ' 
    If Busy = 0 Then ReadBusy       ' Æäåì îêàí÷àíèÿ îáðàáîòêè
OWOUT DQ, 1, [$55, str ID1\8, $BE]       ' ×èòàåì äàííûå
OWIN DQ, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] ' ×èòàåì òåìïåðàòóðíûå äàííûå
'return
'*******************************Êîíâåðòàöèÿ òåìïåðàòóðû ñ äàò÷èêà***************
'CalcC:
If SignBit <> 1 Then 
    TerC1 = rawtemp / 16
    TerD1 = (rawtemp // 16) * 10 / 16
    TempA1 = TerC1 * 10 + TerD1   
    Else
    TerC1 = 65535 - rawtemp
    tempdat1 = TerC1 + 1
    TerC1 = tempdat / 16
    TerD1 = ((tempdat1 + 1) // 16) * 10 / 16
    TempA1 = TerC1 * 10 + TerD1
EndIf
If SignBit = 0 Then
    SignC1 = "+"
    Else
    SignC1 = "-" 
EndIf
if tempa1 = 0 then
    signc1 = " "
endif
RETURN

И такой код 3 раза, для 3 датчиков. Плюс переменные для каждого. В общем тут у меня "раздутое" место.

Даже если убрать условие для определения "+\-", не влезею буквально на 2 адреса. Так еще и условие не задано для 3-го датчика.

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


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

Тут либо камень менять на pic16f88, появиться куча памяти, по ногам проц совпадает с 628.

Либо оптимизировать программу.

Если 4 датчика, значит делать цикл в 4 прохода. При каждом проходе меняться будут только адреса считывания id датчиков и переменные температуры с признаком -. Остальные переменные общие. Программа немного будет отличаться от программы для одного датчика.

Зачем считывать id датчика в переменные? Можно циклом за раз считать и тут же отправить одно число в датчик, и так 8 раз.

В цикле писать так

For i = adr to adr+8

Read adt,temp

Owout.... [Temp]

Next i

Так мы отправил датчиками нужный id

 

В самом начале создаём цикл изходя из количества датчиков.

Например

For proh = 0 to 3

Lookup proh,[0,7,15,23], adr 'адреса id в EEPROM

Потом читаем и отправляем id

Идём на подпрограмму измерения температуры

Tempcel[proh] = tempcel ' переписывания температуру в индивидуальную переменную

Tempdes[proh] = tempdes

Cold[proh] = cold

Next proh

 

По окончании цикла мы будем иметь 4 значения температуры из 4датчиков

Temp1

Temp2

Temp3

Temp4

Потом заморачиваемся с отображением температур и остального.

Как то так

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


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

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

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

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

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

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

Войти

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

Войти



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