edm2007 писал(а):Gordon Shumway писал(а):Завтра смогу весь код выложить и фотки того, что получается.
Вот это будет замечательно.
Вот:
$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
Config 1wire = Portb.7
Dim A 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 Single , 1tmin As Single
Dim 2tmax As Single , 2tmin As Single
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
Enable Interrupts
Enable Int0
'конфигурируем 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
Do
'If Pind.2 = 0 Then Gosub Maxmin
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread()
Waitms 750
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5 ' Выдаем команду чтения ПЗУ
1wwrite &H44 , 1 , Pinc , 5 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5
1wwrite &HBE , 1 , Pinc , 5 ' Команда чтения ОЗУ датчика
Byte2 = 1wread(1 , Pinc , 5) ' Читаем нулевой байт
Byte3 = 1wread(1 , Pinc , 5) ' Читаем первый байт
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Else
1sign = "+"
End If
T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
1sign = ""
End If
If 1sign = "+" And T1 = 0 Then ' убираем знак "+" с нулевой температуры
1sign = " "
End If
If A = 0 Then
1tmax = T1
1tmin = T1
End If
If T1 > 1tmax Then 1tmax = T1
If T1 < 1tmin Then 1tmin = T1
If 1tmax > 0 Then 1signmax = "+"
If 1tmax <= 0 Then 1signmax = ""
If 1tmin > 0 Then 1signmin = "+"
If 1tmin <= 0 Then 1signmin = ""
1temper = Fusing(t1 , "#.#")
1temper = 1sign + 1temper
1temper = 1temper + "_C"
1tempermax = Fusing(1tmax , "#.#")
1tempermax = 1signmax + 1tempermax
1tempermax = 1tempermax + "_C"
1tempermin = Fusing(1tmin , "#.#")
1tempermin = 1signmin + 1tempermin
1tempermin = 1tempermin + "_C"
'расчет показаний второго датчика
If Byte3 > 248 Then ' Проверка на отрицательность температуры
Byte2 = &HFF - Byte0
Byte3 = &HFF - Byte1
Else
2sign = "+"
End If
T3 = Byte2 / 16
T4 = Byte3 * 16
T3 = T3 + T4
If Byte3 > 248 Then
T3 = T3 + 1
T3 = T3 * -1
2sign = ""
End If
If 2sign = "+" And T3 = 0 Then ' убираем знак "+" с нулевой температуры
2sign = " "
End If
If A = 0 Then
2tmax = T3
2tmin = T3
A = 1
End If
If T3 > 2tmax Then 2tmax = T3
If T3 < 2tmin Then 2tmin = T3
If 2tmax > 0 Then 2signmax = "+"
If 2tmax <= 0 Then 2signmax = ""
If 2tmin > 0 Then 2signmin = "+"
If 2tmin <= 0 Then 2signmin = ""
2temper = Fusing(t3 , "#.#")
2temper = 2sign + 2temper
2temper = 2temper + "_C"
2tempermax = Fusing(2tmax , "#.#")
2tempermax = 2signmax + 2tempermax
2tempermax = 2tempermax + "_C"
2tempermin = Fusing(2tmin , "#.#")
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
Return
$include "3310end.bas"
$include "bmp1.bas"
$include "bmp2.bas"
Основной Экран:
- 1.jpg
- (72.94 КБ) 1123 скачивания

Жмем кнопку:
- 2.jpg
- (76.88 КБ) 1328 скачиваний

Через пять сек. возврат в основной экран. Там все нормально.
Если убрать прерывания:
- 3.jpg
- (78.86 КБ) 1585 скачиваний

Я использовал подправленный файл 3310end.bas из библиотеки - закомментировал все неиспользуемые символы и буквы, иначе в мегу8 не помещается.
Похоже с чушью я справился - убрал лишние инициализации дисплея.
Теперь просто не выводятся значения максимумов и минимумов. Если убратьпрерывания - выводятся нормально.
Вот такая закрутка...