, вроде все ясно, если найдено больше 1 датчика, тогда считываем код 2 датчика.kip96 писал(а): Откоментировать?
BASCOM AVR в вопросах и ответах
спасибо понял сейчас попробую,
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
- Реклама
только что проверил, работает спасибо за помощь
кстати на счет этой строчки
я тоже думал что никогда не выйдет из этого цикла пробовал сделать просто считывая коды датчиков без цикла и тоже ничего не вышло, а теперь работает, еще раз спасибо.
кстати на счет этой строчки
Код: Выделить всё
Dsid1(1) = 1wsearchfirst() 'Считываем Семейный Код 1 Датчика
Do
Dsid2(1) = 1wsearchnext() ' считываем семейный код 2 датчика
Loop Until Err = 1Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Вот посмотрите какой красивый код! Чисто для LCD. И температура с десятичными,и код маленький. Код короткий, и думаю Вы уже разберётесь без коментариев. Ну ежели чего, спрашивайте.
З.Ы. Код не мой(по части термометра) , тоже содрал, но когда вник.... Всё гениальное просто.
З.Ы. Код не мой(по части термометра) , тоже содрал, но когда вник.... Всё гениальное просто.
- Вложения
-
- вариант с одной линией.rar
- Для LCD
- (42.07 КБ) 256 скачиваний
Все делают ошибки, только мудрецы - новые, а дураки - старые.
огромное спасибо 
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
edm2007 спасибо за то что помогли мне не сломать окончательно голову, отложить еще дальше изучение программирования контроллеров, действительно, один датчик того не стоит, чтобы копаться в 25-30 переменных, лучше пойду и займусь своими делами...STK200/300 полежит еще до лучших времен...
З.Ы. зато теперь знаю как написать, например термостат - взять готовую библиотеку для DS, и по условию показаний датчика гонять реле... конечно остальных плюшек мне еще не скоро увидеть.
З.З.Ы. самоучитель вроде бы хорош, но к сожалению он подразумевает то, что учащийся уже выучил и хорошо знает QBASIC.
З.Ы. зато теперь знаю как написать, например термостат - взять готовую библиотеку для DS, и по условию показаний датчика гонять реле... конечно остальных плюшек мне еще не скоро увидеть.
З.З.Ы. самоучитель вроде бы хорош, но к сожалению он подразумевает то, что учащийся уже выучил и хорошо знает QBASIC.
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
Выбрать можно только 2 варианта.
- Реклама
Av4arik, а и не нужно ломать голову. Вы просто начните с малого, но самостоятельно. Разберитесь с динамической индикацией, прикрутите один датчик, прикрутите кнопки... Это увлекательнейшее занятие, уверяю Вас. Сами не заметите как свои часы - термометр с кучей плюшек напишете, язык-то на самом деле простой. Главное, не воспринимайте сие занятие как какую-то невыносимую каторгу, все как раз наоборот.
А будут вопросы по существу - обязательно будет и помощь. Для того форум и нужен.
А будут вопросы по существу - обязательно будет и помощь. Для того форум и нужен.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
У меня вот полгода заняло изучение баскома, и то не все еще понял, но с нуля что то уже могу сделать!
Тоже кстати ответы в прошедшем году были те самые, мол за тебя никто и ниче делать не будет, бегом в обучалку! И правильно!
Тоже кстати ответы в прошедшем году были те самые, мол за тебя никто и ниче делать не будет, бегом в обучалку! И правильно!
Вот столкнулся с таким делом! У Атмега8 есть 2 внешних прерывания, а мне надо их побольше. Можно на порты раскидать кнопки и объединить выходы с кнопок диодами и подать на прерывание? А в подпрограмме обработки прерывания сделать все так -
Так мне кажется получится сэкономить еще одно прерывание для ИК приемника.
И второе. Команда -
возвращает поцессор в начало кода, или в то место где была прервана программа?
Код: Выделить всё
prerivanie:
if knopka_1 = 1 then : ...действие1... : End if
if knopka_2 = 1 then : ...действие2... : End if
if knopka_3 = 1 then : ...действие3... : End if
if knopka_4 = 1 then : ...действие4... : End if
return
И второе. Команда -
Код: Выделить всё
returnМожете просто в прерывании по таймеру периодически проверять состояние кнопок. Только с действиями не увлекайтесь, это все же прерывание.
Где была прервана.И второе...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
имеется такой код
он сравнивает текущую температуру с максимальной и минимальной за период времени, но в переменные Tmin1 он значения не записывает, что сделать как изменить условие? или просто записать в переменные Tmin за ранее еще но начала основного цикла заведомо большое число,? например 100 и при сравнении он в любом случае изменит?
Код: Выделить всё
If Dat1 < Tmin1 Then
Tmin1 = Dat1
End If
If Dat1 > Tmax1 Then
Tmax1 = Dat1
End If
If Dat2 < Tmin2 Then
Tmin2 = Dat2
End If
If Dat2 > Tmax2 Then
Tmax2 = Dat2Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
и еще один затык в программе, правильно ли сконфигурировал таймер чтоб по сравнению с регистром сравнения произходило прерывание по вектору TIM
Код: Выделить всё
Config Timer1 = Timer , Prescale = 256 , Compare A = Set , Clear Timer = 1
On Oc1a Tim ' îáðàáîòêà ïðåðûâàíèÿ
Compare1a = Cons ' çàãðóçêà â ðåãèñòð ñðàâíåèÿ êîíñòàíòû
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
C таймером в принципе все верно, только Compare A = Set уберите. Если конечно у Вас не задумано дрыгать выводом OC1A мироконтроллера.
А вот с переменными я что-то не совсем понял что там не записывается, и в чем проблема...
А вот с переменными я что-то не совсем понял что там не записывается, и в чем проблема...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
при включении и измерении температуры начинаются выполняться эти сравнения, переменным Тмах присваиваются текущее значения температур, а вот переменным Тмин ничего не присваивается пока значение температуры не будет меньше Тмин как то так, хотя вроде как в любом случае должны присваивается значения сразу всем переменным так как они пустые. Пытался положить в Тмин число заведомо большое но компилятор ругается может я не так что то делаю делал? переменная Тмин типа String
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Так а как же Вы в строковую переменную пытаетесь положить число?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
пытался просто положить типа Тмин = 150 потом пытался положив в другую переменную Dm 150 и делая Тмин = str(DM) тоже не вышло, прсто не знаю как правильно
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Код: Выделить всё
'*************** êîíôèãóðèðóåì òàéìåð äëÿ îïðîñà äàò÷èêà ***********************
Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1
On Oc1a Tim ' îáðàáîòêà ïðåðûâàíèÿ
Compare1a = Cons ' çàãðóçêà â ðåãèñòð ñðàâíåèÿ êîíñòàíòû
'**************** êîíôèãóãóðèðóåì INT0 è INT1 äëÿ ïîäêëþ÷åíèÿ êíîïîê *********************
Config Pind.2 = Input 'íàñòîðèì âûâîä íà âõîä
Set Portd.2
Config Pind.3 = Input 'íàñòðîèì âûâîä íà âõîä
Set Portd.3
Config Int0 = Falling ' ñðàáàòûâàíèå ïî ñïàäó
Config Int1 = Falling
Config Debounce = 75 ' çàäåðæêà îò äðåáåçãà êîíòàêòîâ êíîïêè
On Int0 Button 'îáðàáîòêà êíîïêè
On Int1 Resbutton 'îáðàáîòêà êíîïêè ñáðîñà
'*************** êîíôèãóðèðóåì ïðåðûâàíèÿ ïî uart *******************
On Urxc Getchar
' ************* ðàçðåøàåì âñå ïðåðûâàíèÿ **************
Enable Interrupts
Enable Int0
Enable Int1
Enable Oc1a
Enable Urxc
Start Timer1Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Перед тем как копировать в буфер обмена, переключите раскладку клавиатуры на русскую.mr4ester писал(а):от чего каракули в комментариях вместо слов когда сюда вставляешь?
Вы бы прицепили весь исходник...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Код: Выделить всё
'*********** цифровой термометр на 2х ds18b20 ******************
$regfile = "m16def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 9600
' ************** зададим переменные и константы ***********************
Dim Znak As String * 1
Dim Dat1 As String * 5
Dim Dat2 As String * 5
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim T As Byte
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Temp As Byte
Dim X As Byte
Dim W As Word
Dim Errord1 As Bit ' переменная флаг ошибки 1 датчика
Dim Errord2 As Bit ' переменная флаг ошибки 2 датчика
Dim Opr As Bit ' переменная флаг для определения с какаим датчиком работали
Dim Prin As Bit 'переменная флаг для определения вывода данных в порт
Dim Breaking As Bit ' переменная флаг сигнализирующая о прерывания
Dim Shethik As Word ' переменнная для отсчета прерываний
Dim Tmax1 As String * 3 ' максимальная температура 1 датчика
Dim Tmin1 As String * 3 ' минимальная температура 1 датчика
Dim Tmax2 As String * 3 ' максимальная температура 2 датчика
Dim Tmin2 As String * 3 ' минимальная температура 2 датчика
Dim Rs232 As String * 5 ' переменная для работы с uart
Const Cons = 35535 ' константа для сравнения с таймером
Const Geth = 2274 ' константа для сравнения с счетчикаом прерываний
' *************** конфигугрируем подключение ЖКИ ****************
Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
Config Lcd = 16 * 2 'дисплей 2 строки по 16 символов
Cursor Off 'выключить курсор
Cls 'очистить дисплей
' ************** конфигурирем пин для подключения датчиков ******************
Config 1wire = Portb.0 ' на порт повесим 2 датчика с подтяжкой резистором на 4,7К
'*************** конфигурируем таймер для опроса датчика ***********************
Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1
On Oc1a Tim ' обработка прерывания
Compare1a = Cons ' загрузка в регистр сравнеия константы
'**************** конфигугурируем INT0 и INT1 для подключения кнопок *********************
Config Pind.2 = Input 'насторим вывод на вход
Set Portd.2
Config Pind.3 = Input 'настроим вывод на вход
Set Portd.3
Config Int0 = Falling ' срабатывание по спаду
Config Int1 = Falling
Config Debounce = 75 ' задержка от дребезга контактов кнопки
On Int0 Button 'обработка кнопки
On Int1 Resbutton 'обработка кнопки сброса
'*************** конфигурируем прерывания по uart *******************
On Urxc Getchar
' ************* разрешаем все прерывания **************
Enable Interrupts
Enable Int0
Enable Int1
Enable Oc1a
Enable Urxc
Start Timer1
' ************* нарисуем знак градуса ***************
Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32
'***************** работаем с ds18b20 *****************
W = 1wirecount() ' ищем колличество устройств на линии
Dsid1(1) = 1wsearchfirst() ' считываем семейный код 1 датчика
If W > 1 Then Dsid2(1) = 1wsearchnext() 'если выполняется условие то считываем семейный код 2 датчика
'************** основной цикл программы ********************
Do
' инициализируем датчики
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wverify Dsid1(1) : Opr = 0 : Gosub Temperature ' проверим на ошубку чтения с 1 датчика и перейдем к подпрограмме
' opr флаг определения в подпрограмме с каким датчиком работаем opr=0 с 1 датчиком opr=1 со вторым
1wverify Dsid2(1) : Opr = 1 : Gosub Temperature ' проверим на ошубку чтения со 2 датчика и перейдем к подпрограмме
Gosub Disp
Loop
Disp:
Cls 'очистим дисплей
If Errord1 = 1 Then ' если стоит флаг ошибки
Errord1 = 0 ' сбросим флаг
Lcd "гaїАёє Ѕe ѕoгє»." ' выводим надпись датчик не подключен
Goto Datt2 'переходим к работе с 2 датчиком
Else
Lcd "їeјѕepaї " ; Dat1 ; Chr(0) ; "C" ' выводим на дисплей слово температура, знак и значение темп, знак и символ градуса
End If
Datt2:
If Errord2 = 1 Then ' если стоит флаг ошибки
Errord2 = 0 ' сбросим флаг
Locate 2 , 1
Lcd "гaїАёє Ѕe ѕoгє»." ' выводим надпись датчик не подключен
Else
Locate 2 , 1
Lcd "їeјѕepaї " ; Dat2 ; Chr(0) ; "C" ' выводим на дисплей слово температура, знак и значение темп, знак и символ градуса
End If
' сравниваем текущую температуру с максимальной и минимальной если изменилось то переписываем
If Dat1 < Tmin1 Then
Tmin1 = Dat1
End If
If Dat1 > Tmax1 Then
Tmax1 = Dat1
End If
If Dat2 < Tmin2 Then
Tmin2 = Dat2
End If
If Dat2 > Tmax2 Then
Tmax2 = Dat2
End If
'проверим установлен ли флаг Prin, если установлен значит прошло прим. 10мин выдаем в порт текущие максимальные и минимальные температуры
If Prin = 1 Then
Print "текущая температура d1 " ; Dat1 ; Chr(0) ; "C"
Print "минимальная" ; Tmin1 ; Chr(0) ; "C"
Print "максимальная" ; Tmax1 ; Chr(0) ; "C"
Print "текущая температура d2 " ; Dat2 ; Chr(0) ; "C"
Print "минимальная " ; Tmin2 ; Chr(0) ; "C"
Print "максимальная " ; Tmax2 ; Chr(0) ; "C"
End If
Return
Temperature:
If Err = 1 Then ' если при опросе появился флаг ошибки тогда
Select Case Opr ' в зависимости от того с каким датчиком работаем ставим ему флаг ошибки
Case 0 : Errord1 = 1
Case 1 : Errord2 = 1
End Select
Return ' возвращаемся обратно
Else ' если ошибки небыло тогда работаем с датчиком
1wwrite &HBE
Byte0 = 1wread()
Byte1 = 1wread()
End If
If Byte1 >= 248 Then
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Znak = "-"
Else
Znak = "+"
End If
Temp = Byte0 / 16
T = Byte1 * 16
Temp = Temp + T
If Opr = 0 Then
Dat1 = Znak + Str(temp)
Else
Dat2 = Znak + Str(temp)
End If
Return
'***************** обрботчик кнопки по прерыванию INT0 ******************************
' по нажатию этой кнопки на дисплей будут выводиться максимальная и минимальная температура обоих датчиков
Button:
Cls ' очистим дисплей
Lcd "MAX" ; Tmax1 ; Chr(0) ; "C"
Locate 1 , 8
Lcd "MIN" ; Tmin1 ; Chr(0) ; "C"
Lowerline
Lcd "MAX" ; Tmax2 ; Chr(0) ; "C"
Locate 2 , 8
Lcd "MIN" ; Tmin2 ; Chr(0) ; "C"
Wait 5 ' отображаем в течении 5 секунд
Return
'************** обработчик кнопки по прерыванию INT1 ******************************
'по нажатию кнопок будет сбрасываться максимальная и минимальная температура, и присвоена текущая
Resbutton:
Tmin1 = Dat1
Tmax1 = Dat1
Tmin2 = Dat2
Tmax2 = Dat2
Cls
Lcd "·ЅaАeЅёЗ їeјѕ-pГ" 'выводим надпись значения температуры
Locate 2 , 4
Lcd "cІpoБeЅГ!!!" 'сброшены
Wait 3
Return
'****************** обработка прерывания по uart ***************************
Getchar:
Input Rs232
If Rs232 = "T" Then
Print "*****************************************************"
Print "текущая температура дом " ; Dat1 ; Chr(0) ; "C"
Print "минимальная " ; Tmin1 ; Chr(0) ; "C"
Print "максимальная " ; Tmax1 ; Chr(0) ; "C"
Print "текущая температура улица " ; Dat2 ; Chr(0) ; "C"
Print "минимальная " ; Tmin2 ; Chr(0) ; "C"
Print "максимальная " ; Tmax2 ; Chr(0) ; "C"
End If
Return
'****************** обработка перывания от таймера *********************
Tim:
Incr Shethik ' увеличиваем на 1 счетчик прерываний
If Shethik = Geth Then ' сравниваем переменную счетчик с константой
Shethik = 0 ' если равно обнуляем счетчик
Prin = 1 ' ставим флаг что произошло сравнение
Print "123"
End If
ReturnРабота избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Прерывание по совпадению как раз срабатывает примерно каждые 2,2 секунды. В обработчике увеличивается значение переменной Shethik. Которая затем сравнивается с константой 2274. И если они равны то уже печатаем что нужно. Отсюда вопрос, через какое время переменная Shethik будет равна 2274?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
ой действительно затупил, вставил строчку и не обратил внимания что условие заканчивается за этой строчкой, прошу прощения за свою невнимательность 
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)


