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