BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

спасибо понял сейчас попробую,
kip96 писал(а): Откоментировать?
, вроде все ясно, если найдено больше 1 датчика, тогда считываем код 2 датчика.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

только что проверил, работает спасибо за помощь :beer:
кстати на счет этой строчки

Код: Выделить всё

Dsid1(1) = 1wsearchfirst()                                  'Считываем Семейный Код 1 Датчика
Do
Dsid2(1) = 1wsearchnext()                                   ' считываем семейный код 2 датчика
Loop Until Err = 1
я тоже думал что никогда не выйдет из этого цикла пробовал сделать просто считывая коды датчиков без цикла и тоже ничего не вышло, а теперь работает, еще раз спасибо.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Вот посмотрите какой красивый код! Чисто для LCD. И температура с десятичными,и код маленький. Код короткий, и думаю Вы уже разберётесь без коментариев. Ну ежели чего, спрашивайте.
З.Ы. Код не мой(по части термометра) , тоже содрал, но когда вник.... Всё гениальное просто.
Вложения
вариант с одной линией.rar
Для LCD
(42.07 КБ) 256 скачиваний
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

огромное спасибо :beer:
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1954
Зарегистрирован: Чт янв 20, 2011 16:47:18
Откуда: Старый Оскол

Сообщение Av4arik »

edm2007 спасибо за то что помогли мне не сломать окончательно голову, отложить еще дальше изучение программирования контроллеров, действительно, один датчик того не стоит, чтобы копаться в 25-30 переменных, лучше пойду и займусь своими делами...STK200/300 полежит еще до лучших времен...
З.Ы. зато теперь знаю как написать, например термостат - взять готовую библиотеку для DS, и по условию показаний датчика гонять реле... конечно остальных плюшек мне еще не скоро увидеть.
З.З.Ы. самоучитель вроде бы хорош, но к сожалению он подразумевает то, что учащийся уже выучил и хорошо знает QBASIC.
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Av4arik, а и не нужно ломать голову. Вы просто начните с малого, но самостоятельно. Разберитесь с динамической индикацией, прикрутите один датчик, прикрутите кнопки... Это увлекательнейшее занятие, уверяю Вас. Сами не заметите как свои часы - термометр с кучей плюшек напишете, язык-то на самом деле простой. Главное, не воспринимайте сие занятие как какую-то невыносимую каторгу, все как раз наоборот. :wink:

А будут вопросы по существу - обязательно будет и помощь. Для того форум и нужен. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

У меня вот полгода заняло изучение баскома, и то не все еще понял, но с нуля что то уже могу сделать!
Тоже кстати ответы в прошедшем году были те самые, мол за тебя никто и ниче делать не будет, бегом в обучалку! И правильно! :)
Контактная информация:
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Вот столкнулся с таким делом! У Атмега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
Так мне кажется получится сэкономить еще одно прерывание для ИК приемника.

И второе. Команда - возвращает поцессор в начало кода, или в то место где была прервана программа?
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Можете просто в прерывании по таймеру периодически проверять состояние кнопок. Только с действиями не увлекайтесь, это все же прерывание.
И второе...
Где была прервана.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

имеется такой код

Код: Выделить всё

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
он сравнивает текущую температуру с максимальной и минимальной за период времени, но в переменные Tmin1 он значения не записывает, что сделать как изменить условие? или просто записать в переменные Tmin за ранее еще но начала основного цикла заведомо большое число,? например 100 и при сравнении он в любом случае изменит?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

и еще один затык в программе, правильно ли сконфигурировал таймер чтоб по сравнению с регистром сравнения произходило прерывание по вектору TIM

Код: Выделить всё

Config Timer1 = Timer , Prescale = 256 , Compare A = Set , Clear Timer = 1
On Oc1a Tim                                                 ' îáðàáîòêà ïðåðûâàíèÿ
Compare1a = Cons                                            ' çàãðóçêà â ðåãèñòð ñðàâíåèÿ êîíñòàíòû
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

C таймером в принципе все верно, только Compare A = Set уберите. Если конечно у Вас не задумано дрыгать выводом OC1A мироконтроллера.

А вот с переменными я что-то не совсем понял что там не записывается, и в чем проблема... :dont_know:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

при включении и измерении температуры начинаются выполняться эти сравнения, переменным Тмах присваиваются текущее значения температур, а вот переменным Тмин ничего не присваивается пока значение температуры не будет меньше Тмин как то так, хотя вроде как в любом случае должны присваивается значения сразу всем переменным так как они пустые. Пытался положить в Тмин число заведомо большое но компилятор ругается может я не так что то делаю делал? переменная Тмин типа String
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Так а как же Вы в строковую переменную пытаетесь положить число?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

пытался просто положить типа Тмин = 150 потом пытался положив в другую переменную Dm 150 и делая Тмин = str(DM) тоже не вышло, прсто не знаю как правильно
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

Код: Выделить всё

'*************** êîíôèãóðèðóåì òàéìåð äëÿ îïðîñà äàò÷èêà ***********************

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
Вообщем прошу помощи, не получается запустить таймер, ну или прерывание по сравнению, для проверки того что не происходит прерывание в обработке прерывания дал отпечатывать слово и по терминалу ничего не приходит, пс от чего каракули в комментариях вместо слов когда сюда вставляешь?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

mr4ester писал(а):от чего каракули в комментариях вместо слов когда сюда вставляешь?
Перед тем как копировать в буфер обмена, переключите раскладку клавиатуры на русскую.

Вы бы прицепили весь исходник...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение 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
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Прерывание по совпадению как раз срабатывает примерно каждые 2,2 секунды. В обработчике увеличивается значение переменной Shethik. Которая затем сравнивается с константой 2274. И если они равны то уже печатаем что нужно. Отсюда вопрос, через какое время переменная Shethik будет равна 2274?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

ой действительно затупил, вставил строчку и не обратил внимания что условие заканчивается за этой строчкой, прошу прощения за свою невнимательность :oops:
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Ответить

Вернуться в «AVR»