[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Термометр с памятью
VK79Дата: Среда, 12.02.2014, 11:51 | Сообщение # 1
Группа: Пользователи
Сообщений: 1

Статус: Offline
Всем привет! Начал разбираться с МК, первым собственным проектом выбрал термометр на 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




Сообщение отредактировал VK79 - Среда, 12.02.2014, 11:53
 
  • Страница 1 из 1
  • 1
Поиск: