[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Помогите разобраться с таймером
Dmitry_SHДата: Понедельник, 25.01.2016, 16:28 | Сообщение # 1
Группа: Пользователи
Сообщений: 3

Статус: Offline
Здравствуйте!
Помогите пожалуйста разобраться с настройкой. Собираю реле времени для управления насосом. Под рукой была AtTiny13.
Вопросы:
1. не работает пределитель;
2. если я правильно понял кол-во переполнений считается так: время ожидания / ( 1/частота*255).
Тогда почему расчитанное кол-во переполнений сильно не совпадает с
реальным (железку уже собрал). Например: необходимо ожидать 5 минут до
включения таймера. расчет показывает, что надо ожидать 300 /
(1/4800000*255) = 5647058 переполнений таймера. Но когда я
запрограммировал микроконтроллер с этой цифрой то так и не дождался его
срабатывания. реальное кол-во прерываний для 5 минут ожидания составляет
примерно 450000. почему такая разница, где я ошибся в программе.

Спасибо


Код
$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.1 = Input
Config Pinb.2 = Input

Config Timer0 = Timer  ', Prescale = 256

Enable Timer0
'Stop timer0

Dim I As Long
Start Timer0

Do
   Incr I
   '--------------  8 : 3 ------------
   If Portb.1 = 0 And Portb.2 = 0 Then    
      If I = 560000 Then                    
         Set Portb.3
         Set Portb.4
      End If
      If I = 3654000 Then
         Reset Portb.3
         Reset Portb.4
         I = 0
      End If
   End If

   '--------------  10 : 5 ------------
   If Portb.1 = 0 And Portb.2 = 1 Then       
      If I = 3305000 Then                   
         Set Portb.3
         Set Portb.4
      End If
      If I = 4957000 Then
        Reset Portb.3
        Reset Portb.4
         I = 0
      End If
   End If

   '--------------  20 : 8 ------------
     If Portb.1 = 1 And Portb.2 = 0 Then   
      If I = 6615000 Then                            
         Set Portb.3
         Set Portb.4
      End If
      If I = 9268000 Then
         Reset Portb.3
         Reset Portb.4
         I = 0
      End If
   End If

  '--------------  30 : 10 ------------
   If Portb.1 = 1 And Portb.2 = 1 Then   
      If I = 9930000 Then                          
         Set Portb.3
         Set Portb.4
      End If
      If I = 13235000 Then
        Reset Portb.3
        Reset Portb.4
         I = 0
      End If
   End If

Loop
End


PS:  8 : 3 это 8 минут ожидаем до включения, 3 минуты держим включенным и выключаем




Сообщение отредактировал Dmitry_SH - Понедельник, 25.01.2016, 16:29
 
GSVДата: Вторник, 26.01.2016, 13:49 | Сообщение # 2
Группа: Друзья
Сообщений: 38

Статус: Offline
Если частота 4800000 и прескалер 256,то переполнение 8-ми битного таймера(Timer0) будет через каждые 13,65 милисек.Вам нужно 5 мин-это 300000 милисек.Чтобы нащелкать 5 мин надо I инкрементить 22058 раз. Вроде не наврал...)

 
Dmitry_SHДата: Среда, 27.01.2016, 08:50 | Сообщение # 3
Группа: Пользователи
Сообщений: 3

Статус: Offline
GSV, я так и считал, только делитель не работает. Ну да ладно, можно посчитать и без делителя. Тогда для 5минут I надо инкременить 5647058. Правильно? Но вот реальные цифры, подобранные с помощью метода "научного тыка" совсем другие:
Код
$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.3 = Output
Config Pinb.4 = Output

Config Timer0 = Timer                    ', prescale=256
Dim I As Long
Enable Timer0
Start Timer0

Do
    Incr I
   '--------------  10 : 5 ------------
      If I = 4100000 Then
         Set Portb.3
         Set Portb.4
      End If
      If I = 6200000 Then
         Reset Portb.3
         Reset Portb.4
         I = 0
      End If

Loop
End

Обратите внимание, реальная I при ожидании 10 минут меньше чем расчитанная для 5 минут.
Чувствую ошибка где то в прерываниях, а как найти (применить прерывания) не могу сообразить. Помогите разобраться!


 
MACTEPokДата: Среда, 27.01.2016, 12:20 | Сообщение # 4
Группа: Пользователи
Сообщений: 9

Статус: Offline
Dmitry_SH, вы не используете обработчик прерываний от Таймера0, а просто инкрементируете переменную в главном цикле.
Прочтите справку в Баскоме по прерываниям Таймера0.
Далее воткнуть Incr I в обработчик прерываний, по достижению заданного значения поднимать флаг и сбрасывать счетчик на ноль I=0.


 
GSVДата: Четверг, 28.01.2016, 13:36 | Сообщение # 5
Группа: Друзья
Сообщений: 38

Статус: Offline
Вот писал кому-то датчик приближения на HC-SR04.Там есть таймер,только Таймер1,можно пересчитать на Таймер0
Прикрепления: datchik.rar (1.1 Kb)


 
KoSS_89Дата: Пятница, 29.01.2016, 21:36 | Сообщение # 6
Группа: Проверенные
Сообщений: 53

Статус: Offline
$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.3 = Output
Config Pinb.4 = Output

Config Timer0 = Timer , prescale=256
On Timer0 Tim0
Dim I As Long
Enable Timer0
Start Timer0

Do
'--------------  10 : 5 ------------
If I = 4100000 Then
Set Portb.3
Set Portb.4
End If
If I = 6200000 Then
Reset Portb.3
Reset Portb.4
I = 0
End If

Loop
End

Tim0:
Incr I
Return




Сообщение отредактировал KoSS_89 - Пятница, 29.01.2016, 21:43
 
Dmitry_SHДата: Вторник, 02.02.2016, 00:37 | Сообщение # 7
Группа: Пользователи
Сообщений: 3

Статус: Offline
Спасибо всем кто откликнулсяKoSS_89, я так пробовал, но видимо из-за того, что в моем чипе не работает пределитель, на такой частоте прерывание по переполнению таймера происходит намного быстрее чем операции в основном цикле. Заказал новый чип. Придет, продолжу эксперименты.

 
  • Страница 1 из 1
  • 1
Поиск: