|
-
Модуль подойдет для домофонов, у которых на линии Audio во время вызова появляется напряжение как равное 0В, так и отличное от 0 В, например, 0,93В как у Tantos.
Схема в прикрепленном файле.
-
Модуль дублирует сигнал вызова домофона через сирену "Маяк-12КП" или др. на улицу.
Схема в файле
Уличный модуль вызова домофона.pdf
-
Простой модуль задержки времени включения Лампы от датчика объема в пределах от 1 сек до 4 минут.
Используется одно реле, два транзистора.
Задержка времени.pdf
-
Конечно уменьшал на компе. Но качество становится очень низким.
А что тогда здесь мне уже ничего нельзя размещать? Так мало ресурса на сайте?
-
Усилитель.pdf
Сочетание положительной обратной связи (1,6 кОм) и отрицательной обратной связи (переменное 470 Ом) дает приемлемое качество звучания.
Может запитываться от ИП с более высоким напряжением, тогда подобрать переменным сопротивлением 470 Ом уровень громкости.
-
Уважаемый Администратор!
У меня так мало места ( около 13 кбайт), чтобы еще разместить схемы или картинки.
Можно ли увеличить?
-
Старый друг лучше новых двух. Проверено.
-
Это в PIC16F877, -877-A, -877-20. Возможно в других, где есть регистры D, E.
Имеется в виду, что при TRISE4.0=0 можно управлять отдельными битами в D и E.
При TRISE4.0=1 нельзя управлять отдельными битами в D и E.
В этом случае все биты в D управляются в связке, т.е. как байт.
-
Регистры D и E не будут доступны, если случайно конфигурировать регистр Е следующим образом: TRISE=%11111111 Необходимо, чтобы TRISE.4=0! Этот случай указан в описании регистра D в документации, но пока туда посмотришь..
-
Да, не заложено. Это есть в другой программе здесь же. Мне важно было, чтобы просто работали два датчика на одной шине.
Учту этот момент, спасибо.
-
Да, так и собираюсь сделать. Проект довольно большой и там нужно будет задействовать все эти наработкти.
Проект - Управление поливом в теплице. Температура на улице и внутри нужны. Отсчет времени нужен.
Вкратце так: есть два бака по 120л, нужно их пополнять из внешней трубы. От них будут 4 направления полива. Каждый полив имеет три режима-отключение полива, полив типа 1 и типа 2. Полив 1 - наполнение некоторой небольшой емкости до срабатывания датчика воды. Полив типа 2- наполнение небольшой емкости по литрам. Будет задаваться частота поливов, и другие опции...
-
' Программа работает!
' Термометр на двух 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
-
В качестве зонда используется любой провод, например ВВГ 2х1,5 мм2
-
' Программа работает!
' Термометр на 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
-
С точки зрения математики здесь совершенно ясный алгоритм пересчета двух байт температуры из DS1820S в числовое значение для вывода на дисплей.
Ограничиваемся только первыми двумя байтами преобразования температуры в DS1820S и не учитываем байты 7,8 остатка счета при преобразовании, т.к. это уже обеспечивает точность 0.5 градуса.
-
' Программа работает!
' Термометр на DS1820S, 9 битное преобразование
' Точность 0.5 градуса
' Вывод на дисплей признака изделия, 6 байт собственного номера, байта Ц.К.
' Программа. версия от 26 мая 2016
'16F877А-I/P
gl var byte 'градусы младший байт температуры из DS1820S
gh var byte 'градусы старший байт температуры из DS1820S
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 'Численное значение температуры на дисплей
dg var byte ' десятые доли градуса при выводе на дисплей: 0 или 5
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 для DS1820S
gl=0
gh=0
sto: 'НАЧАЛО ЦИКЛА
x=120 ' Промежуточные вычисления
x=x-80
x=x/10
x=x*30
TrisC.3=0 ' Порт ввода-вывода информации в DS1820S
OWout PortC.3,1,[$CC] ' Инициализация DS1820S (1) и команда пропуска серийного номера (СС)
OWout PortC.3,0,[$44] ' Команда запуска преобразования температуры в DS1820S
pause 900
OWout PortC.3,1,[$CC] ' Инициализация DS1820S (1) и команда пропуска серийного номера (СС)
OWout PortC.3,0,[$BE] ' Запускаем команду чтения двух байт температуры из DS1820S
TrisC.3=1
owin PortC.3,0,[gl,gh] 'Прием двух байт температуры из DS1820S
TrisC.3=0 ' Порт ввода-вывода информации в DS1820S
OWout PortC.3,1,[$33] ' Запускаем команду чтения восьми байт признак изделия, серийный номер 6 байт, байт ц.к. из DS1820S
pause 900
TrisC.3=1
owin PortC.3,0,[fam,ser0,ser1,ser2,ser3,ser4,ser5, crc] 'Прием 8 байт из DS1820S признак изделия, серийный номер 6 байт, байт ц.к.
temp=0
' Преобразование байтов температуры из DS1820S в числовое значение для вывода на дисплей
if gh.0=0 then
zn="+"
else
zn="-"
endif
' Преобразование для положительной температуры
if gh.0=0 then
if gl.7 = 1 then temp=temp+64
if gl.6= 1 then temp=temp+32
if gl.5 =1 then temp=temp+16
if gl.4 =1 then temp=temp+8
if gl.3 =1 then temp=temp+4
if gl.2 =1 then temp=temp+2
if gl.1 =1 then temp=temp+1
if gl.0=1 then
dg="5"
else
dg="0"
endif
endif
' Преобразование для отрицательной температуры
if gh.0=1 then
gl=~gl+1
if gl.7 = 1 then temp=temp+64
if gl.6= 1 then temp=temp+32
if gl.5 =1 then temp=temp+16
if gl.4 =1 then temp=temp+8
if gl.3 =1 then temp=temp+4
if gl.2 =1 then temp=temp+2
if gl.1 =1 then temp=temp+1
if gl.0=1 then
dg="5"
else
dg="0"
endif
endif
'Вывод на дисплей 8 байт из DS1820S признак изделия, серийный номер 6 байт, байт ц.к.
lcdout $fe, 1
lcdout $fe, 2
lcdout "DS1820S Temperat"
lcdout $fe, 192
lcdout zn,dec temp,".",dg
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 ser2
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
-
' ПРОГРАММА РАБОТАЕТ!
' Секундные часы на Таймере0
' Программа. версия от 19 мая 2016
'Таймер0, предделитель = 64, TMR0=131, Cnt=125 ( Период=1сек), Cnt = 7500 (Период=60 сек)
'16F877А-I/P
Cnt var byte
tchas VAR byte ' счетчик часов до 24
tmin VAR byte ' счетчик минут до 60
tsec var byte ' Счетчик секунд
dnedel var byte ' счетчик дней недели от 1 до 7
x var word
i var word
update 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=%11111111 ' 0- Выход, 1 - Вход !!!!
TrisC=%00001000 ' 0- Выход, 1 - Вход !!!!
ADCON1=%10000010
' Установка Таймера0 для работы по прерыванию
OPTION_REG.7=0 'T0CS=0 'внутренние часы
OPTION_REG.6=1 'T0CS=0 'внутренние часы
OPTION_REG.5=0 'T0CS=0 'внутренние часы
OPTION_REG.4=1 'T0SE=0 'фронт от 0 до 1
OPTION_REG.3=0 'PSA=0 'работа с предделителем
OPTION_REG.2=1 'PS2=1 '
OPTION_REG.1=0 'PS1=0 '
OPTION_REG.0=1 'PS0=1 'Предделитель = 64
INTCON.7=1 'Бит глобального прерывания
INTCON.6=0
INTCON.5=1 'Прерывание по Переполнению TIMER0
INTCON.4=0
INTCON.3=0
INTCON.2=0
INTCON.1=0
INTCON.0=0
T1CON=%00000000
T2CON=%00000000
'MAIN:
TMR0=131 'Установска регистра таймера
Cnt=0
tmin=0
tsec=0
tchas=0
dnedel=1 'Первый день недели Понедельник
ON interrupt goto ISR
sto: 'НАЧАЛО ЦИКЛА
' Вывод информации на дисплей
' Первая строка: Часы.Минуты.Секунды
' Вторая строка: День недели. Понедельник=1.
if update=1 then
lcdout $fe, 1
lcdout $fe, 2
lcdout dec tchas,".", dec tmin,".",dec tsec
lcdout $fe, 192
lcdout dec dnedel
pause 10
update=0
endif
x=120
x=x-80
x=x/10
x=x*30
'Конец вывода информации на дисплей
goto sto ' КОНЕЦ ЦИКЛА
disable
ISR:' Подпрограмма обработки прерывания таймера
If INTCON.2=1 then '--1
TMR0=131
Cnt=cnt+1
if Cnt=125 then 'Секундные отсчеты '--2
Cnt=0
'if PortC.4=0 then
'PortC.4 =1 'секундное переключение светодиода
'else
'PortC.4=0
'endif
tsec=tsec+1
update=1
if tsec=60 then '--3
tsec=0
'if PortC.5=0 then
'PortC.5=1 'минутное переключение светодиода
'else
'PortC.5=0
'endif
tmin=tmin+1 'Минуты часовые до 60
if tmin=60 then '--4
tmin=0
tchas=tchas+1 'Часы до 24
if tchas=24 then '--5
tchas=0
dnedel=dnedel+1 'Недели до 7
if dnedel>7 then dnedel=1
endif '==5
endif '==4
endif '==3
endif '==2
INTCON.2=0
resume
enable
endif '==1
' Конец подпрограммы обработки прерывания таймера c периодом 1 сек
resume
enable
End
-
Спасибо большое за помощь!
Нашел ошибку в тексте программы.
Не поставил перед обработчиком прерываний ключевое слово Disable,
а при выходе из обработчика не поставил Enable.
-
Спасибо за совет! Сейчас совсем нет прерываний, даже на первых секундах ничего...Мне кажется, что ошибка в структуре программы, например, не так сделана точка входа в подпрограмму обработки прерывания или возврат из нее...
Будьте добры, пришлите пожалуйста текст программы на PIc Basic Pro Вашего 12 урока на двух таймерах. Ведь очень важны и детали в программировании..
Моя почта:
bushkovaa@mail.ru
-
-
Да, смотрел и изучал. Но прерывания еще не пробовал программировать. Сейчас прерывания не идут...
Упущена какая то важная фишка...
-
' Никак не получается программа. Подскажите, пожалуйста, что не так?
|
|