[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Мастерская » Успехи в мире робототехники » Часы-термометр (Для авто)
Часы-термометр
SpaceДата: Понедельник, 27.06.2011, 00:04 | Сообщение # 1
Администратор
Язык программированя: BascomAVR
Группа: Администраторы
Сообщений: 327
Репутация: 8
Статус: Offline
Не робот конечно, но девайс достаточно интересный. Использовал ATmega8.
Немного предыстории...
Если у кого то есть или был Москвич 2141-45 именуемый как Святогор, да и без разницы даже пусть 2141, наверняка сталкивались с проблемой охлаждения. Вентилятор ни когда не включается во время, а то и вообще не включается, из-за чего постоянно кипим. Чтож меня это так сказать достало, в прошлом году сделал девайс простенький. Вместо штатного датчика температуры поставил в радиатор DS18B20(раскурочил штатный датчик, оставив только корпус без внутренностей, поставил в него DS18B20, залил эпоксидной смолой и вкрутил в радиатор). Написал программку измерения температуры и вывод её на дисплей. Добавил к схеме реле(как оо используется объясню позже). Короче при достижение заданной температуры в программе вкл. вентилятор. Всё отлично работало, но решил модернизировать девайс и добавить часы, принудительное включение вентилятора с помощью одной кнопки без фиксации(используя прерывания в программе), установку температуры(настраивается через меню и записывается в EEPROM мк) при которой будет вкл. и выкл. вентилятор... Вообщем вот, фотки ниже.

Теперь о том как это работает. Сначала о реле. Штатный датчик работал так. При достижение температуры 97 градусов он замыкал свои контакты. После чего включался вентилятор на радиаторе. Два контакта реле подключены именно в то место куда был подключён штатный датчик температуры. Соответственно когда они замыкаются вкл. вентилятор.
При первом запуске программы следует настроить часы и температуру срабатывания вентилятора(хотя срабатывает реле, а вентилятор всё таки на машине а не на девайсе)) ). Для настройки имеется 4 кнопки (меню, ввод, вверх, вниз) и ещё 2 - одна отвечает за RESET другая за вкл. реле. Нажимаем клавишу меню. На экране дисплея появится надпись выбора температуры вкл., после выбора температуры(для этого используем кнопки вверх и вниз) нажимаем клавишу ввод, появляется след. надпись с выбором температуры выкл. и т. д. Всего в меню таких настроек 7: температура вкл., температура выкл., год, месяц, число, часы, минуты. Когда все настройки выполнены на экране появятся все введённые вами данные(кроме температуры вкл. и выкл.). Также в программе сделано так, что если необходимо вкл. реле принудительно(не дожидаясь пока температура достигнет заданного значения в меню) то удерживаем кнопку отвечающую за вкл. реле.
Не много подробней про эту кнопку. В программе два цикла. В-первом цикле реле вкл. при достижение заданной температуры. Во-втором цикле реле вкл. и выкл. при нажатие на клавишу. Чтобы перейти из 1-ого цикла во-второй нужно удержать клавишу. И также обратно. За этот момент кстати спасибо galex1981, подкинул идею(здесь обсуждалось) как реализовать такое, чтобы не было конфликта между вкл. реле от температуры и вкл. реле от нажатия клавиши.

Ну иссходик конечно выложил. Также выложил разводку платы и схему(программа Eagle). Смотреть всё в архиве "Time"
Программа разделена на два файла. Файл Time основной, файл Subs-в нём все процедуры программы.
Код из файла Time
Code
'*******************************************************************************
' Автор: Space                    *
' Сайт: www.enore.ucoz.ru                    *
' Дата начала:  25.06.2011 г.                    *
' CPU:  ATmega8                    *
' Тактовая частота:  8000000  Hz                    *
' Компилятор: BASCOM-AVR 1.11.9.0                    *
'*******************************************************************************
' Программируемые Fuse:
' CKSEL0, CKSEL1, CKSEL3
' EESAVE
' SPIEN
'*******************************************************************************

'***************************Тип_микроконтроллера*   *******************************
$regfile = "m8def.dat"                    'Указываем используемый мк
$crystal = 8000000                    'Задаём рабочую частоту мк
'***********************Дополнительные_библиотеки*******************************
$lib "mcsbyte.lbx"
'$lib "ds1307clock.lib"  - здесь эта библиотека не нужна
'****************************Конфигурация_ЖКИ***********************************
Config Lcdbus = 4                    ' 4-х битное подключение дисплея
Config Lcdpin = Pin , Rs = Portb.1 , E = Portb.2 , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5
Config Lcd = 16 * 2                    ' Дисплей 16 сисмволов, 2 строки
Cursor Off                    'Отключаем курсор
Cls                    'Очистка экрана
'********************************Порты******************************************
'Командой "Set" подключаем внутренний резисмтор на +
Set Portc.0 : Вниз Alias Pinc.0                             'Кнопка вниз
Set Portc.1 : Вверх Alias Pinc.1                            'Кнопка вверх
Set Portc.2 : Меню Alias Pinc.2                             'Кнопка меню
Set Portc.3 : Ввод Alias Pinc.3                             'Кнопка ввод
'*********************************I2C*******************************************
Config Sda = Portc.4
Config Scl = Portc.5
'*******************************************************************************
Config Portd.0 = Output : Speaker Alias Portd.0             'Пин, на котором висит Speaker
Config 1wire = Portd.1                    'Пин, на который повешан DS18B20
Set Portd.2 : Вкл_выкл Alias Pind.2                         'Клавиша для принудительного вкл. и выкл. реле
Config Portd.4 = Output : Реле Alias Portd.4
'*******************************************************************************
Config Clock = User
Config Date = Dmy , Separator = .
'********************************Константы**************************************
Const Ds1307w = &HD0
Const Ds1307r = &HD1
'*******************************Прерывания**************************************
Config Int0 = Falling                    'Разрешаем прерывания по спаду напряжения On Int0
On Int0 Вклвыкл_Реле                    'Задаём метку перехода по прерыванию
Enable Interrupts                    'Разрешаем прерывания
Config Debounce = 100                    'Опрос клавиши каждые 100 мс
'******************************Переменные***************************************
'*********************************Byte****************   **************************
Dim J1 As Byte                    'Объявить байтовую переменную J1
Dim M1 As Byte                    'Объявить байтовую переменную M1
Dim D1 As Byte                    'Объявить байтовую переменную D1
Dim H1 As Byte                    'Объявить байтовую переменную H1
Dim X1 As Byte                    'Объявить байтовую переменную X1
Dim T2 As Byte                    'Объявить байтовую переменную T1
Dim Aa As Byte                    'Объявить байтовую переменную Aa
Dim Pos As Byte                    'Объявить байтовую переменную Pos
Dim Min1 As Byte                    'Объявить байтовую переменную Min1
Dim Temp As Byte                    'Объявить байтовую переменную Temp
Dim Digit As Byte                    'Объявить байтовую переменную Digit
Dim Byte0 As Byte                    'Объявить байтовую переменную Byte0
Dim Byte1 As Byte                    'Объявить байтовую переменную Byte1
Dim Faren As Byte                    'Объявить байтовую переменную Faren
Dim Weekday As Byte                    'Объявить байтовую переменную Weekday
'********************************Integer****************************************
Dim A As Integer                    'Объявить целую переменную A
Dim B As Integer                    'Объявить целую переменную B
Dim Tem1 As Integer                    'Объявить целую переменную Tem1
Dim Tem2 As Integer                    'Объявить целую переменную Tem2
'*********************************Single****************************************
Dim Faren0 As Single                    'Объявить десятичную (число с плавающей точкой) переменную Faren0
'*********************************String****************************************
Dim Celsium As String * 5                    'Объявить символьную переменную Celsium
Dim Fahrenhei As String * 5                    'Объявить символьную переменную Fahrenhei
Dim Signtemperatura As String * 1                           'Объявить символьную переменную Signtemperatura
'******************************Переменные Eeprom********************************
Dim Ae As Eram Integer                    'Объявить целую переменную в EEPROM Ae
Dim Be As Eram Integer                    'Объявить целую переменную в EEPROM Be
A = Ae
B = Be
'************************************Процедуры**********************************
Declare Sub Ввод_даты_времени()                             'Объявить процедуру Ввод_даты_времени()
Declare Sub Вверх_вниз_ввод()                    'Объявить процедуру Вверх_вниз_ввод()
Declare Sub Температура                    'Объявить процедуру Температура
Declare Sub МенюП()                    'Объявить процедуру МенюП()
Declare Sub Вов()                    'Объявить процедуру Вов()
'*******************************************************************************
'*****************************Оcновной_цикл_програм   мы***************************
Вкл._от_перемены_температуры:
Disable Int0                    'Запрещаем прерывания на Int0
Sound Speaker , 3000 , 100
'*******************************************************************************
'В этом цикле реле вкл. и выкл. только по достижению заданного значения температуры.
'При удержании  клавиши Вкл_выкл осущевствляется переход на метку Вкл._от_перемены_температуры
Do
Call Температура                    'Вызвать подпрограмму(процедуру) "Температура"
Call Вов                    'Вызвать подпрограмму(процедуру) "Вов"
Locate 1 , 1                    'Вывод данных на дисплей, 1 строчка, 1 знакоместо
Lcd Time$ ; "**" ; Celsium ; "***"                          'На дисплее выводим время, затем температуру
Locate 2 , 1                    'Вывод данных на дисплей, 2 строчка, 1 знакоместо
Lcd Date$ ; "**" ; Fahrenhei ; "**"                         'На дисплее выводим дату, затем температуру
If Меню = 0 Then : Gosub МенюП : End If                     'При нажатие клавиши меню, переходим на метку МенюП
Debounce Вкл_выкл , 0 , Вкл._от_клавиши                     'При нажатие клавиши Вкл_выкл переходим в цикл Вкл._от_клавиши
Loop
'*******************************************************************************
Вкл._от_клавиши:
Enable Int0                    'Разрешаем прерывания на Int0
'*******************************************************************************
'В этом цикле реле вкл. и выкл. только по нажатию клавиши Вкл_выкл.
'При удержании этой же клавиши осущевствляется переход на метку Вкл._от_перемены_температуры
Do
Call Температура                    'Вызвать подпрограмму(процедуру) "Температура"
Locate 1 , 1                    'Вывод данных на дисплей, 1 строчка, 1 знакоместо
Lcd Time$ ; "**" ; Celsium ; "***"                          'На дисплее выводим время, затем температуру
Locate 2 , 1                    'Вывод данных на дисплей, 2 строчка, 1 знакоместо
Lcd Date$ ; "**" ; Fahrenhei ; "**"                         'На дисплее выводим дату, затем температуру
If Меню = 0 Then : Gosub МенюП : End If                     'При нажатие клавиши меню, переходим на метку МенюП
Debounce Вкл_выкл , 0 , Вкл._от_перемены_температуры        'При нажатие клавиши Вкл_выкл переходим в цикл Вкл._от_перемены_температуры
Loop
'*******************************************************************************
Getdatetime:
     I2cs t art                    ' Generate start code
     I2cwbyte Ds1307w                    'Отправка адреса
     I2cwbyte 0                    'Стартовый адрес в 1307
     I2cstart                    ' Generate start code
     I2cwbyte Ds1307r                    'Отправка адреса
     I2crbyte _sec , Ack                    'Секунды
     I2crbyte _min , Ack                    'Минуты
     I2crbyte _hour , Ack                    'Часы
     I2crbyte Weekday , Ack                    'День недели
     I2crbyte _day , Ack                    'День
     I2crbyte _month , Ack                    'Месяц
     I2crbyte _year , Nack                    'Год
     I2cstop
     _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
     _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Настройка_даты:
     _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
     I2cstart                    ' Generate start code
     I2cwbyte Ds1307w                    ' send address
     I2cwbyte 4                    ' starting address in 1307
     I2cwbyte _day                    ' Send Data to SECONDS
     I2cwbyte _month                    ' MINUTES
     I2cwbyte _year                    ' Hours
     I2cstop
Return

Настройка_времени:
     _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
     I2cstart                    ' Generate start code
     I2cwbyte Ds1307w                    ' send address
     I2cwbyte 0                    ' starting address in 1307
     I2cwbyte _sec                    ' Send Data to SECONDS
     I2cwbyte _min                    ' MINUTES
     I2cwbyte _hour                    ' Hours
     I2cstop
Return

Сохраение_данных:
Writeeeprom A , Ae                    ' сохраняем переменную A в энергонезависимую память мк
Writeeeprom B , Be                    ' сохраняем переменную B в энергонезависимую память мк
Return

Вклвыкл_Реле:
Toggle Реле                    'Инверсия логического уровня на ножке PORTD.4
Return                    'Возврат из подпрограммы в точку где произошло прерывание
'*******************************************************************************
$include "Subs.bas"                    'Подключаем в процесс компиляции внешний файл с процедурами
'Если вам так не удобно, просто скопируйте весь код в файле Subs.bas и вставьте его вместо $include "Subs.bas"
'*******************************************************************************
End                    'Конец программы
'*******************************************************************************

Код из файла Subs:
Code
'**********************************Процедуры************************************
Sub Ввод_даты_времени()

      'Выбор и последующее сохранение в eeprom мк, температуры вкл. реле

      Cls
      Aa = 0
      X1 = A
      Do
      If X1 > 120 Then X1 = 70
      If X1 < 70 Then X1 = 120
      Locate 1 , 1
      Lcd "[>BГІop їeјѕ.<]"
      Locate 2 , 1
      Lcd "Teјѕ. іє».: " ; X1 ; "  "
      Вверх_вниз_ввод
      Tem1 = X1
      Loop Until Aa = 1
       A = Tem1

'*******************************************************************************

      'Выбор и последующее сохранение в eeprom мк, температуры выкл. реле

      Cls
      Aa = 0
      X1 = B
      Do
      If X1 > 120 Then X1 = 60
      If X1 < 60 Then X1 = 120
      Locate 1 , 1
      Lcd "[>BГІop їeјѕ.<]"
      Locate 2 , 1
      Lcd "Teјѕ. іГє».: " ; X1 ; "  "
      Вверх_вниз_ввод
      Tem2 = X1
      Loop Until Aa = 1
       B = Tem2
      Gosub Сохраение_данных

'*******************************************************************************

      'Выбор и последующее сохранение в память(энергозависимую) ds1307, года

      Cls
      Aa = 0
      X1 = _year
      Do
      If X1 > 99 Then X1 = 9
      If X1 < 9 Then X1 = 99
      Locate 1 , 1
      Lcd "[>аaїa<]"
      Locate 2 , 1
      Lcd "Ўoг: " ; X1 ; "  "
      Вверх_вниз_ввод
      J1 = X1
      Loop Until Aa = 1

'*******************************************************************************

      'Выбор и последующее сохранение в память(энергозависимую) ds1307, месяца

      Cls
      Aa = 0
      X1 = _month
      Do
      If X1 > 12 Then X1 = 1
      If X1 < 1 Then X1 = 12
      Locate 1 , 1
      Lcd "[>аaїa<]"
      Locate 2 , 1
      Lcd "MecЗе: " ; X1 ; "  "
      Вверх_вниз_ввод
      M1 = X1
      Loop Until Aa = 1

'*******************************************************************************

      'Выбор и последующее сохранение в память(энергозависимую) ds1307, дня

      Cls
      Aa = 0
      X1 = _day
      Do
      If X1 > 31 Then X1 = 1
      If X1 < 1 Then X1 = 31
      Locate 1 , 1
      Lcd "[>аaїa<]"
      Locate 2 , 1
      Lcd "аeЅД: " ; X1 ; "  "
      Вверх_вниз_ввод
      D1 = X1
      Loop Until Aa = 1
      _year = J1
      _month = M1
      _day = D1
      Gosub Настройка_даты

'*******************************************************************************

      'Выбор и последующее сохранение в память(энергозависимую) ds1307, часов

      Cls
      Aa = 0
      X1 = _hour
      Do
      If X1 > 23 Then X1 = 0
      If X1 < 0 Then X1 = 23
     Locate 1 , 1
      Lcd "[>BpeјЗ<]"
      Locate 2 , 1
      Lcd "«acГ: " ; X1 ; "  "
      Вверх_вниз_ввод
      H1 = X1
      Loop Until Aa = 1

'*******************************************************************************

      'Выбор и последующее сохранение в память(энергозависимую) ds1307, минут

      Cls
      Aa = 0
      X1 = _min
      Do
      If X1 > 59 Then X1 = 0
      If X1 < 1 Then X1 = 59
      Locate 1 , 1
      Lcd "[>BpeјЗ<]"
      Locate 2 , 1
      Lcd "MёЅyїГ: " ; X1 ; " "
      Вверх_вниз_ввод
      Min1 = X1
      Loop Until Aa = 1

      _hour = H1
      _min = Min1
     _sec = 0
      Gosub Настройка_времени
End Sub

'*******************************************************************************
'Процедура отвечающая за ввод данных, увеличение и уменьшение значения

Sub Вверх_вниз_ввод()
      Waitms 300
      If Вверх = 0 Then Incr X1
      If Вниз = 0 Then Decr X1
      If Ввод = 0 Then : Aa = 1 : Else : : Aa = 0 : End If
End Sub

'*******************************************************************************
'Процедура отвечающая за открытие меню для каждого вводимого значения

Sub МенюП()
Sound Speaker , 100 , 800
Aa = 0
X1 = 0
Вверх_вниз_ввод
Ввод_даты_времени
Cls
End Sub
End

'*******************************************************************************
'Процедура отвечающая за показания датчика температуры DS18B20

Sub Температура
1wreset
1wwrite &HCC                    ' Выдаем команду чтения ПЗУ
1wwrite &H44                    ' Запуск измерения
Waitms 750                    ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE                    ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                    ' Читаем нулевой байт
Byte1 = 1wread()                    ' Читаем первый байт
If Byte1 >= 248 Then                    ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16                    ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                    ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
Temp = Temp + T2                    ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
Faren0 = Temp * 1.8
Faren = Faren0 + 32
Celsium = Signtemperatura + Str(temp) + "C"
Fahrenhei = Signtemperatura + Str(faren) + "F"
End Sub

'*******************************************************************************
'Процедура отвечающая за вкл. и выкл. реле при заданной в настрокйках, температуре

Sub Вов

     Tem1 = A
     Tem2 = B

     If Temp => Tem1 Then : Реле = 1 : End If

     If Temp <= Tem2 Then : Реле = 0 : End If

End Sub

Программа занимает 53% памяти мк, поэтому при желание можно программу дополнить.





Прикрепления: 9765004.jpg (332.3 Kb) · 3909908.jpg (341.7 Kb) · 1528702.jpg (600.0 Kb) · 5725803.jpg (278.8 Kb) · 4222559.jpg (348.5 Kb) · 7581858.jpg (354.7 Kb) · 4461602.jpg (365.0 Kb) · 2341056.png (32.5 Kb) · 0108705.png (41.5 Kb) · Time.rar (885.7 Kb)


SkylineДата: Среда, 29.06.2011, 11:13 | Сообщение # 2
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Хороший девайс! Аккуратно сделано! Сам делаю термометр на Atmega8 и 2-х LM35. Вроде бы и с 7-сегментником разобрался и вывод температуры сделал, но блин не могу организовать, чтобы при нажатой кнопке показывалась одна температура, а при не нажатой другая! Вроде сделал по внешнему прерыванию, типо все время показывается одна температура, а по прерыванию переход к другой, так индикация второй идет всего секунду и тут же переход к первой. Пока не совсем разобрался с внешними прерываниями, можешь подсказать как здесь лучше сделать?
nightmareДата: Среда, 29.06.2011, 11:27 | Сообщение # 3
Язык программированя: C,C#
Группа: Проверенные
Сообщений: 133
Репутация: 3
Статус: Offline
В прерывании переключай канал АЦП в регистре ADMUX, кнопка между минусом и портом, параллельно кнопке обязательно конденсатор на 100 нф...1 мкф на землю.
Как переключишь канал - начнет с другого датчика температуру считывать.
Порт с подтяжкой.
Хотя, кнопку обрабатывать можно и в основном цикле, так даже проще.


russian-robots@conference.jabber.ru - jabber чат для робототехников

Сообщение отредактировал nightmare - Среда, 29.06.2011, 11:29
SkylineДата: Среда, 29.06.2011, 11:44 | Сообщение # 4
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Что за регистр такой? Просто по прерыванию сменить канал АЦП?
nightmareДата: Среда, 29.06.2011, 12:00 | Сообщение # 5
Язык программированя: C,C#
Группа: Проверенные
Сообщений: 133
Репутация: 3
Статус: Offline
Да, переключить канал и запустить измерение.
Что за регистр - см. даташит.
--------------------------------
Совсем забыл, там же в баскоме есть функция, getadc(channel), в прерывании меняй значение переменной channel


russian-robots@conference.jabber.ru - jabber чат для робототехников

Сообщение отредактировал nightmare - Среда, 29.06.2011, 12:17
SkylineДата: Среда, 29.06.2011, 12:34 | Сообщение # 6
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Quote (nightmare)
Совсем забыл, там же в баскоме есть функция, getadc(channel), в прерывании меняй значение переменной channel

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


Сообщение отредактировал Skyline - Среда, 29.06.2011, 12:35
SpaceДата: Среда, 29.06.2011, 14:45 | Сообщение # 7
Администратор
Язык программированя: BascomAVR
Группа: Администраторы
Сообщений: 327
Репутация: 8
Статус: Offline
Quote (Skyline)
Хороший девайс! Аккуратно сделано! Сам делаю термометр на Atmega8 и 2-х LM35. Вроде бы и с 7-сегментником разобрался и вывод температуры сделал, но блин не могу организовать, чтобы при нажатой кнопке показывалась одна температура, а при не нажатой другая! Вроде сделал по внешнему прерыванию, типо все время показывается одна температура, а по прерыванию переход к другой, так индикация второй идет всего секунду и тут же переход к первой. Пока не совсем разобрался с внешними прерываниями, можешь подсказать как здесь лучше сделать?

Спасиб. Помочь можно, вроде ни чего сложного. Набросал код. При замкнутой кнопке горит один светодиод, при разомкнутой кнопке другой. Просто сделать надо два цикла и использвать команду, которая будет проверять состояние кнопки каждые 100мс например. вообщем вот код:
Code
$regfile = "m32def.dat"
$crystal = 16000000

Config Portb.0 = Output : Led1 Alias Portb.0
Config Portb.1 = Output : Led2 Alias Portb.1
Set Portd.2 : Вкл_выкл Alias Pind.2

Config Int0 = Falling                    'Разрешаем прерывания по спаду напряжения On Int0
Enable Interrupts                    'Разрешаем прерывания
Config Debounce = 100                    'Опрос клавиши каждые 100 мс
1:
Do
Led1 = 1
Led2 = 0
Debounce Вкл_выкл , 0 , 2                    'При нажатие клавиши Вкл_выкл переходим в цикл 2
Loop
2:
Do
Led2 = 1
Led1 = 0
Debounce Вкл_выкл , 1 , 1                    'При нажатие клавиши Вкл_выкл переходим в цикл 1
Loop


Проверил, работает, если не разберешься скинь свою прогу, гляну, но думаю сделаешь happy

Добавлено (29.06.2011, 14:45)
---------------------------------------------
Если кнопка без фиксации, то вот здесь:

Code
Debounce Вкл_выкл , 1 , 1                    'При нажатие клавиши Вкл_выкл переходим в цикл 1

заменить на это:
Code
Debounce Вкл_выкл , 0 , 1                    'При нажатие клавиши Вкл_выкл переходим в цикл 1


SkylineДата: Четверг, 30.06.2011, 10:29 | Сообщение # 8
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Спасибо! Но что-то желаемого результата не получается! Первая температура показывается при не нажатой кнопке, при нажатие индикация по нулям, пока не отпустишь!
Code
'*******************************************************************************
1:
Do
Start Adc
...
Debounce Button , 0 , 2                    
Return
Loop
'*******************************************************************************
2:
Do
Start Adc
...
Debounce Button , 0 , 1                    
Return
Loop
'*******************************************************************************

Считывание АЦП происходит в обработчике прерывания, может ли это повлиять?
Есть еще третий цикл обработки индикации. Плюс Протеус какое-то предупреждение дает: "is out of program memory size", что-то типо объем памяти находится вне программы!
SpaceДата: Четверг, 30.06.2011, 16:44 | Сообщение # 9
Администратор
Язык программированя: BascomAVR
Группа: Администраторы
Сообщений: 327
Репутация: 8
Статус: Offline
Quote (Skyline)
Считывание АЦП происходит в обработчике прерывания, может ли это повлиять?

возможно
Подожди тогда не много. попробую сделать, подключу два шарпа и на основе них сделаю прогу похожую с твоими датчиками


SkylineДата: Четверг, 30.06.2011, 22:03 | Сообщение # 10
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Попробовал убрать считывание по переполнению таймера в обработчике прерываний, в итоге ни какой реакции на кнопку и температура-1 и температура-2 по нулям!
SpaceДата: Суббота, 09.07.2011, 22:57 | Сообщение # 11
Администратор
Язык программированя: BascomAVR
Группа: Администраторы
Сообщений: 327
Репутация: 8
Статус: Offline
Вот код:

Code
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19200

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Set Portd.2 : Вкл_выкл Alias Pind.2

Config Int0 = Falling                    'Разрешаем прерывания по спаду напряжения On Int0
Enable Interrupts                    'Разрешаем прерывания
Config Debounce = 100                    'Опрос клавиши каждые 100 мс

Dim A As Word
Start Adc
Waitms 250

1:

Do
   A = Getadc(1)
    Locate 1 , 6
    Print "ADC(1):" ; A ; "   "
    Debounce Вкл_выкл , 0 , 2
    Waitms 100
Loop

2:

Do
   A = Getadc(2)
    Locate 1 , 6
    Print "ADC(2):" ; A ; "   "
    Debounce Вкл_выкл , 0 , 1
    Waitms 100
Loop


при нажатие клавиши выполняется второй цикл, при втором нажатие на клавишу выполняется 1 цикл. проверил на двух шарпах. с выводом в терминал, всё работает

Добавлено (09.07.2011, 22:57)
---------------------------------------------
если используеший код похожий как здесь - в самом низу код для двух датчиков смотри
то попробуй так:
Code
1:
Do
Gosub Convallt                    'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid1(1) : X = 1 : Gosub Temperature               '1 ds18b20 выводим на первой(Х=1) строчке дисплея
   Debounce Вкл_выкл , 0 , 2
Loop

2:
Do
Gosub Convallt                    'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid2(1) : X = 2 : Gosub Temperature               '2 ds18b20 выводим на второй(Х=2) строчке дисплея
Debounce Вкл_выкл , 0 , 1
Loop
End


SkylineДата: Среда, 13.07.2011, 09:19 | Сообщение # 12
Язык программированя: BASCOM AVR Basic
Группа: Пользователи
Сообщений: 15
Репутация: 1
Статус: Offline
Спасибо! Попробую теперь сделать.

Добавлено (13.07.2011, 09:19)
---------------------------------------------
Спасибо Space! Программу сделал, в протеусе все работает как надо!

nightmareДата: Четверг, 14.07.2011, 14:07 | Сообщение # 13
Язык программированя: C,C#
Группа: Проверенные
Сообщений: 133
Репутация: 3
Статус: Offline
Хы, а туда и игру ведь можно добавить какую-нибудь))

russian-robots@conference.jabber.ru - jabber чат для робототехников
KrishДата: Понедельник, 25.07.2011, 20:23 | Сообщение # 14
Группа: Пользователи
Сообщений: 184
Репутация: 2
Статус: Offline
Как распечатать eagle твой?

Добавлено (25.07.2011, 20:23)
---------------------------------------------
И вот интересный диод на схеме, стоит на питании около дросселя 220мкГн 1N5819, он как я вижу не пускает + на GND для чего?
А как ты указываешь что при достижение 97 градусов замыкается реле? Интересен данный кусок кода.
И вот что интересно, для чего ты подключаешь реле к МК через транзистор BC847, это чтобы МК не спалить? там что резистора не хватит?


LacOS
SpaceДата: Вторник, 26.07.2011, 21:25 | Сообщение # 15
Администратор
Язык программированя: BascomAVR
Группа: Администраторы
Сообщений: 327
Репутация: 8
Статус: Offline
Quote (Krish)
Как распечатать eagle твой?

http://easyelectronics.ru/rabota-v-eagle-cad-chast-1.html
выбираешь слой, который тебе нужен и печатаешь его
Quote (Krish)
И вот интересный диод на схеме, стоит на питании около дросселя 220мкГн 1N5819, он как я вижу не пускает + на GND для чего?

вообще там на 100мГн. я не в курсе для чего он там. надо даташит читать
Quote (Krish)
А как ты указываешь что при достижение 97 градусов замыкается реле? Интересен данный кусок кода.

Code
Sub Вов

   Tem1 = A
   Tem2 = B

   If Temp => Tem1 Then : Реле = 1 : End If

   If Temp <= Tem2 Then : Реле = 0 : End If

End Sub


Quote (Krish)
И вот что интересно, для чего ты подключаешь реле к МК через транзистор BC847, это чтобы МК не спалить? там что резистора не хватит?

Потому что реле потребляет больше 20мА+транзисор для усиления сигнала
подробно написанное про такие вещи тут

Добавлено (26.07.2011, 21:25)
---------------------------------------------
Снял видюху по устройству с комментариями, вроде норм получилось


Форум » Мастерская » Успехи в мире робототехники » Часы-термометр (Для авто)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: