Код: Выделить всё
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Код: Выделить всё
If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
Код: Выделить всё
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Код: Выделить всё
If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
Так это Вам виднее. Никто же не подозревает как Вы сохранять время собрались. Мне бы и 20 часов пути за один раз мало было...AVRDaemon писал(а):можно ли на нем сделать время в пути?
Ну, у меня на минус проверить пока негде было, завтра с холодильником буду экспериментировать - взял домой плату с программатором.edm2007 писал(а):Да, забыл совсем, при gosub действительно переходит и отображает нормально. Только на "домашнем" термометре при уходе в минус все нормально, а вот на "уличном" как только 0С и ниже, тут же бъется картинка с непонятными показаниями в итоге.
То бишь бьется только УЛИЧНЫЙ термометр, и именно он (по крайней мере в протеусе) разносит картинку и показания в хлам. А ДОМАШНИЙ отображает отрицательную нормально. Только знак "-" надо добавить.... Алексей, а почему Вы не посадили на один пин оба датчика? Так же проще...
Точно, тут я накосячил. А T1=T1*-1 - этим я хотел вывести отрицательную температуру.edm2007 писал(а):Алексей, у меня вопрос, разбирая расчет на отрицательную температуру увидел следующее:
а следомКод: Выделить всё
If Byte1 > 248 Then ' Проверка на отрицательность температуры Byte0 = &HFF - Byte0 Byte1 = &HFF - Byte1
Так если Byte1 был больше 248 и отнялся от FF в первом случае, то как он может потом проверяться?Код: Выделить всё
If Byte1 > 248 Then T1 = T1 + 1 T1 = T1 * -1
А всё просто!Gordon Shumway писал(а):А по поводу двух датчиков на один пин - пока не разобрался как это сделать.
Код: Выделить всё
Term:
Dsid1(1) = 1wsearchfirst() -определяем номера датчиков
Dsid2(1) = 1wsearchnext()
Do
1wreset -запускаем датчики на измерение
1wwrite &HCC
1wwrite &H44
Waitms 750
'---------------------------------
1wreset -теперь поочереди считываем из памяти каждого датчика
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
'****
Cls
Gosub Shot
Locate 1 , 1
Lcd Chr(1) ; Text ; Chr(3)
I1 = I2
Gosub Shot
Lowerline
Lcd Chr(0) ; Text ; Chr(3)
Loop
Shot:
I1 = I1 * 10
I1 = I1 \ 16
Text = Str(i1)
Text = Format(text , " 0.0")
ReturnСпасибо, буду думать дальше. Но максимумы и минимумы так и не показываются... На железе посмотрел.kip96 писал(а):Вот подправил, в плане измерения температуры. Хочу обратить внимание на уменьшение исп. памяти. Остальное по анологии.
Код: Выделить всё
On Int0 Maxmin Nosave
А, все верно. Там расчет минимума/максимума от старого кода остался, а в новом изменились переменные температур (1temper, 2temper). Вот и нули.edm2007 писал(а):Пошагово посмотрел, это в максимум/минимум при расчете пишутся 0. Вот он их и выводит. Надо поглядеть почему так.
Ваш код работает, температуры выводятся корректно, в том числе отрицательные (эксперимент с холодильником прошел успешно), только я не понял, где, собственно, отрицательное число получается ? Я в своем примере умножал на -1, а у вас я ни вижу ничего похожего. Откуда берется отрицательное число ?kip96 писал(а):Вот подправил, в плане измерения температуры. Хочу обратить внимание на уменьшение исп. памяти. Остальное по анологии.
Похоже это работает, выводятся нулевые максимум и минимум, но это надо с переменными разбираться. Экраны не портятся.edm2007 писал(а):Попробуйте ради интереса
Только сброс флага добавьте при выходе из прерывания (GIFR=64). Так хоть прерывание работает и протеус не ругает. Пошагово посмотрел, это в максимум/минимум при расчете пишутся 0. Вот он их и выводит. Надо поглядеть почему так.Код: Выделить всё
On Int0 Maxmin Nosave
Так сам датчик его и даёт!. У меня ведь:Gordon Shumway писал(а):только я не понял, где, собственно, отрицательное число получается ?
Код: Выделить всё
Dim D1 As Integer , D2 As IntegerКод: Выделить всё
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1Код: Выделить всё
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 =not Byte0
Byte1 =not Byte1$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 8
$framesize = 100
Config Portd.4 = Output
Portd.4 = 0
Config Portb.0 = Output 'D/C (pin 4)
D3310dc Alias Portb.0
Config Portd.3 = Output 'SCE (pin 5)
D3310ce Alias Portd.3
Config Portd.6 = Output 'Reset (pin 8 )
D3310re Alias Portd.6
'Config Pind.2 = Input
Config Int0 = Falling
On Int0 Maxmin Nosave
Config 1wire = Portb.7
Dim A As Bit
Dim B As Bit
Dim Byte0 As Byte , Byte1 As Byte 'читать датчики
Dim Byte2 As Byte , Byte3 As Byte
'Dim T1 As Single , T2 As Single
'Dim T3 As Single , T4 As Single
Dim 1sign As String * 1
Dim 1signmax As String * 1
Dim 1signmin As String * 1
Dim 2sign As String * 1
Dim 2signmax As String * 1
Dim 2signmin As String * 1
Dim 1tmax As Integer , 1tmin As Integer
Dim 2tmax As Integer , 2tmin As Integer
Dim 1temper As String * 7
Dim 1tempermax As String * 10
Dim 1tempermin As String * 10
Dim 2temper As String * 7
Dim 2tempermax As String * 10
Dim 2tempermin As String * 10
Dim D1 As Integer , D2 As Integer
'конфигурируем SPI в программном режиме. SCLK (pin 2) - PORTD.0; SDA (pin 3) - PORTD.1;
Config Spi = Soft , Din = Portb.1 , Dout = Portd.1 , Ss = None , Clock = Portd.0
'Initialise Spi
Spiinit
$include "3310init.bas"
'Initialise the display
Call D3310reset
Call D3310init
Call D3310clear
Restore Bmp1 'D3310Bmp1 is the label name for the first bmp
Call D3310bmpout
'A = 0
'B = 0
Do
Disable Int0
Disable Interrupts
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Bitwait Portb.7 , Set ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
D1 = 1wread(2) '
Waitms 750
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5 ' Выдаем команду чтения ПЗУ
1wwrite &H44 , 1 , Pinc , 5 ' Запуск измерения
Bitwait Pinc.5 , Set ' Ждем окончания преобразования
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5
1wwrite &HBE , 1 , Pinc , 5 ' Команда чтения ОЗУ датчика
D2 = 1wread(2 , Pinc , 5) '
D1 = D1 * 10
D1 = D1 \ 16
1temper = Str(d1)
1temper = Format(1temper , "0.0")
D2 = D2 * 10
D2 = D2 \ 16
2temper = Str(d2)
2temper = Format(2temper , "0.0")
Enable Interrupts
Enable Int0
If A = 0 Then
1tmax = D1
1tmin = D1
A = 1
End If
If D1 > 0 Then
1sign = "+"
Else
1sign = ""
End If
If D1 > 1tmax Then 1tmax = D1
If D1 < 1tmin Then 1tmin = D1
If 1tmax > 0 Then 1signmax = "+"
If 1tmax <= 0 Then 1signmax = ""
If 1tmin > 0 Then 1signmin = "+"
If 1tmin <= 0 Then 1signmin = ""
1temper = 1sign + 1temper
If D1 < 100 And D1 > -100 Then
1temper = 1temper + "_C "
Else
1temper = 1temper + "_C"
End If
1tempermax = Str(1tmax)
1tempermax = Format(1tempermax , "0.0")
1tempermax = 1signmax + 1tempermax
1tempermax = 1tempermax + "_C"
1tempermin = Str(1tmin)
1tempermin = Format(1tempermin , "0.0")
1tempermin = 1signmin + 1tempermin
1tempermin = 1tempermin + "_C"
'расчет показаний второго датчика
If B = 0 Then
2tmax = D2
2tmin = D2
B = 1
End If
If D2 > 0 Then
2sign = "+"
Else
2sign = ""
End If
If D2 > 2tmax Then 2tmax = D2
If D2 < 2tmin Then 2tmin = D2
If 2tmax > 0 Then 2signmax = "+"
If 2tmax <= 0 Then 2signmax = ""
If 2tmin > 0 Then 2signmin = "+"
If 2tmin <= 0 Then 2signmin = ""
2temper = 2sign + 2temper
If D2 < 100 And D2 > -100 Then
2temper = 2temper + "_C "
Else
2temper = 2temper + "_C"
End If
2tempermax = Str(2tmax)
2tempermax = Format(2tempermax , "0.0")
2tempermax = 2signmax + 2tempermax
2tempermax = 2tempermax + "_C"
2tempermin = Str(2tmin)
2tempermin = Format(2tempermin , "0.0")
2tempermin = 2signmin + 2tempermin
2tempermin = 2tempermin + "_C"
Call D3310position(6 , 1)
Call D3310print(1temper)
Call D3310position(6 , 4)
Call D3310print(2temper)
Wait 1
Loop
End
Maxmin:
Call D3310clear
Restore Bmp2
Call D3310bmpout
Call D3310position(6 , 1)
Call D3310print(1tempermax)
Call D3310position(6 , 2)
Call D3310print(1tempermin)
Call D3310position(6 , 4)
Call D3310print(2tempermax )
Call D3310position(6 , 5)
Call D3310print(2tempermin)
Wait 5
Call D3310clear
Restore Bmp1
Call D3310bmpout
Gifr = 64
Return
$include "3310end.bas"
$include "bmp1.bas"
$include "bmp2.bas"
Программка FastlCD.exe. Ставим размер экрана 84х48 точек, рисуем или загружаем свой заранее подготовленный bmp черно-белый. Жмем кнопку BAS - получаем файл имя.bas. редактируем его - ставим Data в начале каждой строки.kip96 писал(а): Я присмотрел код, можно уменьшить до 50% памяти, так-то проект можно развить, добавить часы(RTC), датчики там разные, короче сделать не плохую метеостанцию, или терморегулятор для тёплых полов. Я думаю себе что-нибудь сделаю. Но с индикатором 3301 не работал. Как Вы картинки рисуете?
Код: Выделить всё
1temper = Format(1temper , "+0.0")Я правда не понял логику показывания минимума и максимума, но вот вставил в подпрограмму Maxmin:- А=0, В=0, и стало паказывать мин и макс, от последнего нажатия кнопки.Gordon Shumway писал(а):Но появился еще один непонятный глюк - значения максимума и минимума почему-то иногда сбрасываются на текущие значения...