Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » таймер по времени


таймер по времени

Сообщений 1 страница 10 из 10

1

не получается  включить второй таймер  срабатываний по времени  на один порт

Код:
'---------------------------Тип_микроконтроллера--------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
'############################ Конфигурация_ЖКИ #################################
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portd.1 , Rs = Portd.0
Cursor Off
Cls

'* * * подключаем библиотеку ds1307
$lib "ds1307clock.lib"
'------------------------------Порты--------------------------------------------
Config Pinc.0 = Input
Config Sda = Portd.3
Config Scl = Portd.2
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Output
Config Clock = User
Config Date = Dmy , Separator = .
Config 1wire = Portd.4
Config Adc = Single , Prescaler = 128 , Reference = Avcc
Set Portd.5
Set Portd.6
Set Portd.7
Set Portb.7
Cn Alias Pind.5                                             'Вниз
Cv Alias Pind.6                                             'Вверх
Vv Alias Pind.7                                             'Ввод
M Alias Pinb.7                                              'Меню

Eater Alias Portb.5                                         'кормушка


'--------------------------------Константы--------------------------------------
Const Ds1307w = &HD0                                        ' бит записи
Const Ds1307r = &HD1

'-----------------------------Дополнительные_символы----------------------------
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'символ градуса
'------------------------------Переменные---------------------------------------
Dim Weekday As Byte
Dim J1 As Byte
Dim M1 As Byte
Dim D1 As Byte
Dim H1 As Byte
Dim Min1 As Byte
Dim _min_real As Byte
Dim _min_temp As Byte
Dim Aa As Byte
Dim Xp As Byte
Dim Chr_code As Byte
Dim Tmp As Byte
Dim Tz As Integer , Tz1 As Integer
Dim Ee_dtemp As Eram Integer
Dim Ee_temp As Eram Integer
Dim Ee_h_on As Eram Byte
Dim Ee_h_off As Eram Byte
Dim H_on As Byte
Dim H_off As Byte
Dim Ee_air_on As Eram Byte
Dim Ee_air_off As Eram Byte
Dim Air_on As Byte
Dim Air_off As Byte
Dim Air_flag As Bit
Dim T_filter_off As Integer
Dim Light_flag As Bit
Dim T_fil As Byte
Dim I As Byte
Dim B1 As Byte , B2 As Byte
Dim T As Integer , T1 As Integer , Dt As Integer
Dim V As Byte
Dim T_cool As Integer
Dim Ee_cool As Eram Integer
Dim Ee_eater_on As Eram Byte
Dim Ee_eater_time As Eram Byte
Dim Ee_eatr_time As Eram Byte
Dim Eater_on As Byte
Dim Eater_time As Byte
Dim Eat As Bit
Dim Eat_time As Byte


'################################### Процедуры #################################
Declare Sub Enterdatetime
Declare Sub Getkey
Declare Sub Menu
Declare Sub Digit
Declare Sub Crcit
Declare Sub Temperature
Declare Sub Termostat
Declare Sub Eater
'############################ Начальные установки ##############################
 Tz = Ee_temp                                               'чтение заданой температуры из ЕЕПРОМ
 If Tz < 20 Or Tz > 30 Then
 Tz = 26                                                    ' если считаная температура не в норме то установим 26 градусов
 Ee_temp = Tz
 End if
 Dt = Ee_dtemp
 If Dt < 0 Or Tz => 6 Then
 Dt = 1
 Ee_dtemp = Dt
 End If


'##################### Основной цикл программы #################################
Do

   Call Temperature
   Locate 1 , 1
   Lcd Time$ ; "  " ; "t= " ; T ; Chr(0)
   Locate 2 , 1
   Lcd Date$ ; "  "
   If M = 0 Then                                            'кнопка входа в меню
  Gosub Menu
  End If
######################## Условие таймера по времени  ############################
   Eater_on = Ee_eater_on                                   ' читаем времья включения с ЕЕПРОМ
   Eater_time = Ee_eater_time
   Eat_time = Eater_on + 1                                  ' читаем времья выключения с ЕЕПРОМ
If _hour = Eater_on And _sec <= Eater_time And Eat = 0 And _min = 0 Then
   Eater = 1

    Locate 2 , 11
    Lcd "K"
    Else
    Eater = 0
    Locate 2 , 11
    Lcd "_"

    _hour = Ee_eater_on + 12    ,  включение  через 12 часов      ?( нет срабатывания  по времени через 12 часов)
    End If
   If _sec > Eater_time Then
   Eat = 1
   Else
   Eat = 0
   End If
 
'##################### Чтение/запись времени в RTC #############################
Getdatetime:
 I2cstart                                                   ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
End


'########################## Процедура чтения температуры #######################
Sub Temperature

   1wreset
   1wwrite &HCC
   1wwrite &H44
 Waitms 750
   1wreset
   1wwrite &HCC
   1wwrite &HBE
   B1 = 1wread()
   B2 = 1wread()
   1wreset

T = B1 / 16
T1 = B2 * 16
T = T + T1

End Sub

'########################### Меню ввода данных #################################
'_______________________________Установка часов_________________________________
Sub Enterdatetime
Cls
   Aa = 0
   Xp = _hour
Do
   If Xp > 23 Then Xp = 0
   Locate 1 , 1
   Lcd "©cїaЅoієa Аacoі"
   Locate 2 , 1
   Lcd "АacГ " ; Xp ; "  "
   Getkey
   H1 = Xp
Loop Until Aa = 1

'--------------------------------Установка минут--------------------------------
   Cls
   Aa = 0
   Xp = _min
   Do
   If Xp > 59 Then Xp = 0
   Locate 1 , 1
   Lcd "©cїaЅoієa Аacoі"
   Locate 2 , 1
   Lcd "јёЅyїГ " ; Xp ; " "
   Getkey
   Min1 = Xp
   Loop Until Aa = 1

   _hour = H1
   _min = Min1
   _sec = 0
   Gosub Settime

'--------------------------------Установка года--------------------------------
   Cls
   Xp = 13
   Aa = 00
   Do
   If Xp > 50 Then Xp = 13
   If Xp < 12 Then Xp = 50
   Locate 1 , 1
   Lcd "©cїaЅoієa"
   Locate 2 , 1
   Lcd "ґoг: " ; Xp ; " "
   Getkey
   J1 = Xp
   Loop Until Aa = 1
'--------------------------------Установка месяц--------------------------------
   Cls
   Aa = 00
   Xp = 03
   Do
   If Xp > 12 Then Xp = 03
   If Xp < 01 Then Xp = 12
   Locate 1 , 1
   Lcd "©cїaЅoієa"
   Locate 2 , 1
   Lcd "јecЗе: " ; Xp ; " "
   Getkey
   M1 = Xp
   Loop Until Aa = 1
'--------------------------------Установка дня--------------------------------
   Cls
   Aa = 00
   Xp = 02
   Do
   If Xp > 31 Then Xp = 02
   If Xp < 1 Then Xp = 31
   Locate 1 , 1
   Lcd "©cїaЅoієa"
   Locate 2 , 1
   Lcd "гeЅД:" ; Xp ; " "
   Getkey
   D1 = Xp
   Loop Until Aa = 1

   _year = J1
   _month = M1
   _day = D1

   Gosub Setdate

'--------------------------------Установка термостата---------------------------
Cls
   Aa = 0
   Xp = Tz
   Do
   If Xp > 30 Then Xp = 30
   If Xp < 20 Then Xp = 20
   Locate 1 , 2
   Lcd "OІoґpeі"
   Locate 2 , 1
   Lcd "Ўpaгycoі " ; Xp ; " "
   Getkey
   Loop Until Aa = 1
   Tz = Xp
   Ee_temp = Tz
       'Gosub Temperature

   '--------------------- Утановка включения  --------------------------
Cls
   Aa = 0
   Xp = Ee_eater_on
   Do
   If Xp > 23 Then Xp = 0
   Locate 1 , 2
   Lcd "KopјyБєa"
   Locate 2 , 1
   Lcd "Bє»ЖАeЅёe» " ; " :" ; Xp
   Getkey
   Loop Until Aa = 1
   Ee_eater_on = Xp




'--------------------- Утановка времени работы --------------------------

Cls
   Aa = 0
   Xp = Ee_eater_time
   Do
   If Xp > 60 Then Xp = 0
   Locate 1 , 2
   Lcd "єopјyБєё"
   Locate 2 , 1
   Lcd "CeєyЅг " ; " :" ; Xp
   Getkey
   Loop Until Aa = 1
   Ee_eater_time = Xp                                       'пишем времья выключения в ЕЕПРОМ

  End Sub
'######################### Меню опроса кнопок ##################################
Sub Getkey()
   Waitms 500
   If Cv = 0 Then Incr Xp
   If Cn = 0 Then Decr Xp
   If Vv = 0 Then
   Aa = 1
   Else
   Aa = 0
   End If
End Sub
'-------------------------------------------------------------------------------
Sub Menu()
Aa = 0
Xp = 0
Getkey
Enterdatetime
Cls
Lcd "  OK !"
End Sub


'####################### Условие роботы термостата #############################

Sub Termostat
   Tz = Ee_temp
   Dt = Ee_dtemp
   Tz1 = Tz - Dt
   If T <= Tz1 Then
      Heater = 1
      Locate 2 , 12
      Lcd "H"
      End If


    If T => Tz Then
      Heater = 0
      Locate 2 , 12
      Lcd "_"
            End If

      End Sub

нужно срабатывание второго цикла по времени через 12 часов..
помогите пожалуста!!! я только учусь писать программы.

просьба от модератора:
оформляйте код в теги "code"!
вверху справа, в виде папируса :)

Отредактировано Александр Д. (2013-03-03 10:36:35)

0

2

По-моему еще и первый DO не закрыт нигде....

0

3

написал(а):

вверху справа, в виде папируса

+в репу за позитив )))

Отредактировано Skull (2013-03-03 11:26:25)

0

4

как сделать исполнение    по условию  заданного времени  с повтором 12 часов

Код:
Eater:

   Eater_on = Ee_eater_on                                  
   Eater_time = Ee_eater_time
   Eat_time = Eater_on + 1                                 
If _hour = Eater_on And _sec <= Eater_time And Eat = 0 And _min = 0 Then
   Eater = 1

    Locate 2 , 11
    Lcd "K"
    Else
    Eater = 0
    Locate 2 , 11
    Lcd "_"

    [_hour = Ee_eater_on + 12
    End If
   If _sec > Eater_time Then
   Eat = 1
   Else
   Eat = 0
   End If

в протеусе работает только заданное время
где можно почитать про коды програмирования  в васкоме ?

0

5

Тут ссылки на сторонние ресурсы, не лукаться больше ни на что
Уроки
Немецкий сайт
МиниБот
Польский сайт

Отредактировано Skull (2013-03-03 14:16:03)

0

6

Не буду описывать ошибки существующего кода, там их прилично. Сразу к алгоритму.
Судя по всему в системе присутствует микросхема часов DS1307. В ней есть выход, на которм может быть сформирован сигнал 1 Гц. Заводим его на вход прерывания и во время срабатывания читаем время. Сравниваем с предыдущим значением и по истечении 12 часов запускаем то, что нужно. Кто то скажет грубо, да, соглашусь, зато просто.

+1

7

а можно по подробней и с примером? пожалуйста !!!!!
как организовать циклическое срабатывание

0

8

Записываем в контрольный регистр часов байт &H10. При этом на выходе SQW/OUT появятся импульсы с частотой 1 Гц. Подадим их на вход какого нибудь прерывания, например INT0. Включаем это прерывание, опять же например по фронту входного сигнала. Теперь по первому прерыванию в подпрограмме обработки прерывания прочтем значения часов и сохраним их для дальнейшего использования. Прерывания будут происходить с частотой 1 Гц. В каждом прерывании сравниваем значения часов и как только пройдет 12 часов мы тут же вызовем подпрограмму, которую нужно запустить. После этого в первом прерывании опять читаем и сохраняем время, вернее только значения часов и так непрерывно.
Код написать конечно же можно, но думаю, что это совершенно лишнее. Для того люди и учатся, чтобы самостоятельно все это пройти.
Для затравки можно так:

Код:
 'Конфигурация прерываний
 Config Int0 = Rising                                      
'Определить подпрограммы прерываний
 On Int0 Read_Clock Nosave 
'Разрешить прерывания
 Enable Int0

'Тело главной программы
Main:

'Процедура обработки прерывания от часов
If Clock_int = 1 Then
 Clock_int = 0

' Тут делаем все, что нам нужно. Читаем время, сравниваем его, вызываем подпрограмму, которая нужна и т.д. и т.п.

 Goto Main
End If

'Тут можно выполнять еще задачи.

'Спим дальше
Idle
Goto Main
Stop

'-------------------------------- Прерывания --------------------------------
'Прерывание от часов
Read_Clock:
  push r24
  Clock_int = 1
  pop r24
Return

Отредактировано sva-don (2013-03-05 11:01:58)

0

9

спасибо . буду разбираться
когда есть примеры  то легче понять что и  как и зачем следует.

0

10

подскажите в чем разница написания кода ?

Код:
 Sub Corm_set

   Corm_on = Ee_corm_on
   Corm_off = Ee_corm_off
   Corn_off = Corm_on + 1
If _hour = Corm_on Or Corm_on + 12 And _sec <= Corm_off And Corn = 0 And _min = 0 Then
   Corm = 1
      Locate 2 , 11
    Lcd "K"
    Else
    Corm = 0
    Locate 2 , 11
    Lcd "_"
    End If

      If _sec > Corm_off Then
   Corn = 1
   Else
   Corn = 0
   End If

компилятор ругается : error 35
а если не использовать данные памяти

Код:
 Sub Corm_set

   Corm_on = Ee_corm_on
   Corm_off = Ee_corm_off
   Corn_off = Corm_on + 1
If _hour = 7 Or 19 And _sec <= Corm_off And Corn = 0 And _min = 0 Then
   Corm = 1
      Locate 2 , 11
    Lcd "K"
    Else
    Corm = 0
    Locate 2 , 11
    Lcd "_"
    End If

      If _sec > Corm_off Then
   Corn = 1
   Else
   Corn = 0
   End If

работает прога как надо ,
как подправить первую чтоб задействовать начальные установки?

0


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » таймер по времени