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

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

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

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



Timer на Attiny13

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

1

Заранее, благодарен, Всем кто откликнется.

http://sh.uploads.ru/t/xBO4h.jpg

Для управления одним прибором, надо управлять логическими выходами Portb.4 и Portb.3, управление от кнопки по Pinb.1 выход работает следующим образом, при включении выдает 0 и 0; 0 и 1; 1 и 0; 1 и 1 далее отключение выхода Portb.0. Задача была отключать Portb.0 через 5 минут роботы, для сохранения энергии аккумулятора, идеально чтобы отсчет времени постоянно начинался после нажатия кнопки.
   Не ругайте строго, 20 лет назад учил программирование, подзабыл без практики.

Код:
$regfile = "attiny13.dat"
$crystal = 9600000

$hwstack = 32
$swstack = 8
$framesize = 16


Config Portb.4 = Output                                     'âûõîä ëîãèêè
Config Portb.3 = Output                                     'âûõîä ëîãèêè
Config Pinb.1 = Input                                       'âõîä îò êíîïêè
Config Portb.0 = Output                                     'âûõîä

Config Timer0 = Timer , Prescale = 1024 , Compare A = Set

Dim Wtime As Byte
Dim Endtime As Word

On Oc0a Compa

Endtime = 1200

Compare0a = Endtime


Enable Interrupts
Enable Oc0a


Do
Portb.1 = 1
Portb.0 = 1

Do
Portb.3 = 0
Portb.4 = 0
Waitms 50
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1


Do
Portb.3 = 1
Portb.4 = 0
Loop Until Pinb.1 = 0
Do

Loop Until Pinb.1 = 1


Do
Portb.4 = 1
Portb.3 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1


Do
Portb.3 = 1
Portb.4 = 1
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.0 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1


Loop

Compa:
Portb.0 = 0
Stop
Return

End

Отредактировано serg.sv (2018-04-17 17:45:32)

0

2

serg.sv написал(а):

...
Compare0a = Endtime
Enable Interrupts
Enable Oc0a
...

В программе нет реакции на заявленные требования к таймеру...
Каша из обращений и установок...
Попробуйте (для нас) прокомментировать ваш код. ;)

Начните листать форум отсюда: Примеры применения в среде Баском
Море полезностей !

Отредактировано Nord (2018-04-16 22:53:50)

0

3

Nord написал(а):

Начните листать форум отсюда: Примеры применения в среде Баском
Море полезностей !

http://sd.uploads.ru/t/lna0B.jpg

0

4

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

0

5

domen82 написал(а):

Nord написал(а):Начните листать форум отсюда: Примеры применения в среде БаскомМоре полезностей !

Если заходите на форум с bascomavr.3bb.ru, то добавьте в указанную ссылку 3bb

Или просто на главной странице найдите Примеры применения в среде Баском

0

6

serg.sv
Тиньке13 можно выставить рабочую частоту 128кЦ.
Как то так - частота 128000, делитель 1024, пред.установка таймера 130.
Прерывание по таймеру будет раз в 1 секунду, и просто считать секундные импульсы - Incr Xэ
В основном цикле постоянно проверять этот самый Xэ - натикало или нет.
Насчитал 300 тиков - и вот оно - счастье... ;)

0

7

pavel1969 написал(а):

serg.sv
Тиньке13 можно выставить рабочую частоту 128кЦ.
Как то так - частота 128000, делитель 1024, пред.установка таймера 130.
Прерывание по таймеру будет раз в 1 секунду, и просто считать секундные импульсы - Incr Xэ
В основном цикле постоянно проверять этот самый Xэ - натикало или нет.
Насчитал 300 тиков - и вот оно - счастье... ;)

Подпись автора

    Лень - двигатель прогресса.


А разве функция Incr не просто увеличивает на 1? Как с её помощью считать импульсы?

0

8

serg.sv
Идея в чем - настраиваем таймер так, чтоб прерывание таймера происходило 1 раз в секунду, т.е. имеем секундные импульсы.
В подпрограмме обработки прерывания таймера ставим функцию Incr, т.е. считаем секунды.
Насчитали нужное количество секунд - МК что-то сделал и обнулил переменную.
И так по кругу...
Наша песТня хороша - начинай с начала... :)

0

9

Ага,только не факт, что в тиньке 128 кГц, и предустановка таймера тоже занимает "тики". так что стабильность ни какая. Но как вариант, что бы отсчитывать промежутки времени , будет удобно. Сам часто пытаюсь подвести программу к "понятным" временным отрезкам.

0

10

kip
Вот из пдф-ки по тиньке13

The 128 kHz internal Oscillator is a low power Oscillator providing a clock of 128 kHz.
Внутренний генератор с частотой 128 кГц представляет собой генератор малой мощности с частотой 128 кГц.

А стабильность какая есть, такая и есть.

0

11

Понизил частоту до 128kHz, работает 16 секунд примерно, а надо 5 минут, что не так?

Код:
$regfile = "attiny13.dat"
$crystal = 128000

$hwstack = 32
$swstack = 8
$framesize = 16


Config Portb.4 = Output                                     'выход логики
Config Portb.3 = Output                                     'выход логики
Config Pinb.1 = Input                                       'вход от кнопки управления
Config Portb.0 = Output                                     'выход управления


Config Timer0 = Timer , Prescale = 1024

Dim Wtime As Byte

On Timer0 Pulse:

Wtime = 255

Enable Interrupts
Enable Timer0


Do
Portb.1 = 1
Portb.0 = 1

Do
Portb.3 = 0
Portb.4 = 0
Waitms 50
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.3 = 1
Portb.4 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.4 = 1
Portb.3 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.3 = 1
Portb.4 = 1
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.0 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1


Loop


Pulse:
Portb.0 = 0
Return

End

0

12

serg.sv написал(а):

Понизил частоту до 128kHz, работает 16 секунд примерно, а надо 5 минут, что не так?

Если понизить до 1Гц, наверное, считать легче будет... ;)

5 мин = 300 сек
У вас срабатывание каждые 16 сек.
300 / 16 = 18,75, будем считать 19.

Вам надо по каждому срабатыванию (тику) таймера увеличивать (Incr) некую переменную.
Как только ее значение (зависит от логики программы), например, станет более 19, то кидаемся выполнять нужные действия и (не забываем) эту переменную обнуляем, иначе каждый "тик" таймера станет рабочим.

Так понятно ?  kip вам про это же твердил...

0

13

Подпрограмма обработки прерывания таймера может выглядеть примерно так:
Pulse:
incr переменная_времени_паузы
Timer0 =130 - это предустановка таймера, расчетная величина.
Return

И все.

А уже в главном цикле нужно проверять переменную_времени_паузы.
if переменная_времени_паузы=300 then Portb.0 = 0    -  (300 секунд, ну или сколько нужно)

ЗЫ Сама программа не совсем понятна...
Вот эти все переключения они как то привязаны к временным интервалам?

0

14

pavel1969 написал(а):

ЗЫ Сама программа не совсем понятна... Вот эти все переключения они как то привязаны к временным интервалам?

У ТС в ТЗ еще есть загадочная цепочка "управление от кнопки по Pinb.1 выход работает следующим образом, при включении выдает 0 и 0; 0 и 1; 1 и 0; 1 и 1 далее отключение выхода Portb.0"...
Так что тут, походу, одним только таймером не обойтись... ;)

0

15

В схеме 2 выхода для управление логическим элементом, а Portb.0 для подачи питания на него, что бы сохранить аккумулятор. Кнопка служит для последовательного переключения и выключения устройства, просто хотелось добавить таймер отключения, если забыл выключить вручную.

0

16

pavel1969 написал(а):

Подпрограмма обработки прерывания таймера может выглядеть примерно так:
Pulse:
incr переменная_времени_паузы
Timer0 =130 - это предустановка таймера, расчетная величина.
Return

И все.

А уже в главном цикле нужно проверять переменную_времени_паузы.
if переменная_времени_паузы=300 then Portb.0 = 0    -  (300 секунд, ну или сколько нужно)

ЗЫ Сама программа не совсем понятна...
Вот эти все переключения они как то привязаны к временным интервалам?

Подпись автора

    Лень - двигатель прогресса.


Спасибо огромное за подсказку, все получилось. Еще хотелось бы, что бы отсчет начинался не по включению, а по последнему нажатию кнопки, но и так сойдет. Код программы прилагаю.

Код:
$regfile = "attiny13.dat"
$crystal = 128000

$hwstack = 8
$swstack = 16
$framesize = 16


Config Portb.4 = Output                                     'выход логики
Config Portb.3 = Output                                     'выход логики
Config Pinb.1 = Input                                       'вход от кнопки
Config Portb.0 = Output                                     'выход


Config Timer0 = Timer , Prescale = 1024

Dim Wtime As Byte
Dim Xoff As Word

On Timer0 Pulse:

Wtime = 255

Enable Interrupts
Enable Timer0


Do
Portb.1 = 1
Portb.0 = 1

Do
If Xoff = 300 Then Portb.0 = 0
Portb.3 = 0
Portb.4 = 0
Waitms 50
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
If Xoff = 300 Then Portb.0 = 0
Portb.3 = 1
Portb.4 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
If Xoff = 300 Then Portb.0 = 0
Portb.4 = 1
Portb.3 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
If Xoff = 300 Then Portb.0 = 0
Portb.3 = 1
Portb.4 = 1
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1

Do
Portb.0 = 0
Loop Until Pinb.1 = 0
Do
Waitms 50
Loop Until Pinb.1 = 1


Loop


Pulse:
Incr Xoff
Timer0 =130
Return

End

0

17

serg.sv
В основном цикле нужно проверять состояние кнопки.
И если кнопка нажата то Start Timer0, а если не нажата то  Stop Timer0

Или можно просто разрешать или запрещать прерывание Timer0

И еще нужно обязательно обнулить переменную, лучше в момент Start Timer0

Отредактировано pavel1969 (2018-04-19 08:12:28)

0