BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
Добрый вечер,всем! Подскажите пожалуйста как разделить число точками,есть показания частоты 7100000 а нужно так 7.100.000 я уже всё перепробовал не получилось. Если кто делал киньте кусок примера.
СПАСИБО!
СПАСИБО!
- Реклама
- Moto_v3x
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Ср мар 31, 2010 11:45:58
- Откуда: Славянск
Re: BASCOM AVR в вопросах и ответах
или так
или так
все зависит от шрифта и типа дисплея
Код: Выделить всё
Disp = Fusing(frequency , "#.######")
Text$ = Left(disp , 2) + Mid(disp , 3 , 3) + "."
Text$ = Text$ + Right(disp , 3)
print Text$или так
Код: Выделить всё
Disp = Str(frequency)
Setfont My12_16
Text$(1) = Left(disp , 2)
Text$(2) = Mid(disp , 3 , 3)
Text$(3) = Right(disp , 3)
Lcdat 4 , 15 , Text$(1) , 0
Lcdat 4 , 47 , Text$(2) , 0
Lcdat 4 , 83 , "." , 0
Lcdat 4 , 91 , Text$(3) , 0все зависит от шрифта и типа дисплея
Re: BASCOM AVR в вопросах и ответах
Для 1602 и нокиа3310.
- Moto_v3x
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Ср мар 31, 2010 11:45:58
- Откуда: Славянск
Re: BASCOM AVR в вопросах и ответах
по идее должно подойти, особенно для 3310, а так это для GLCD128x64 на KS0108 делалось
Re: BASCOM AVR в вопросах и ответах
Спасибо! Я попробую, может у кого и на 1602 найдётся.
- Реклама
Re: BASCOM AVR в вопросах и ответах
Доброй ночи всем неспящим котам 
Набросал примитивную схему, состряпал прошивку. Погонял на макетке - работает замечательно!
Есть одно НО...
На портуХХ висит кнопка с замыканием на землю и, естественно, порт работает как вход.
Для индикации режима хочу туда же повесить ЛЕД, концом на минус. Портов свободных не осталось
А потому обращаюсь к знатокам.
Как можно динамично менять (сконфигурировать) порт из ввода на вывод и обратно?
Такое вообще возможно или это из области фантастики?
Никто не подкинет примерчик?
(Может как-то по таймеру, счетчику)
___
(P.S. Переходить на тиньку2313 - нет АЦП; мега8 - слишком жирно; в наличии тини13/45/85 - самое то. Не хочу лочить Ресет)
Набросал примитивную схему, состряпал прошивку. Погонял на макетке - работает замечательно!
Есть одно НО...
На портуХХ висит кнопка с замыканием на землю и, естественно, порт работает как вход.
Для индикации режима хочу туда же повесить ЛЕД, концом на минус. Портов свободных не осталось
А потому обращаюсь к знатокам.
Как можно динамично менять (сконфигурировать) порт из ввода на вывод и обратно?
Такое вообще возможно или это из области фантастики?
Никто не подкинет примерчик?
(Может как-то по таймеру, счетчику)
___
(P.S. Переходить на тиньку2313 - нет АЦП; мега8 - слишком жирно; в наличии тини13/45/85 - самое то. Не хочу лочить Ресет)
-
aleksandr-zh
- Сверлит текстолит когтями
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Re: BASCOM AVR в вопросах и ответах
selco писал(а):Для 1602 и нокиа3310.
Я делаю так:
преобразовываю свою переменную в строковую, а потом форматирую по "маске"
Код: Выделить всё
.
.
Dim A As Word , Astr As String * 5
.
.
.
Astr = Str(a)
Astr = Format(astr , "00.000")
.
.
Lcd AstrRe: BASCOM AVR в вопросах и ответах
Мяууу всем котам
Делаю моргалку с 5 эффектами мигания на тини13.
Выбранный эффект сохраняется в еепром (это мой первый проектик на еепром и я просто счастлив)
.
Хочу добавить сервисный ЛЕД, мигание которого будет зависеть от номера выбранного эффекта.
А вот, собственно, вопрос:
Как можно инкрементировать кол-во миганий Serviceled с каждым нажатием кнопки?
Код мигания примитивный, но как его привязать к кол-ву нажатий ума не приложу
Писать это в ручную 2-3-4-5 раз наверно нерационально, неправильно и память МК не хватит.
Делаю моргалку с 5 эффектами мигания на тини13.
Выбранный эффект сохраняется в еепром (это мой первый проектик на еепром и я просто счастлив)
Хочу добавить сервисный ЛЕД, мигание которого будет зависеть от номера выбранного эффекта.
- - нажал 1 раз - Serviceled мигнул 1 раз и потух, запустился эффект №1
- - нажал 2 раза - Serviceled мигнул 2 раза и потух, запустился эффект №2
- - ...
- - ...
- - нажал 5 раз - Serviceled мигнул 5 раз и потух, запустился эффект №5
А вот, собственно, вопрос:
Как можно инкрементировать кол-во миганий Serviceled с каждым нажатием кнопки?
Код: Выделить всё
...
Serviceled = 1 : waitms 200 : Serviceled = 0
...
Код мигания примитивный, но как его привязать к кол-ву нажатий ума не приложу
Писать это в ручную 2-3-4-5 раз наверно нерационально, неправильно и память МК не хватит.
- htscooter
- Вымогатель припоя
- Сообщения: 566
- Зарегистрирован: Вт ноя 18, 2008 20:33:17
- Откуда: г.Луганск
Re: BASCOM AVR в вопросах и ответах
Подсчитать количество нажатий, сохранить в переменную. Эту переменную передать в цикл For To Next, количество проходов в котором и будет зависеть от этой переменной.
Хорошо и надежно работающая система безусловно красива
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
KOTик писал(а):Код мигания примитивный, но как его привязать к кол-ву нажатий ума не приложу
Несколько страниц назад это уже разбирали, в частности на 176.
Код: Выделить всё
'----------
' процедуры
'----------
Мигаем:
For Период = 1 To 6 ' запускаем цикл здесь 010101 т.е три раза моргаем
Toggle Светодиод : Waitms 500 ' инвертируем порт в.1 каждые 0,5 сек 'Повторяемый блок
Next Период ' в начало цикла
Return ' возврат в главный циклRe: BASCOM AVR в вопросах и ответах
приветствую. как настроить компилятор в баском 1.11.9.8 ? беру рабочий откомпилированный проект и компилирую по новой- ругается. до этого думал что у меня ошибки, но и без моих вмешательств компиляция идет с ошибками.
-
aleksandr-zh
- Сверлит текстолит когтями
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Re: BASCOM AVR в вопросах и ответах
в новых версиях компилятора немного обновлён синтаксис команд, LCD, иначе обрабатывается "_" и прочее...
поищите версию поновее
поищите версию поновее
Re: BASCOM AVR в вопросах и ответах
при компиляции выдает это. ругается на первые две строки
- Вложения
-
- ошибки.PNG
- (26.42 КБ) 441 скачивание
-
aleksandr-zh
- Сверлит текстолит когтями
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Re: BASCOM AVR в вопросах и ответах
возможно, подпрограмма не определена оператором Declare Sub
-
domrustika
- Грызет канифоль
- Сообщения: 257
- Зарегистрирован: Чт мар 22, 2007 13:50:33
- Откуда: казань
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
здрасте. работает все, кроме показания давления. часы ds1307 и датчик давления bmp085 оба повесил на scl и sda соответственно. камень- мега 16. весь код не смотрите
не работает только effect3 - это как раз вывод давления
нашел проблему. датчик не правильно показывает давление при подключенных часах ds1307. видимо потому что оба лежат на sda и scl . как их как то разграничить что ли ?
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 52
' настройка подключения пинов дисплея 3310 clock-clk, dout-sdin
Config Portc.2 = Output
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Config Spi = Soft , Din = None , Dout = Portc.5 , Ss = None , Clock = Portc.4
Spiinit
$include "3310init.bas"
'периферия
Config Sda = Portc.1 ' I2C Data
Config Scl = Portc.0 ' I2C Clock
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
' переменные ds1307
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Dat As Byte
Dim Day As Byte
Dim Month As Byte
Dim Year As Byte
'переменные для преобразования часов из цифр в строки
Dim Hh As String * 2
Dim Minut As String * 2
Dim Second As String * 2
Dim Datt As String * 2
Dim Monthe As String * 10
Dim Yeare As String * 3
Dim Day2 As String * 10
' переменные для dht11
Dim T3 As Byte '??????????? ??? ???????? ???????????
Dim H2 As Byte '?????????? ??? ???????? ?????????
Dim Crc As Byte '?????????? ??? ???????? ????? ????????
Dim Mybyte As Byte
Dim Sensor_data As String * 40 '???? ????? ???????????? ?????? ?????????? ????????
Dim Tmp_str8 As String * 8
Dim Count As Byte '?????????? ??? ???????? ???????? ???
' переменные для преобразования температуры и влажности
Dim Vl As String * 5
Dim Ss2 As String * 5
' переменная для смены страниц
Dim Stramica As Integer
' процедура старта часов
Declare Sub Inittimer
' процедура измерения температуры и влажности dht11
Declare Sub Get_th(t3 As Byte , H2 As Byte)
'подключение датчика dht 11 к PortD.3
Dht_put Alias Portd.3
Dht_get Alias Pind.3
Dht_io_set Alias Ddrd.3
' ниже все для датчика давления bmp085
Declare Sub Messen
Dim Ac1 As Integer
Dim Ac1a As Long
Dim Ac2 As Integer
Dim Ac3 As Integer
Dim Ac4 As Word
Dim Ac5 As Word
Dim Ac5a As Single
Dim Ac6 As Word
Dim B1 As Integer
Dim B2 As Integer
Dim B3 As Long
Dim B3a As Long
Dim B4 As Long
Dim B5 As Long
Dim B6 As Integer
Dim B6a As Long
Dim B7 As Long
Dim Mb As Integer
Dim Mc As Integer
Dim Mc2 As Long
Dim Md As Integer
Dim Adres As Byte
Dim Wert As Byte
Dim Ut As Long
Dim X1 As Long
Dim X1t As Single
Dim X2 As Long
Dim X3 As Long
Dim T As Single
Dim T2 As Long
Dim Temperatur As String * 6
Dim Luftdruck As String * 8
Dim Druck As Single
Dim P As Long
Dim P2 As Long
Dim 2potenz15 As Long
Dim 2potenz11 As Integer
Dim 2potenz13 As Integer
Dim 2potenz8 As Integer
Dim 2potenz4 As Integer
Dim 2potenz2 As Integer
Dim 2potenz16 As Long
Dim 2potenz12 As Integer
Dim Potenz5255 As Single
Dim Altitude As Single
Dim Altitudes As String * 8
Dim Msb As Long
Dim Lsb As Long
Dim Up As Long
Dim Druckvar As Byte
Declare Sub Berechne_temp
Declare Sub Berechne_druck
Declare Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
Declare Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
Declare Sub Lese_roh_daten
Declare Sub Lese_kalib_data
Const Addr_schreiben = &B11101110 'адрес микросхемы + запись
Const Addr_lesen = &B11101111 'адрес микросхемы + чтение
Enable Interrupts
Set Dht_io_set
Set Dht_put
Call D3310init
Stramica = 0
'Gosub Inittimer 'Запустить 1 Раз
Do
Incr Stramica
If Stramica > 0 And Stramica < 10 Then
If Stramica = 1 Then
Call D3310clear
End If
Gosub Effect1
End If
If Stramica > 9 And Stramica < 19 Then
If Stramica = 10 Then
Call D3310clear
End If
Gosub Effect3
End If
If Stramica > 18 And Stramica < 38 Then
If Stramica = 19 Then
Call D3310clear
End If
Gosub Effect2
End If
If Stramica > 37 Then
Stramica = 0
End If
Waitms 920
Loop
End
$include "3310end.bas"
$include "Dom.bas"
Effect1:
Restore Dom
Call D3310bmpout
' выводим температуру
Call D3310position(11 , 5)
Call Get_th(t3 , H2) ' вызов функции измерения температуры и влажности
Vl = Str(t3) ' Возвращает строку с десятичным значением числа (влажность)
Call D3310print(vl) ' выводим значение влажности
' выводим влажность
Call D3310position(11 , 4)
'Call Get_th(t3 , H2) ' вызов функции измерения температуры и влажности
Vl = Str(h2) ' Возвращает строку с десятичным значением числа (влажность)
Call D3310print(vl) ' выводим значение влажности
Return
Effect2:
'Теперь выведем время
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Ack
I2crbyte Day , Ack ' число месяца
I2crbyte Dat , Ack ' день недели
I2crbyte Month , Ack ' месяц
I2crbyte Year , Nack ' год
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
' Day = Makedec(day)
Dat = Makedec(dat)
Month = Makedec(month)
Year = Makedec(year)
Call D3310position(4 , 0)
Call D3310print( "Время:")
Call D3310position(0 , 1)
Hh = Str(hour)
If Hour < 10 Then
Call D3310print( "0")
Call D3310print(hh)
Else
Call D3310print(hh)
End If
Call D3310position(2 , 1)
Call D3310print( ":")
Call D3310position(3 , 1)
Minut = Str(mine)
If Mine < 10 Then
Call D3310print( "0")
Call D3310print(minut)
Else
Call D3310print(minut)
End If
'(
Call D3310position(5 , 1)
Call D3310print( ":")
Call D3310position(6 , 1)
Second = Str(seco)
If Seco < 10 Then
Call D3310print( "0")
Call D3310print(second)
Else
Call D3310print(second)
End If
')
Call D3310position(4 , 2)
Call D3310print( "Дата:")
Call D3310position(0 , 3)
Datt = Str(dat)
If Dat < 10 Then
Call D3310print( "0")
Call D3310print(datt)
Else
Call D3310print(datt)
End If
Call D3310position(3 , 3)
Select Case Month
Case 1 : Call D3310print( "Января")
Case 2 : Call D3310print( "Февраля")
Case 3 : Call D3310print( "Марта" )
Case 4 : Call D3310print( "Апреля")
Case 5 : Call D3310print( "Мая")
Case 6 : Call D3310print( "Июня")
Case 7 : Call D3310print( "Июля")
Case 8 : Call D3310print( "августа")
Case 9 : Call D3310print( "Сентября" )
Case 10 : Call D3310print( "Октября " )
Case 11 : Call D3310print( "Ноября")
Case 12 : Call D3310print( "Декабря")
Case Else : Month = 1
End Select
Call D3310position(10 , 3)
Call D3310print( "20")
Call D3310position(12 , 3)
Yeare = Str(year)
Call D3310print(yeare)
Call D3310position(3 , 5)
Select Case Day
Case 1 : Call D3310print( "Понедельник")
Case 2 : Call D3310print( "Вторник")
Case 3 : Call D3310print( "Среда" )
Case 4 : Call D3310print( "Четверг")
Case 5 : Call D3310print( "Пятница")
Case 6 : Call D3310print( "Суббота")
Case 7 : Call D3310print( "Воскресенье")
Case Else : Day = 1
End Select
Return
Effect3:
Waitms 1500
Call Messen
'T = T / 10
'Temperatur = Fusing(t , "###.##")
'Potenz5255 = 1 / 5.255
'Altitude = P / 101325
'Altitude = Altitude ^ Potenz5255
'Altitude = 1 - Altitude
'Altitude = Altitude * 44330
Druck = P
Druck = Druck * 0.0075
Luftdruck = Fusing(druck , "####.##")
'Altitudes = Fusing(altitude , "#####.##")
Call D3310position(0 , 3)
Call D3310print( "Па:")
Call D3310print(luftdruck)
Call D3310print( " мм")
Return
'Запустим часы
Sub Inittimer
Seco = 00
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Hour
I2cstop
Mine = 00
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Hour = 00
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Dat = 14
Dat = Makebcd(dat)
I2cstart
I2cwbyte &HD0
I2cwbyte 4 ' адрес хранения даты
I2cwbyte Dat
I2cstop
Month = 08
Dat = Makebcd(month)
I2cstart
I2cwbyte &HD0
I2cwbyte 5 ' адрес хранения месяца
I2cwbyte Month
I2cstop
Year = 13
Year = Makebcd(year)
I2cstart
I2cwbyte &HD0
I2cwbyte 6 ' адрес хранения года
I2cwbyte Year
I2cstop
End Sub
Sub Get_th(t3 As Byte , H2 As Byte)
Count = 0
Sensor_data = ""
Set Dht_io_set '?????? PD.6 ???????
Reset Dht_put '????????? ???? ? ?????
Waitms 25 '???? ?? ????? 18??
Set Dht_put '????????? ????
Waitus 40
Reset Dht_io_set '?????? PD.6 ??????
Waitus 40 '???? 40 ???
If Dht_get = 1 Then '???? ?? ??? ?? ???????? 1
H2 = 1 '?????? ?????? ?? ???????
Exit Sub '??????? ?? ????????????
End If
'???? ?????? ??????? ? ?????? ???? ? ????? ?????????? ??????
Waitus 80 '???? ??? 80 ???
If Dht_get = 0 Then '???? ?? ????? ?? ???????? 0
H2 = 2 '?????? ?????? ????? ? ???
Exit Sub '??????? ?? ????????????
End If
'???? ??? ????????? ? ?????? ??????? ?????????, ????? ??????????
While Dht_get = 1 : Wend '???? ???? ?? ???? ???????? 1
Do '???????? ????????? 40 ??? ??????
While Dht_get = 0 : Wend '???? ????????? ?? ???? 0
Waitus 30 '????? ????????? 0 ???? 30???
If Dht_get = 1 Then '???? ?? ???? 1
Sensor_data = Sensor_data + "1" '?????????? ? ?????????? ??? ???????
While Dht_get = 1 : Wend '? ???? ???? ?????? ???????? ????????? ???
Else '?????, ???? ??? ??? 0
Sensor_data = Sensor_data + "0" '?????????? ???? 0 ? ??????????
End If
Incr Count '??????????? ??????? ?? 1
Loop Until Count = 40 '????????? ???? ??????? ?? ????????? ?? 40
Set Dht_io_set
Set Dht_put
'???????? ???????????? ?????????? ??????
Tmp_str8 = Left(sensor_data ,
'????? ????? 8 ???????? ??????????
H2 = Binval(tmp_str8) '??? ????? ????? ?????????
Tmp_str8 = Mid(sensor_data , 17 ,
'??????????? 8 ???????? ?? ????????
T3 = Binval(tmp_str8) '??? ????? ????? ???????????
Tmp_str8 = Right(sensor_data ,
'?????? 8 ????????
Crc = Binval(tmp_str8) '??????????? ??????
'???????? ??????????? ?????
Mybyte = T3 + H2 '?????????? ???????? ??????????? ? ?????????
If Mybyte <> Crc Then '???? ??????????? ????? ?? ???????
H2 = 3 '?????? ?????????? ?????? ?? ?????
End If
End Sub
' ниже процедуры для датчика давления
Sub Messen
'Измерение температуры
Call Schreibe_bmp085(&Hf4 , &H2E)
Adres = &HF6
Call Lese_roh_daten
'Print "msb " ; Msb
'Print "lsb " ; Lsb
Shift Msb , Left , 8
'Print "msb shift " ; Msb
Ut = Msb + Lsb
Call Berechne_temp
'Измерение давления
Call Schreibe_bmp085(&Hf4 , &H74 )
Adres = &HF6
Call Lese_roh_daten
Shift Msb , Left , 16
Shift Lsb , Left , 8
Up = Msb + Lsb
Shift Up , Right , 6
'Print "msb " ; Msb ; "lsb " ; Lsb ; "up " ; Up
Call Berechne_druck
End Sub
Sub Berechne_temp
'X1
Ut = Ut - Ac6
2potenz15 = 2 ^ 15
Ac5a = Ac5 / 2potenz15
X1t = Ut * Ac5a
'Print "X1 " ; X1t
'X2
2potenz11 = 2 ^ 11
Mc2 = Mc * 2potenz11
X3 = X1t + Md
X2 = Mc2 / X3
'Print "X2 " ; X2
'B5
B5 = X1t + X2
'Print "B5 " ; B5
'T
2potenz4 = 2 ^ 4
T2 = B5 + 8
T = T2 / 2potenz4
End Sub
Sub Berechne_druck
'B6
B6 = B5 - 4000
'X1
2potenz12 = 2 ^ 12
B6a = B6 * B6
B6a = B6a / 2potenz12
X1 = B2 * B6a
X1 = X1 / 2potenz11
'X2
X2 = Ac2 * B6
X2 = X2 / 2potenz11
'X3
X3 = X1 + X2
'B3
Ac1a = Ac1 * 4
Ac1a = Ac1a + X3
Shift Ac1a , Left , 2
Ac1a = Ac1a + 2
B3 = Ac1a / 4
'X1 die zweite
2potenz13 = 2 ^ 13
B6a = B6 / 2potenz13
X1 = Ac3 * B6a
'X2 die zweite
B6a = B6 * B6
B6a = B6a / 2potenz12
X2 = B1 * B6a
2potenz16 = 2 ^ 16
X2 = X2 / 2potenz16
'X3 die zweite
X3 = X1 + X2
X3 = X3 + 2
2potenz2 = 2 ^ 2
X3 = X3 / 2potenz2
'B4
B4 = X3 + 32768
B4 = B4 * Ac4
B4 = B4 / 2potenz15
If B4 <= 0 Then B4 = B4 * -1
'Print B4
'B7
B7 = Up - B3
B3a = 50000
Shift B3a , Right , 2 '
B7 = B7 * B3a
If B7 <= 0 Then B7 = B7 * -1
'Print B7
If B7 < &H80000000 Then
P = B7 * 2
'Print "p1 " ; P
P = P / B4
'Print "p1 " ; P
Else
P = B7 / B4
'Print "p2 " ; P
P = P * 2
'Print "p2 " ; P
End If
'Print P
'nochmal X1
2potenz8 = 2 ^ 8
P2 = P / 2potenz8
X1 = P2 * P2
'Print X1
X1 = X1 * 3038
X1 = X1 / 2potenz16
'Print X1
' nochmal X2
X2 = -7357 * P
X2 = X2 / 2potenz16
'Print X2
P2 = P
P = X2 + 3791
P = P + X1
P = P / 2potenz4
P = P + P2
End Sub
Sub Lese_kalib_data
Adres = &HAA
'Ac1 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac1 = Msb + Lsb
Adres = Adres + 1
'Ac2 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac2 = Msb + Lsb
Adres = Adres + 1
'Ac3 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac3 = Msb + Lsb
Adres = Adres + 1
'Ac4 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac4 = Msb + Lsb
Adres = Adres + 1
'Ac5 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac5 = Msb + Lsb
Adres = Adres + 1
'Ac6 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac6 = Msb + Lsb
Adres = Adres + 1
'B1 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
B1 = Msb + Lsb
Adres = Adres + 1
'B2 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
B2 = Msb + Lsb
Adres = Adres + 1
'MB lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Mb = Msb + Lsb
Adres = Adres + 1
'MB lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Mc = Msb + Lsb
Adres = Adres + 1
'Md lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Md = Msb + Lsb
Adres = Adres + 1
End Sub
Sub Lese_roh_daten
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
End Sub
Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
I2cstart
I2cwbyte Addr_schreiben
I2cwbyte Adres
I2cwbyte Wert
I2cstop
Waitms 10
End Sub
Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
I2cstart
I2cwbyte Addr_schreiben
I2cwbyte Adres
I2cstart
I2cwbyte Addr_lesen
I2crbyte Wert , Nack
I2cstop
Waitms 10
End Sub
нашел проблему. датчик не правильно показывает давление при подключенных часах ds1307. видимо потому что оба лежат на sda и scl . как их как то разграничить что ли ?
Спойлер
$regfile = "m16def.dat"$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 52
' настройка подключения пинов дисплея 3310 clock-clk, dout-sdin
Config Portc.2 = Output
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Config Spi = Soft , Din = None , Dout = Portc.5 , Ss = None , Clock = Portc.4
Spiinit
$include "3310init.bas"
'периферия
Config Sda = Portc.1 ' I2C Data
Config Scl = Portc.0 ' I2C Clock
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
' переменные ds1307
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Dat As Byte
Dim Day As Byte
Dim Month As Byte
Dim Year As Byte
'переменные для преобразования часов из цифр в строки
Dim Hh As String * 2
Dim Minut As String * 2
Dim Second As String * 2
Dim Datt As String * 2
Dim Monthe As String * 10
Dim Yeare As String * 3
Dim Day2 As String * 10
' переменные для dht11
Dim T3 As Byte '??????????? ??? ???????? ???????????
Dim H2 As Byte '?????????? ??? ???????? ?????????
Dim Crc As Byte '?????????? ??? ???????? ????? ????????
Dim Mybyte As Byte
Dim Sensor_data As String * 40 '???? ????? ???????????? ?????? ?????????? ????????
Dim Tmp_str8 As String * 8
Dim Count As Byte '?????????? ??? ???????? ???????? ???
' переменные для преобразования температуры и влажности
Dim Vl As String * 5
Dim Ss2 As String * 5
' переменная для смены страниц
Dim Stramica As Integer
' процедура старта часов
Declare Sub Inittimer
' процедура измерения температуры и влажности dht11
Declare Sub Get_th(t3 As Byte , H2 As Byte)
'подключение датчика dht 11 к PortD.3
Dht_put Alias Portd.3
Dht_get Alias Pind.3
Dht_io_set Alias Ddrd.3
' ниже все для датчика давления bmp085
Declare Sub Messen
Dim Ac1 As Integer
Dim Ac1a As Long
Dim Ac2 As Integer
Dim Ac3 As Integer
Dim Ac4 As Word
Dim Ac5 As Word
Dim Ac5a As Single
Dim Ac6 As Word
Dim B1 As Integer
Dim B2 As Integer
Dim B3 As Long
Dim B3a As Long
Dim B4 As Long
Dim B5 As Long
Dim B6 As Integer
Dim B6a As Long
Dim B7 As Long
Dim Mb As Integer
Dim Mc As Integer
Dim Mc2 As Long
Dim Md As Integer
Dim Adres As Byte
Dim Wert As Byte
Dim Ut As Long
Dim X1 As Long
Dim X1t As Single
Dim X2 As Long
Dim X3 As Long
Dim T As Single
Dim T2 As Long
Dim Temperatur As String * 6
Dim Luftdruck As String * 8
Dim Druck As Single
Dim P As Long
Dim P2 As Long
Dim 2potenz15 As Long
Dim 2potenz11 As Integer
Dim 2potenz13 As Integer
Dim 2potenz8 As Integer
Dim 2potenz4 As Integer
Dim 2potenz2 As Integer
Dim 2potenz16 As Long
Dim 2potenz12 As Integer
Dim Potenz5255 As Single
Dim Altitude As Single
Dim Altitudes As String * 8
Dim Msb As Long
Dim Lsb As Long
Dim Up As Long
Dim Druckvar As Byte
Declare Sub Berechne_temp
Declare Sub Berechne_druck
Declare Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
Declare Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
Declare Sub Lese_roh_daten
Declare Sub Lese_kalib_data
Const Addr_schreiben = &B11101110 'адрес микросхемы + запись
Const Addr_lesen = &B11101111 'адрес микросхемы + чтение
Enable Interrupts
Set Dht_io_set
Set Dht_put
Call D3310init
Stramica = 0
'Gosub Inittimer 'Запустить 1 Раз
Do
Incr Stramica
If Stramica > 0 And Stramica < 10 Then
If Stramica = 1 Then
Call D3310clear
End If
Gosub Effect1
End If
If Stramica > 9 And Stramica < 19 Then
If Stramica = 10 Then
Call D3310clear
End If
Gosub Effect3
End If
If Stramica > 18 And Stramica < 38 Then
If Stramica = 19 Then
Call D3310clear
End If
Gosub Effect2
End If
If Stramica > 37 Then
Stramica = 0
End If
Waitms 920
Loop
End
$include "3310end.bas"
$include "Dom.bas"
Effect1:
Restore Dom
Call D3310bmpout
' выводим температуру
Call D3310position(11 , 5)
Call Get_th(t3 , H2) ' вызов функции измерения температуры и влажности
Vl = Str(t3) ' Возвращает строку с десятичным значением числа (влажность)
Call D3310print(vl) ' выводим значение влажности
' выводим влажность
Call D3310position(11 , 4)
'Call Get_th(t3 , H2) ' вызов функции измерения температуры и влажности
Vl = Str(h2) ' Возвращает строку с десятичным значением числа (влажность)
Call D3310print(vl) ' выводим значение влажности
Return
Effect2:
'Теперь выведем время
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Ack
I2crbyte Day , Ack ' число месяца
I2crbyte Dat , Ack ' день недели
I2crbyte Month , Ack ' месяц
I2crbyte Year , Nack ' год
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
' Day = Makedec(day)
Dat = Makedec(dat)
Month = Makedec(month)
Year = Makedec(year)
Call D3310position(4 , 0)
Call D3310print( "Время:")
Call D3310position(0 , 1)
Hh = Str(hour)
If Hour < 10 Then
Call D3310print( "0")
Call D3310print(hh)
Else
Call D3310print(hh)
End If
Call D3310position(2 , 1)
Call D3310print( ":")
Call D3310position(3 , 1)
Minut = Str(mine)
If Mine < 10 Then
Call D3310print( "0")
Call D3310print(minut)
Else
Call D3310print(minut)
End If
'(
Call D3310position(5 , 1)
Call D3310print( ":")
Call D3310position(6 , 1)
Second = Str(seco)
If Seco < 10 Then
Call D3310print( "0")
Call D3310print(second)
Else
Call D3310print(second)
End If
')
Call D3310position(4 , 2)
Call D3310print( "Дата:")
Call D3310position(0 , 3)
Datt = Str(dat)
If Dat < 10 Then
Call D3310print( "0")
Call D3310print(datt)
Else
Call D3310print(datt)
End If
Call D3310position(3 , 3)
Select Case Month
Case 1 : Call D3310print( "Января")
Case 2 : Call D3310print( "Февраля")
Case 3 : Call D3310print( "Марта" )
Case 4 : Call D3310print( "Апреля")
Case 5 : Call D3310print( "Мая")
Case 6 : Call D3310print( "Июня")
Case 7 : Call D3310print( "Июля")
Case 8 : Call D3310print( "августа")
Case 9 : Call D3310print( "Сентября" )
Case 10 : Call D3310print( "Октября " )
Case 11 : Call D3310print( "Ноября")
Case 12 : Call D3310print( "Декабря")
Case Else : Month = 1
End Select
Call D3310position(10 , 3)
Call D3310print( "20")
Call D3310position(12 , 3)
Yeare = Str(year)
Call D3310print(yeare)
Call D3310position(3 , 5)
Select Case Day
Case 1 : Call D3310print( "Понедельник")
Case 2 : Call D3310print( "Вторник")
Case 3 : Call D3310print( "Среда" )
Case 4 : Call D3310print( "Четверг")
Case 5 : Call D3310print( "Пятница")
Case 6 : Call D3310print( "Суббота")
Case 7 : Call D3310print( "Воскресенье")
Case Else : Day = 1
End Select
Return
Effect3:
Waitms 1500
Call Messen
'T = T / 10
'Temperatur = Fusing(t , "###.##")
'Potenz5255 = 1 / 5.255
'Altitude = P / 101325
'Altitude = Altitude ^ Potenz5255
'Altitude = 1 - Altitude
'Altitude = Altitude * 44330
Druck = P
Druck = Druck * 0.0075
Luftdruck = Fusing(druck , "####.##")
'Altitudes = Fusing(altitude , "#####.##")
Call D3310position(0 , 3)
Call D3310print( "Па:")
Call D3310print(luftdruck)
Call D3310print( " мм")
Return
'Запустим часы
Sub Inittimer
Seco = 00
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Hour
I2cstop
Mine = 00
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Hour = 00
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Dat = 14
Dat = Makebcd(dat)
I2cstart
I2cwbyte &HD0
I2cwbyte 4 ' адрес хранения даты
I2cwbyte Dat
I2cstop
Month = 08
Dat = Makebcd(month)
I2cstart
I2cwbyte &HD0
I2cwbyte 5 ' адрес хранения месяца
I2cwbyte Month
I2cstop
Year = 13
Year = Makebcd(year)
I2cstart
I2cwbyte &HD0
I2cwbyte 6 ' адрес хранения года
I2cwbyte Year
I2cstop
End Sub
Sub Get_th(t3 As Byte , H2 As Byte)
Count = 0
Sensor_data = ""
Set Dht_io_set '?????? PD.6 ???????
Reset Dht_put '????????? ???? ? ?????
Waitms 25 '???? ?? ????? 18??
Set Dht_put '????????? ????
Waitus 40
Reset Dht_io_set '?????? PD.6 ??????
Waitus 40 '???? 40 ???
If Dht_get = 1 Then '???? ?? ??? ?? ???????? 1
H2 = 1 '?????? ?????? ?? ???????
Exit Sub '??????? ?? ????????????
End If
'???? ?????? ??????? ? ?????? ???? ? ????? ?????????? ??????
Waitus 80 '???? ??? 80 ???
If Dht_get = 0 Then '???? ?? ????? ?? ???????? 0
H2 = 2 '?????? ?????? ????? ? ???
Exit Sub '??????? ?? ????????????
End If
'???? ??? ????????? ? ?????? ??????? ?????????, ????? ??????????
While Dht_get = 1 : Wend '???? ???? ?? ???? ???????? 1
Do '???????? ????????? 40 ??? ??????
While Dht_get = 0 : Wend '???? ????????? ?? ???? 0
Waitus 30 '????? ????????? 0 ???? 30???
If Dht_get = 1 Then '???? ?? ???? 1
Sensor_data = Sensor_data + "1" '?????????? ? ?????????? ??? ???????
While Dht_get = 1 : Wend '? ???? ???? ?????? ???????? ????????? ???
Else '?????, ???? ??? ??? 0
Sensor_data = Sensor_data + "0" '?????????? ???? 0 ? ??????????
End If
Incr Count '??????????? ??????? ?? 1
Loop Until Count = 40 '????????? ???? ??????? ?? ????????? ?? 40
Set Dht_io_set
Set Dht_put
'???????? ???????????? ?????????? ??????
Tmp_str8 = Left(sensor_data ,
H2 = Binval(tmp_str8) '??? ????? ????? ?????????
Tmp_str8 = Mid(sensor_data , 17 ,
T3 = Binval(tmp_str8) '??? ????? ????? ???????????
Tmp_str8 = Right(sensor_data ,
Crc = Binval(tmp_str8) '??????????? ??????
'???????? ??????????? ?????
Mybyte = T3 + H2 '?????????? ???????? ??????????? ? ?????????
If Mybyte <> Crc Then '???? ??????????? ????? ?? ???????
H2 = 3 '?????? ?????????? ?????? ?? ?????
End If
End Sub
' ниже процедуры для датчика давления
Sub Messen
'Измерение температуры
Call Schreibe_bmp085(&Hf4 , &H2E)
Adres = &HF6
Call Lese_roh_daten
'Print "msb " ; Msb
'Print "lsb " ; Lsb
Shift Msb , Left , 8
'Print "msb shift " ; Msb
Ut = Msb + Lsb
Call Berechne_temp
'Измерение давления
Call Schreibe_bmp085(&Hf4 , &H74 )
Adres = &HF6
Call Lese_roh_daten
Shift Msb , Left , 16
Shift Lsb , Left , 8
Up = Msb + Lsb
Shift Up , Right , 6
'Print "msb " ; Msb ; "lsb " ; Lsb ; "up " ; Up
Call Berechne_druck
End Sub
Sub Berechne_temp
'X1
Ut = Ut - Ac6
2potenz15 = 2 ^ 15
Ac5a = Ac5 / 2potenz15
X1t = Ut * Ac5a
'Print "X1 " ; X1t
'X2
2potenz11 = 2 ^ 11
Mc2 = Mc * 2potenz11
X3 = X1t + Md
X2 = Mc2 / X3
'Print "X2 " ; X2
'B5
B5 = X1t + X2
'Print "B5 " ; B5
'T
2potenz4 = 2 ^ 4
T2 = B5 + 8
T = T2 / 2potenz4
End Sub
Sub Berechne_druck
'B6
B6 = B5 - 4000
'X1
2potenz12 = 2 ^ 12
B6a = B6 * B6
B6a = B6a / 2potenz12
X1 = B2 * B6a
X1 = X1 / 2potenz11
'X2
X2 = Ac2 * B6
X2 = X2 / 2potenz11
'X3
X3 = X1 + X2
'B3
Ac1a = Ac1 * 4
Ac1a = Ac1a + X3
Shift Ac1a , Left , 2
Ac1a = Ac1a + 2
B3 = Ac1a / 4
'X1 die zweite
2potenz13 = 2 ^ 13
B6a = B6 / 2potenz13
X1 = Ac3 * B6a
'X2 die zweite
B6a = B6 * B6
B6a = B6a / 2potenz12
X2 = B1 * B6a
2potenz16 = 2 ^ 16
X2 = X2 / 2potenz16
'X3 die zweite
X3 = X1 + X2
X3 = X3 + 2
2potenz2 = 2 ^ 2
X3 = X3 / 2potenz2
'B4
B4 = X3 + 32768
B4 = B4 * Ac4
B4 = B4 / 2potenz15
If B4 <= 0 Then B4 = B4 * -1
'Print B4
'B7
B7 = Up - B3
B3a = 50000
Shift B3a , Right , 2 '
B7 = B7 * B3a
If B7 <= 0 Then B7 = B7 * -1
'Print B7
If B7 < &H80000000 Then
P = B7 * 2
'Print "p1 " ; P
P = P / B4
'Print "p1 " ; P
Else
P = B7 / B4
'Print "p2 " ; P
P = P * 2
'Print "p2 " ; P
End If
'Print P
'nochmal X1
2potenz8 = 2 ^ 8
P2 = P / 2potenz8
X1 = P2 * P2
'Print X1
X1 = X1 * 3038
X1 = X1 / 2potenz16
'Print X1
' nochmal X2
X2 = -7357 * P
X2 = X2 / 2potenz16
'Print X2
P2 = P
P = X2 + 3791
P = P + X1
P = P / 2potenz4
P = P + P2
End Sub
Sub Lese_kalib_data
Adres = &HAA
'Ac1 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac1 = Msb + Lsb
Adres = Adres + 1
'Ac2 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac2 = Msb + Lsb
Adres = Adres + 1
'Ac3 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac3 = Msb + Lsb
Adres = Adres + 1
'Ac4 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac4 = Msb + Lsb
Adres = Adres + 1
'Ac5 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac5 = Msb + Lsb
Adres = Adres + 1
'Ac6 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Ac6 = Msb + Lsb
Adres = Adres + 1
'B1 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
B1 = Msb + Lsb
Adres = Adres + 1
'B2 lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
B2 = Msb + Lsb
Adres = Adres + 1
'MB lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Mb = Msb + Lsb
Adres = Adres + 1
'MB lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Mc = Msb + Lsb
Adres = Adres + 1
'Md lesen
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
Shift Msb , Left , 8
Md = Msb + Lsb
Adres = Adres + 1
End Sub
Sub Lese_roh_daten
Call Lese_bmp085(adres , Wert)
Msb = Wert
Adres = Adres + 1
Call Lese_bmp085(adres , Wert)
Lsb = Wert
End Sub
Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
I2cstart
I2cwbyte Addr_schreiben
I2cwbyte Adres
I2cwbyte Wert
I2cstop
Waitms 10
End Sub
Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
I2cstart
I2cwbyte Addr_schreiben
I2cwbyte Adres
I2cstart
I2cwbyte Addr_lesen
I2crbyte Wert , Nack
I2cstop
Waitms 10
End Sub
Re: BASCOM AVR в вопросах и ответах
domrustika, самое простое - разведи их на разные ноги.
-
domrustika
- Грызет канифоль
- Сообщения: 257
- Зарегистрирован: Чт мар 22, 2007 13:50:33
- Откуда: казань
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
разве I2c может быть на разных пинах?? вроде как нет.
Re: BASCOM AVR в вопросах и ответах
Ошибся я. Это по 1-Wire можно произвольно ноги цеплять.
По I2C только адресация. Вот тут все написано: http://scbist.com/datasheets/microchip/ ... C_INTR.pdf
По I2C только адресация. Вот тут все написано: http://scbist.com/datasheets/microchip/ ... C_INTR.pdf
Re: BASCOM AVR в вопросах и ответах
подскажите что такое basc- avr.dll и где его скачать? спасибо


