К примеру имеем 6 переменных типа bit:
A2
A3
A4
A5
A6
A7
А также одну переменную типа байт ByteA27 но как в неё поместить переменные A2-A7 ? (при этом не затронуть биты A0-A1)
спасибо, попробую.... да вот совсем забыл мне их потом нужно опять как то извлечь из байта и разложить в биты, а это как?vanyap1 писал(а):Сложить.
А27 = А1+А2
например так :Tom91 писал(а):Как записать биты в байт? Есть ли какая команда?
Код: Выделить всё
Config port.d0 = input
Config_1wire = port.d0 Код: Выделить всё
Config_1wire = port.d0 вся фишка в том, что индикация динамическая, как для самих ламп так и неонок. к примеру, если температура на датчике меньше нуля по цельсию, то загораются все неонки только при показе температуры (их три штуки), в остальном все работает в штатном режиме. Как я понял, этот язык программирования очень близок к обычному старому доброму бейсику? а чем BASCOM компилировать? чем проверять на ошибки? и где можно синтаксисы команд почитать? знаю, что можно найти в гугле, но инет это огромная помойка, описание может быть хорошим, а может быть и плохим - как различить пока не разбираешься, неизвестно. заранее благодарен.mr4ester писал(а):как мне кажется никто не будет заниматься этим кроме вас, так как на это нужно время, так что советую вникать в исходник, а на форуме вас направят в нужное русло. А по поводу минусовой температуры тут вообще затык, мне например не приходит в голову как на этих индикаторах отобразить минус
Вы куда-то торопитесь?Av4arik писал(а):даже еще почитать про это толком не успел
Учебник Bascom AVRAv4arik писал(а):а чем BASCOM компилировать? чем проверять на ошибки? и где можно синтаксисы команд почитать?
посмотрите исходник который я приложил выше.... думаю, вы поймете, почему я ломаю голову. курить буду данный самоучитель от товарища WildCat долго, ибо на данный момент интересует только этот проект (выше описал), а там полно переменных + динамическая индикация. так же задействован EEPROM, что для меня еще больше осложняет задачу.edm2007 писал(а):А вообще у Bascom AVR великолепная справка в самой среде. Где каждая команда описана подробно. Да еще и с примерами.
Да смотрел конечно, и в тупик он меня не ставит. Ибо исходник прокомментирован замечательно.Av4arik писал(а):посмотрите исходник который я приложил выше....
Будете конечно, и не только его а еще тонны информации.Av4arik писал(а):курить буду данный самоучитель от товарища WildCat долго
Угу, а еще там темно и страшно.Av4arik писал(а): а там полно переменных + динамическая индикация. так же задействован EEPROM
для тех кто знает это не проблема.edm2007 писал(а):смотрел конечно, и в тупик он меня не ставит. Ибо исходник прокомментирован замечательно.
для одного проекта это уже слишком... звучит как "чтобы сделать измерение температуры, выучите азы программирования конкретной платформы, почитайте кучу аппноутов и даташитов, переберите исходник, переделайте под себя и готово".edm2007 писал(а):Будете конечно, и не только его а еще тонны информации.
лучше бы подсказали, как их туды "внедрить", и куда данные датчика инклудить чтобы появилась температура а не другие цифры. я только понял, как настроить порт на 1-wire, и как читать ОЗУ датчика. для меня далеко не совсем разжеваны параметры и синтаксис каждой команды.edm2007 писал(а):Вам вот чем ссылка выше не угодила? Где есть и как шину настроить и как измерение запустить и как результат забрать. Не образец конечно (для LCD можно гораздо проще сделать), но для начала-то пойдет.
для начала прекрасно подходит мигание светодиодов, светофоры, hd44780. но ни как не динамическая индикация с применением двух (!) дешифраторов по три индикатора на каждый.edm2007 писал(а): Не образец конечно (для LCD можно гораздо проще сделать), но для начала-то пойдет.
Ну да, мне-то проще. Я таким родился, даже учиться не пришлось.Av4arik писал(а):для тех кто знает это не проблема.
В точку. Все так и есть. Только не "переберите под себя" а "напишите сами". Или Вы что думаете-то, даташиты это так, шутки ради? Для тех, кому заняться нечем? А у кого времени нет те просто "заводят с десяток переменых и инклудят там аккуратно, чтобы только в занятый участок не попасть"? Мне вот интересно, а как в Вашей версии все должно выглядеть? "В 10-строке напишите то-то, в 75 поправьте это, а в 120 исправьте так-то, и все заработает"? Так?Av4arik писал(а):звучит как "чтобы сделать измерение температуры, выучите азы программирования конкретной платформы, почитайте кучу аппноутов и даташитов
Вот и славно ! Вам есть с чего начать. А для того чтобы "поправить" чужой исходник, нужно разбираться в нем не хуже автора. Вы уверены что сможете "вписать" туда свой код, не нарушив структуру программы? Оценивайте свои силы реально...Av4arik писал(а):для начала прекрасно подходит мигание светодиодов
как раз именно в этом и не уверен. Это еще одна причина обращения...edm2007 писал(а): Вы уверены что сможете "вписать" туда свой код, не нарушив структуру программы? .
Код: Выделить всё
'*********** цифровой термометр на 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 , Compare A = Set , Clear Timer = 1
On Oc1a Tim ' обработка прерывания
Compare1a = Cons ' загрузка в регистр сравнеия константы
'**************** конфигугурируем INT0 и INT1 для подключения кнопок *********************
Config Pind.2 = Input 'насторим вывод на вход
Config Pind.3 = Input 'настроим вывод на вход
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 Датчика
Do
Dsid2(1) = 1wsearchnext() ' считываем семейный код 2 датчика
Loop Until Err = 1
'************** основной цикл программы ********************
Do
If Breaking = 1 Then ' если флаг стоит значит было прерывание
Breaking = 0
End If ' сбросим флаг
Gosub Disp ' преходим к метке
Loop
'*****************************************
Disp:
' инициализируем датчики
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 датчика и перейдем к подпрограмме
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 "текущая температура дом" ; Dat1 ; Chr(0) ; "C"
Print "минимальная" ; Tmin1
Print "максимальная" ; Tmax1
Print "текущая температура улица" ; Dat2 ; Chr(0) ; "C"
Print "минимальная" ; Tmin2
Print "максимальная" ; Tmax2
End If
Return
Temperature:
Disable Interrupts
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
Enable Interrupts
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
Return
'****************** обработка прерывания по uart ***************************
Getchar:
Input Rs232
If Rs232 = "temp" Then
Print "текущая температура дом" ; Dat1 ; Chr(0) ; "C"
Print "минимальная" ; Tmin1
Print "максимальная" ; Tmax1
Print "текущая температура улица" ; Dat2 ; Chr(0) ; "C"
Print "минимальная" ; Tmin2
Print "максимальная" ; Tmax2
End If
Return
'****************** обработка перывания от таймера *********************
Tim:
Incr Shethik ' увеличиваем на 1 счетчик прерываний
If Shethik = Geth Then ' сравниваем переменную счетчик с константой
Shethik = 0 ' если равно обнуляем счетчик
Prin = 1 ' ставим флак что произошло сравнение
End If
ReturnКод: Выделить всё
W = 1wirecount()Код: Выделить всё
W = 1wirecount()
'It is IMPORTANT that the 1wirecount function returns a word/integer
'So the result variable must be of the type word or integer
'But you may assign it to a byte or long too of course
Print W
'as a bonus the next routine :
' first fill the array with an existing number
Reg_no(1) = 1wsearchfirst()
' unremark next line to chance a byte to test the ERR flag
'Reg_no(1) = 2
'now verify if the number exists
1wverify Reg_no(1)
Print Err
'err =1 when the ID passed n reg_no() does NOT exist
' optinal call it with pinnumber line 1wverify reg_no(1),pinb,1
'As for the other 1wire statements/functions, you can provide the port and pin number as anoption
'W = 1wirecount(pinb , 1) 'for example look at pin PINB.1
End
или Это говорится в заявлении число 1wire устройств, подключенных к шине (переводчик)This statement reads the number of 1wire devices attached to the bus
Код: Выделить всё
Dsid1(1) = 1wsearchfirst() 'Считываем Семейный Код 1 Датчика
Do
Dsid2(1) = 1wsearchnext() ' считываем семейный код 2 датчика
Loop Until Err = 1Код: Выделить всё
W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
If W > 1 Then Dsid2(1) = 1wsearchnext()