Всем привет! Начал разбираться с МК, первым собственным проектом выбрал термометр на ds1621 (другого не было :). Программу написал, в железе проверил - работает. Теперь прошу помощи. Хочу сделать регистрацию максимального и минимального значения измеренной температуры. Алгоритм придумал такой: считываем из eeprom макс. и мин. значения, сравниваем с измеренным, если измеренное меньше минимального пишем в eeprom, также и с максимальным. На аппаратное прерывание повешена кнопка, по которой на дисплей выводятся последовательно максимальное и минимальное записанные значения с задержкой, например 5 секунд. Неплохо бы предусмотреть какую-нибудь индикацию (например светодиодами) максимального и минимального показываемых значений (на МК как раз две ноги свободные есть). Вот примерно так. Не могу разобраться как писать и читать из eeprom и сравнить два двубайтных значения (у меня точность показаний 0,5*С).
Листинг программы:
Код
[spoiler=Спойлер]$regfile = "Attiny2313.dat"
$crystal = 4000000
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim Sign As Bit
Dim D As Bit
Dim Maxt1 As Byte
Dim Maxt2 As Byte
Dim Mint1 As Byte
Dim Mint2 As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer
Dim Tempmsb As Byte
Dim Templsb As Byte
Ddrb = &B11111111 'сегменты
Ddrd = &B11110011 'катоды
Config Sda = Porta.0 'конфигурация I2C
Config Scl = Porta.1
Config Portd.3 = Input
Config Int1 = Low Level
Enable Interrupts
Enable Int1
On Int1 Button
Do
Gosub Readtemp
Gosub Temptoled
Gosub Led
Loop
Led:
Portd = &B11011111
Select Case N1
Case 0 : Portb = &B00111111
Case 1 : Portb = &B00000110
Case 2 : Portb = &B01011011
Case 3 : Portb = &B01001111
Case 4 : Portb = &B01100110
Case 5 : Portb = &B01101101
Case 6 : Portb = &B01111101
Case 7 : Portb = &B00000111
Case 8 : Portb = &B01111111
Case 9 : Portb = &B01101111
Case 10 : Portb = &B01000000 'минус
Case 11 : Portb = &B00000000 'ничего не показываем
End Select
Waitus 500
Portd = &B11101111
Select Case N2
Case 0 : Portb = &B00111111
Case 1 : Portb = &B00000110
Case 2 : Portb = &B01011011
Case 3 : Portb = &B01001111
Case 4 : Portb = &B01100110
Case 5 : Portb = &B01101101
Case 6 : Portb = &B01111101
Case 7 : Portb = &B00000111
Case 8 : Portb = &B01111111
Case 9 : Portb = &B01101111
Case 10 : Portb = &B01000000 'минус
Case 11 : Portb = &B00000000 'ничего не показываем
End Select
Waitus 500
Portd = &B11111101
Select Case N3
Case 0 : Portb = &B10111111
Case 1 : Portb = &B10000110
Case 2 : Portb = &B11011011
Case 3 : Portb = &B11001111
Case 4 : Portb = &B11100110
Case 5 : Portb = &B11101101
Case 6 : Portb = &B11111101
Case 7 : Portb = &B10000111
Case 8 : Portb = &B11111111
Case 9 : Portb = &B11101111
End Select
Waitus 500
Portd = &B11111110
Select Case N4
Case 0 : Portb = &B00111111
Case 1 : Portb = &B00000110
Case 2 : Portb = &B01011011
Case 3 : Portb = &B01001111
Case 4 : Portb = &B01100110
Case 5 : Portb = &B01101101
Case 6 : Portb = &B01111101
Case 7 : Portb = &B00000111
Case 8 : Portb = &B01111111
Case 9 : Portb = &B01101111
End Select
Waitus 500
Return
Readtemp:
'start convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'read temp
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop
I2cstart
I2cwbyte &H91
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
If Templsb = 128 Then Templsb = 5 Else Templsb = 0
If Tempmsb > 125 Then Sign = 1 'знак минус
If Tempmsb <= 125 Then Sign = 0 'знак плюс, но его не рисуем
If Tempmsb > 125 Then
Toggle Tempmsb 'инвертируем отрицательную температуру
If Templsb = 0 Then Tempmsb = Tempmsb + 1 'коррекция целых отрицательных температур
End If
'--------------
'Waitms 760
'If Maxt1 < Temp1 Then
' Writeeeprom Tempmsb , 10 'нашли максимальное - записываем
' Writeeeprom Templsb , 11
'End If
'
'If Mint1 > Temp1 Then
' Writeeeprom Tempmsb , 12 'нашли минимальное - записываем
' Writeeeprom Templsb , 13
'End If
Return
Temptoled:
M1 = Tempmsb
M2 = M1
M3 = M1
M4 = Templsb
If Sign = 1 Then N1 = 10 Else N1 = 11 'рисуем минус
M2 = M2 Mod 100
M2 = M2 / 10
N2 = Abs(m2)
If N2 = 0 Then 'если второй разряд равен нулю - гасим
N1 = 11
If Sign = 1 Then N2 = 10 Else N2 = 11 'и сдвигаем "минус" на позицию вправо
End If
M3 = M3 Mod 10
N3 = Abs(m3)
M4 = M4 Mod 10 'десятые доли градуса
N4 = Abs(m4)
Return
Button:
Return
End