Jump to content

Welcome to vip-cxema.org

logo3.png

The forum has a section for guests, where you can ask your questions without registration: Вопросы и ответы

By registering, you will be able to send private messages, receive notification of replies to topics. You can always send a message, many restrictions are removed.


Александр Бушков

Пользователи
  • Content Count

    22
  • Joined

  • Last visited

  • Days Won

    4

Александр Бушков last won the day on June 3 2016

Александр Бушков had the most liked content!

About Александр Бушков
 
 
  • Rank
    Пользователь
 
Информация
 
 
  • Пол
    Array
  • Город
    Array
 
  1. Модуль подойдет для домофонов, у которых на линии Audio во время вызова появляется напряжение как равное 0В, так и отличное от 0 В, например, 0,93В как у Tantos. Схема в прикрепленном файле.
  2. Модуль дублирует сигнал вызова домофона через сирену "Маяк-12КП" или др. на улицу. Схема в файле Уличный модуль вызова домофона.pdf
  3. Простой модуль задержки времени включения Лампы от датчика объема в пределах от 1 сек до 4 минут. Используется одно реле, два транзистора. Задержка времени.pdf
  4. Конечно уменьшал на компе. Но качество становится очень низким. А что тогда здесь мне уже ничего нельзя размещать? Так мало ресурса на сайте?
  5. Усилитель.pdf Сочетание положительной обратной связи (1,6 кОм) и отрицательной обратной связи (переменное 470 Ом) дает приемлемое качество звучания. Может запитываться от ИП с более высоким напряжением, тогда подобрать переменным сопротивлением 470 Ом уровень громкости.
  6. Уважаемый Администратор! У меня так мало места ( около 13 кбайт), чтобы еще разместить схемы или картинки. Можно ли увеличить?
  7. Это в PIC16F877, -877-A, -877-20. Возможно в других, где есть регистры D, E. Имеется в виду, что при TRISE4.0=0 можно управлять отдельными битами в D и E. При TRISE4.0=1 нельзя управлять отдельными битами в D и E. В этом случае все биты в D управляются в связке, т.е. как байт.
  8. Регистры D и E не будут доступны, если случайно конфигурировать регистр Е следующим образом: TRISE=%11111111 Необходимо, чтобы TRISE.4=0! Этот случай указан в описании регистра D в документации, но пока туда посмотришь..
  9. Да, не заложено. Это есть в другой программе здесь же. Мне важно было, чтобы просто работали два датчика на одной шине. Учту этот момент, спасибо.
  10. Да, так и собираюсь сделать. Проект довольно большой и там нужно будет задействовать все эти наработкти. Проект - Управление поливом в теплице. Температура на улице и внутри нужны. Отсчет времени нужен. Вкратце так: есть два бака по 120л, нужно их пополнять из внешней трубы. От них будут 4 направления полива. Каждый полив имеет три режима-отключение полива, полив типа 1 и типа 2. Полив 1 - наполнение некоторой небольшой емкости до срабатывания датчика воды. Полив типа 2- наполнение небольшой емкости по литрам. Будет задаваться частота поливов, и другие опции...
  11. ' Программа работает! ' Термометр на двух DS18b20 на одной шине, 12 битное преобразование ' Точность и шаг хода температуры 0.0625 градуса ' Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса ' Программа. версия от 2 июня 2016 '16F877А-I/P zn var byte 'Знак температуры в подпрограмме gl var byte 'градусы младший байт температуры в подпрограмме gh var byte 'градусы старший байт температуры в подпрограмме temp var byte 'Целочисло полных градусов в подпрограмме temp0001 var word 'Целое число десятитысячных долей градуса в подпрограмме gl1 var byte 'градусы младший байт температуры для первого DS18b20 gh1 var byte 'градусы старший байт температуры для первого DS18b20 gl2 var byte 'градусы младший байт температуры для второго DS18b20 gh2 var byte 'градусы старший байт температуры для второго DS18b20 zn1 var byte 'Знак температуры при выводе на дисплей для первого DS18b20 zn2 var byte 'Знак температуры при выводе на дисплей для второго DS18b20 temp1 var byte 'Целочисло полных градусов для первого DS18b20 temp10001 var word 'Целое число десятитысячных долей градуса при выводе на дисплей для первого DS18b20 temp2 var byte 'Целочисло полных градусов для второго DS18b20 temp20001 var word 'Целое число десятитысячных долей градуса при выводе на дисплей для второго DS18b20 a2 var byte a3 var byte a4 var byte a5 var byte a6 var byte a7 var byte a8 var byte x var byte fam1 var byte s1er0 var byte '6 байтов собственного номера первого DS18b20 s1er1 var byte s1er2 var byte s1er3 var byte s1er4 var byte s1er5 var byte crc1 var byte fam2 var byte s2er0 var byte '6 байтов собственного номера второго DS18b20 s2er1 var byte s2er2 var byte s2er3 var byte s2er4 var byte s2er5 var byte crc2 var byte DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATUS 50 define ADC_BITS 10 define ADC_CLOCK 3 define ADC_SAMPLEUS 100 pause 100 'Конфигурируем порты PortB=%00000000 PortC=%00000000 PortD=%00000000 PortE=%00000000 TrisB=%00000000 ' 0- Выход, 1 - Вход !!!! TrisD=%11111111 ' 0- Выход, 1 - Вход !!!! TrisA=%11111111 ' 0- Выход, 1 - Вход !!!! TrisE=%11111101 ' 0- Выход, 1 - Вход !!!! TrisC=%00000000 ' 0- Выход, 1 - Вход !!!! ADCON1=%10000010 x=0 PortE.1=1 ' Берем питание VDD для DS18b20 fam1=40 s1er0=255 s1er1=33 s1er2=203 s1er3=102 s1er4=20 s1er5=3 crc1=145 fam2=40 s2er0=151 s2er1=148 s2er2=82 s2er3=7 s2er4=0 s2er5=0 crc2=39 sto: 'НАЧАЛО ЦИКЛА gl=0 gh=0 x=120 ' Промежуточные вычмсления x=x-80 x=x/10 x=x*30 gl1=0 gh1=0 TrisC.3=0 ' Порт ввода-вывода информации в DS18b20 OWout PortC.3,1,[$55] ' Инициализация первого DS18b20 (1) и посылка собственного номера (55) OWout PortC.3,0,[fam1,s1er0,s1er1,s1er2,s1er3,s1er4,s1er5,crc1] OWout PortC.3,0,[$44] ' Команда запуска преобразования температуры в первом DS18b20 pause 900 OWout PortC.3,1,[$55] ' Инициализация первого DS18b20 (1) и посылка собственного номера (55) OWout PortC.3,0,[fam1,s1er0,s1er1,s1er2,s1er3,s1er4,s1er5,crc1] OWout PortC.3,0,[$BE] ' Запускаем команду чтения двух байт температуры из первого DS18b20 TrisC.3=1 owin PortC.3,0,[gl1,gh1,a2,a3,a4,a5,a6,a7,a8] ' Прием двух байт температуры из первого DS18b20 gl=gl1 gh=gh1 gosub Convert zn1=zn temp1=temp temp10001=temp0001 gl2=2 gh2=2 TrisC.3=0 OWout PortC.3,1,[$55] ' Инициализация второго DS18b20 (1) и посылка собственного номера (55) OWout PortC.3,0,[fam2,s2er0,s2er1,s2er2,s2er3,s2er4,s2er5,crc2] OWout PortC.3,0,[$44] ' Команда запуска преобразования температуры во втором DS18b20 pause 900 OWout PortC.3,1,[$55] ' Инициализация второго DS18b20 (1) и посылка собственного номера (55) OWout PortC.3,0,[fam2,s2er0,s2er1,s2er2,s2er3,s2er4,s2er5,crc2] OWout PortC.3,0,[$BE] ' Запускаем команду чтения двух байт температуры из второго DS18b20 TrisC.3=1 owin PortC.3,0,[gl2,gh2,a2,a3,a4,a5,a6,a7,a8] ' Прием двух байт температуры из второго DS18b20 gl=gl2 gh=gh2 gosub Convert zn2=zn temp2=temp temp20001=temp0001 'Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса 'Вывод на дисплей 8 байт из DS18b20 признак изделия, серийный номер 6 байт, байт ц.к. lcdout $fe, 1 lcdout $fe, 2 if temp10001=625 then lcdout zn1,dec temp1,".0625 DS18b20" 'Добавляем ведущий 0 перед 625 когда temp0001=625. Иначе было бы 23.625 вместо 23.0625 else lcdout zn1,dec temp1,".",dec temp10001, " DS18b20" endif lcdout $fe, 192 if temp20001=625 then lcdout zn2,dec temp2,".0625" 'Добавляем ведущий 0 перед 625 когда temp0001=625. Иначе было бы 23.625 вместо 23.0625 else lcdout zn2,dec temp2,".",dec temp20001 endif pause 200 'Конец вывода информации на дисплей goto sto ' КОНЕЦ ЦИКЛА Convert: temp=0 temp0001=0 ' Преобразование байтов температуры из DS18b20 в числовое значение для вывода на дисплей if gh.7=0 then zn="+" else zn="-" endif ' Преобразование для положительной температуры if gh.7=0 then if gh.2 =1 then temp=temp+64 if gh.1 =1 then temp=temp+32 if gh.0 =1 then temp=temp+16 if gl.7 = 1 then temp=temp+8 if gl.6= 1 then temp=temp+4 if gl.5 =1 then temp=temp+2 if gl.4 =1 then temp=temp+1 if gl.3 =1 then temp0001=temp0001+5000 if gl.2 =1 then temp0001=temp0001+2500 if gl.1 =1 then temp0001=temp0001+1250 if gl.0=1 then temp0001=temp0001+625 endif ' Преобразование для отрицательной температуры if gh.7=1 then gl=~gl+1 ' Делаем дополнение к отрицательной температуре: ' инвертиреем биты и прибавляем 1 gh=~gh if gl=0 then gh=gh+1 'Учитываем перенос из мл.байта при +1,если он был if gh.2 =1 then temp=temp+64 if gh.1 =1 then temp=temp+32 if gh.0 =1 then temp=temp+16 if gl.7 = 1 then temp=temp+8 if gl.6= 1 then temp=temp+4 if gl.5 =1 then temp=temp+2 if gl.4 =1 then temp=temp+1 if gl.3 =1 then temp0001=temp0001+5000 if gl.2 =1 then temp0001=temp0001+2500 if gl.1 =1 then temp0001=temp0001+1250 if gl.0=1 then temp0001=temp0001+625 endif return End
  12. В качестве зонда используется любой провод, например ВВГ 2х1,5 мм2
  13. ' Программа работает! ' Термометр на DS18b20, 12 битное преобразование ' Точность и шаг хода температуры 0.0625 градуса ' Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса ' Вывод на дисплей признака изделия, 6 байт собственного номера, байта Ц.К. ' Программа. версия от 31 мая 2016 '16F877А-I/P gl var byte 'градусы младший байт температуры из DS18b20 gh var byte 'градусы старший байт температуры из DS18b20 zn var byte 'Знак температуры x var byte fam var byte ser0 var byte ser1 var byte ser2 var byte ser3 var byte ser4 var byte ser5 var byte crc var byte temp var byte 'Целочисло полных градусов temp0001 var word 'Целое число десятитысячных долей градуса при выводе на дисплей. DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATUS 50 define ADC_BITS 10 define ADC_CLOCK 3 define ADC_SAMPLEUS 100 pause 100 'Конфигурируем порты PortB=%00000000 PortC=%00000000 PortD=%00000000 PortE=%00000000 TrisB=%00000000 ' 0- Выход, 1 - Вход !!!! TrisD=%11111111 ' 0- Выход, 1 - Вход !!!! TrisA=%11111111 ' 0- Выход, 1 - Вход !!!! TrisE=%11111101 ' 0- Выход, 1 - Вход !!!! TrisC=%00000000 ' 0- Выход, 1 - Вход !!!! ADCON1=%10000010 x=0 PortE.1=1 ' Берем питание VDD для DS18b20 gl=0 gh=0 sto: 'НАЧАЛО ЦИКЛА x=120 ' Промежуточные вычмсления x=x-80 x=x/10 x=x*30 TrisC.3=0 ' Порт ввода-вывода информации в DS18b20 OWout PortC.3,1,[$CC] ' Инициализация DS18b20 (1) и команда пропуска серийного номера (СС) OWout PortC.3,0,[$44] ' Команда запуска преобразования температуры в DS18b20 pause 900 OWout PortC.3,1,[$CC] ' Инициализация DS18b20 (1) и команда пропуска серийного номера (СС) OWout PortC.3,0,[$BE] ' Запускаем команду чтения двух байт температуры из DS18b20 TrisC.3=1 owin PortC.3,0,[gl,gh] ' Прием двух байт температуры из DS18b20 TrisC.3=0 ' Порт ввода-вывода информации в DS18b20 OWout PortC.3,1,[$33] ' Запускаем команду чтения восьми байт признак изделия, серийный номер 6 байт, байт ц.к. из DS18b20 pause 900 TrisC.3=1 owin PortC.3,0,[fam,ser0,ser1,ser2,ser3,ser4,ser5, crc] 'Прием 8 байт из DS18b20 признак изделия, серийный номер 6 байт, байт ц.к. temp=0 temp0001=0 ' Преобразование байтов температуры из DS18b20 в числовое значение для вывода на дисплей if gh.7=0 then zn="+" else zn="-" endif ' Преобразование для положительной температуры if gh.7=0 then if gh.2 =1 then temp=temp+64 if gh.1 =1 then temp=temp+32 if gh.0 =1 then temp=temp+16 if gl.7 = 1 then temp=temp+8 if gl.6= 1 then temp=temp+4 if gl.5 =1 then temp=temp+2 if gl.4 =1 then temp=temp+1 if gl.3 =1 then temp0001=temp0001+5000 if gl.2 =1 then temp0001=temp0001+2500 if gl.1 =1 then temp0001=temp0001+1250 if gl.0=1 then temp0001=temp0001+625 endif ' Преобразование для отрицательной температуры if gh.7=1 then gl=~gl+1 ' Делаем дополнение к отрицательной температуре: ' инвертиреем биты и прибавляем 1 gh=~gh if gl=0 then gh=gh+1 'Учитываем перенос из мл.байта при +1,если он был if gh.2 =1 then temp=temp+64 if gh.1 =1 then temp=temp+32 if gh.0 =1 then temp=temp+16 if gl.7 = 1 then temp=temp+8 if gl.6= 1 then temp=temp+4 if gl.5 =1 then temp=temp+2 if gl.4 =1 then temp=temp+1 if gl.3 =1 then temp0001=temp0001+5000 if gl.2 =1 then temp0001=temp0001+2500 if gl.1 =1 then temp0001=temp0001+1250 if gl.0=1 then temp0001=temp0001+625 endif 'Вывод на дисплей целого чила полных градусов и целого числа десятитысячных долей градуса 'Вывод на дисплей 8 байт из DS18b20 признак изделия, серийный номер 6 байт, байт ц.к. lcdout $fe, 1 lcdout $fe, 2 lcdout "DS18b20 Temperat" lcdout $fe, 192 if temp0001=625 then lcdout zn,dec temp,".0625" 'Добавляем ведущий 0 перед 625 когда temp0001=625. Иначе было бы 23.625 вместо 23.0625 else lcdout zn,dec temp,".",dec temp0001 endif pause 3000 lcdout $fe, 1 lcdout $fe, 2 lcdout "Fam = ",dec fam lcdout $fe, 192 lcdout "Ser0= ",dec ser0 pause 3000 lcdout $fe, 1 lcdout $fe, 2 lcdout "Ser1= ",dec ser1 lcdout $fe, 192 lcdout "Ser2= ",dec ser3 pause 3000 lcdout $fe, 1 lcdout $fe, 2 lcdout "Ser3= ",dec ser3 lcdout $fe, 192 lcdout "Ser4= ",dec ser4 pause 3000 lcdout $fe, 1 lcdout $fe, 2 lcdout "Ser5= ",dec ser5 lcdout $fe, 192 lcdout "CRC = ",dec crc pause 3000 'Конец вывода информации на дисплей goto sto ' КОНЕЦ ЦИКЛА End
  14. С точки зрения математики здесь совершенно ясный алгоритм пересчета двух байт температуры из DS1820S в числовое значение для вывода на дисплей. Ограничиваемся только первыми двумя байтами преобразования температуры в DS1820S и не учитываем байты 7,8 остатка счета при преобразовании, т.к. это уже обеспечивает точность 0.5 градуса.
×
  • Create New...