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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » работа с PCINT на attiny13


работа с PCINT на attiny13

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

1

Как использовать эти PCINT? Поиск результатов не дал, справка тоже. Прошу помощи

0

2

PCINT в тиньках есть PCINT0 и PCINT1...Х
Использовать как обычное прерывание, прописывать разрешение и обработчик.
От  PCINT1...Х прерывание будет генерироваться при любом изменении любой ноги, вне зависимости как она сконфигурирована, на выход или на вход.  И никак, кроме как сравнением состояния порта с предыдущим вызовом не определить, какая же это именно нога дрыгнулась.
Лично я поэтому использую PCINT1...Х в основном для вывода камушка из слипа, не прописывая в обработчик ничего. А вот на PCINT0 можно удобно сесть для подсчета количества/длительности/декодирования и т.д.

0

3

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

никак, кроме как сравнением состояния порта с предыдущим вызовом не определить, какая же это именно нога дрыгнулась.

Чуток не так.
Есть в МК регистр GIFR в котором включаются разрешения на прерывания. Например включив бит PCIF0 разрешим прерывания PCINT0..7. Включим PCIF1, разрешим прерывания PCINT8..15 и т.д. (если они конечно есть в МК)
Затем зададим маску в регистрах PCMSKx (где х = 0 .. 1 и т.д.). Эта маска разрешит прерывания только на конкретных ногах. Например включим в регистре PCMSK0 бит PCINT2. При этом прерывание будет только по этому входу. Другие ноги можно использовать на свое усмотрение. Единственным ньюансом является то, что прерывание будет происходить и по фронту и по спаду сигнала, но тут уже нужно внутри программы определять что вам нужно.
Вот как то так.

0

4

Написал вот такой код. Не работает. В чем дело?

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

$hwstack = 10
$swstack = 20
$framesize = 30

Config Portb.4 = Output
On Pcint0 Button:

Enable Interrupts
Enable Pcint0

Do

Loop
End


Button:
Portb.4 = 1
Return

0

5

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

Как использовать эти PCINT? Поиск результатов не дал, справка тоже. Прошу помощи

Как это не дал результата, а здесь, что по Вашему?

Лёгкая правка исходников согласно документации на МК.

Отредактировано sasha_1973 (2014-01-16 16:14:20)

0

6

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

Как использовать эти PCINT?

Мне тоже стало интересно как работает PCINT и полез я в даташит на тини13. Что я понял:
1. Включаем прерывания.

Код:
Sreg = 128
'или                                                       'вкл.глобальные прерывания
Enable Interrupts

http://s7.uploads.ru/ucvUb.jpg

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

Код:
Pcmsk = 63                                                  'разрешаем ножкам PCINT0-PCINT5
                                                            'работать на прерывание

Ставим в единицу биты в кружочках, если ноги будут работать на прерывание. 63 - это 00111111
http://s7.uploads.ru/A0FQd.jpg

3. Разрешаем PCINT0. Так как у тини13 всего-то и есть,что одно INT0(PCINT0), трудностей быть не должно.

Код:
Gimsk = 32
'или
Enable Pcint0                                               'разрешаем прерывания PCI

http://s7.uploads.ru/clKWL.jpg

4.Указываем обработчик прерывания

Код:
On Pcint0 Test                                              'обработчик прерывания

5. И управляем портом PORTB.3

Код:
Test:
 If Pinb.2 = 0 Then                                         'если кнопка на ноге 7 нажата
 Waitms 200                                                 'немного подождем...
  Toggle Portb.3                                            'переключим состояние порта
   End If

If Pinb.0 = 0 Then                                          'тоже,но на ноге 5
 Waitms 200
  Toggle Portb.3
   End If
Gifr = 32                                                   'сбрасываем флаг
 Return

Про флаги прерывания( GIFR) можно почитать отдельно.

Все вместе:

Код:
$regfile = "attiny13.dat"
$crystal = 4000000
$hwstack = 8
$swstack = 8
$framesize = 12

Config Portb.3 = Output

Sreg = 128
'или                                                       'вкл.глобальные прерывания
Enable Interrupts

Pcmsk = 63                                                  'разрешаем ножкам PCINT0-PCINT5
                                                            'работать на прерывание
Gimsk = 32
'или
Enable Pcint0                                               'разрешаем прерывания PCI

On Pcint0 Test                                              'обработчик прерывания

 Do

 'здесь,как обычно что-то происходит

 Loop
 '------------------------------
'обработчик прерывания
  Test:
 If Pinb.2 = 0 Then                                         'если кнопка на ноге 7 нажата
 Waitms 200                                                 'немного подождем...
  Toggle Portb.3                                            'переключим состояние порта
   End If

If Pinb.0 = 0 Then                                          'тоже,но на ноге 5
 Waitms 200
  Toggle Portb.3
   End If
Gifr = 32                                                   'сбрасываем флаг

 Return

Если я что-то не так понял,прошу меня поправить, так как я и сам ещё начинающий, но код вполне устойчиво работает.. :sceptic:

Отредактировано Sergik07 (2014-01-16 16:51:52)

0

7

Ну так и отлично! :cool:  Лучше, конечно, писать Pcmsk = 63 в бинарном виде. Так наглядней. А то через м  есяц гулянок, придётся за калькулятор опять браться :glasses:
Да,и у attiny13, вроде нет частоты 4 Мгц.

0

8

sva-don написал(а):

Чуток не так.
Есть в МК регистр GIFR в котором включаются разрешения на прерывания. Например включив бит PCIF0 разрешим прерывания PCINT0..7. Включим PCIF1, разрешим прерывания PCINT8..15 и т.д. (если они конечно есть в МК)...

Да, сорри, Tiny 13 это новый кристалл, у него есть PCMSK, можно отключить ноги с выводом, но прерывание от всех разрешенных все равно одно и нужно определять состояние сравнением с предыдущим состоянием как для выделения конкретной ноги, так и для определение фронт это или спад.

Отредактировано IgorL (2014-01-22 08:10:03)

0

9

А как поставить прерывание по смене импульса в PCINT 18-19 (или другие по маске) и как выбрать обработчик прерываний (Int0 или Int1)?
------------------------------------------
Pcmsk2 = &B0000_1100  - выбираю PCINT18 и PCINT19 (PD2 PD3) (стр.94 в >документе< )
Config Int0 = Rising - конфигурирую прерывание, но вот тут не ясно, INT0 или INT1 будет обрабатывать?
On Pcint2 Encod1 - включаю Pcint2, так как PCINT19 и PCI18 находятся в Bit 2 – PCIE2 (стр.92 в >документе<)

Enable Pcint2
Enable Interrupts

Encod1:
return

------------------------------------------
Странно, но прерывания срабатывают, всё-же был момент бубна, не могу понять, правильно сделал?

Отредактировано Ev3658 (2016-09-28 11:18:19)

0

10

Если я правильно помню,то Pcint срабатывает по изменению уровня само по себе,а Int0 и Int1 можно конфигурировать:фронт,спад и т.д.
Если конфигурируешь Int0 ,то и обрабатывать будет то,что пришло на эту ногу. int и pcint они же разные.

+1

11

Спасибо!!! Век живи, век учись!!!!
Получается, в контроллере есть несколько обработчиков прерывания PcInt, в Atmega328p примерно так:

On Pcint0 метка - с 23 по 16
On Pcint1 метка - с 14 по 8
On Pcint2 метка - с 7 по 0

15й не используется из-за ножки Reset.
Информация с стр.93 Datasheet Atmega328p

Чтоб срабатывало по нужному входу, нужно записать бит в маску, точней будет срабатывание по маске.
Выводы 23 по 16 записываются в Pcmsk2 = &B0000_0000, выводы 14-8 в Pcmsk1 = &B0000_0000 и выводы 7 по 0 в Pcmsk1 = &B0000_0000
Получается всё просто!!! Легче, чем с INT0 или INT1 !!!! Спасибо!

0

12

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

Получается, в контроллере есть несколько обработчиков прерывания PcInt, в Atmega328p примерно так:


Может пригодится

+1

13

Ev3658
Может пригодится. Вот тут на одно int можно повесить несколько кнопок.

0

14

Я вообще делал на одну ногу несколько кнопок, идея в том, что кнопка=резюк и АЦП определял нажатие. Кстати говоря, если INT0 совпадает с АЦП, то получается очень простое устройство с возможностью глубокой спячки и обработки нажатия. ;)

Отредактировано RDW (2016-09-28 17:01:19)

0

15

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

Ev3658
Может пригодится. Вот тут на одно int можно повесить несколько кнопок.

классика :) так на первых PIC делали, так как там было только 1 аппаратное внешнее прерывание...

да и АЦП для опроса нескольких кнопок - где-то из тех же времён :)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » работа с PCINT на attiny13