| Помогите разобраться с таймером | 
| 
				
			 | 
| 
| 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 
 
 |  
 |  |  |  | 
| 
| 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, я так пробовал, но видимо из-за того, что в моем чипе не работает пределитель, на такой частоте прерывание по переполнению таймера происходит намного быстрее чем операции в основном цикле. Заказал новый чип. Придет, продолжу эксперименты. 
 
 |  
 |  |  |  |