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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Надо 3 входа внешних прерываний- INTx. Можно использовать компаратор?


Надо 3 входа внешних прерываний- INTx. Можно использовать компаратор?

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

1

приветствую всех!
задача: счет импульсов от трёх датчиков с импульсными выходами.
В atmega8 только два входа внешних прерываний - int0 и int1. Можно ли задействовать компаратор? К негативному выходу подключить делитель, выставить вольта 3-4. А на положительный подавать сигнал от датчика.
Верно мыслю?
Есть мега16 с тремя входами INTx, но задача больно простая, жалко ставить :)

0

2

да, можно и так. Читаю документацию, разные идеи проверяю )

0

3

Прерывание по захвату (ICP1) PB0

0

4

хм
а вот это я ни разу не использовал...
буду читать

Спасибо, тёзка :)

Отредактировано Александр Д. (2016-01-06 20:18:45)

0

5

что-то я не могу придумать, как использовать режим ICP1 в моих задачах. Вроде я такое делал, когда измерял низкие частоты методом измерения длительности периода.
А тут как?

0

6

Александр Д. написал(а):

А тут как?


Так-же, как и INT0; INT1

Примерчик

'===============================================================================
                            'Настройка МК
'===============================================================================
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"       '

'Документация Atmel:
'Atmega8A - http://www.atmel.com/images/atmel-8159- … asheet.pdf
'Atmega8L - http://www.atmel.com/images/atmel-2486- … asheet.pdf
'Migration from ATmega8 to ATmega8A - http://www.atmel.com/images/doc2553.pdf

  $crystal = 1000000       ' 1 МГц
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека
  $baud = 38400       '!!! ВНИМАНИЕ, ЗАЛИТ BOOTLOADER, скорость трансляции 38400 бод

'===============================================================================
                            'Настройка USART
'===============================================================================
  $baud = 38400       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000    '230400
  Ucsra.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

  $timeout = 2000000       ' Время ожидания ввода значения перед выходом

'===============================================================================
  'Настройка TIMER1_CAPTURE1 (прерывание по приходу импульса на вывод PB0(ICP))
'===============================================================================
  Config Pinb.0 = Input : Reset Portb.0

'TCCR1B – Timer/Counter1 Control Register B
'Bit 6 – ICES1: Input Capture Edge Select
  Tccr1b.ices1 = 1       'Если 1 - Rising-нарастание, если 0 - Falling-спад (стр.135 http://www.atmel.com/images/atmel-8159- … asheet.pdf)
'Bit 7 – ICNC1: Input Capture Noise Canceler
  Tccr1b.icnc1 = 0       'Если 1 - активируется шумоподавление (стр.135 http://www.atmel.com/images/atmel-8159- … asheet.pdf)

  On Capture1 Обработка_прерывания_capture1 Nosave

'===============================================================================
               'Настройка вывода МК для осциллографа
'===============================================================================
  Осциллограф Alias Portb.1 : Config Осциллограф = Output : Reset Portb.1

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Tifr.icf1 = 1       'Сброс флага прерывания Capture1, вдруг оно уже случилось
  Enable Capture1       'Разрешение прерываний Capture1
'-------------  Разрешаем работу всех включенных прерываний  -------------------
  Enable Interrupts       ' Разрешаем работу прерываний
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================





   Idle
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_capture1:
'-------------------------------------------------------------------------------
'    !push R16
'    !in R16 , sreg
'    !push R16

    Pushall       'Сохраняем все регистры и SREG

    Toggle Осциллограф

    Popall       'Восстанавливаем все регистры и SREG

'    !pop R16
'    !out sreg , R16
'    !pop R16

    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Всё вместе скинул на мыло

http://s7.uploads.ru/t/9bY0J.jpg

0

7

работает
но реагирует на изменения сигналов на AIN0 и AIN1

0

8

Александр Д. написал(а):

работает
но реагирует на изменения сигналов на AIN0 и AIN1

Мой пример?????????????????

0

9

слегка почищенный и добавлена переменная для подсчета вхождений в прерывание
пробовал по-разному: и регистры сохранял, и инициализацию иную - всё равно.

код

$regfile = "m8adef.dat"                           '
$crystal = 1000000                                ' 1 МГц
$framesize = 64                                   ' Размер области используемой и необходимой для преобразований
$hwstack = 64                                     ' Размер аппаратного стека
$swstack = 64                                     ' Размер программного стека

$baud = 2400                                      '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000    '230400

Dim Nalili_1 As Word

'===============================================================================
Config Pinb.0 = Input : Reset Portb.0
Tccr1b.ices1 = 1                                  'Если 1 - Rising-нарастание, если 0 - Falling-спад (стр.135 http://www.atmel.com/images/atmel-8159- … asheet.pdf)
Tccr1b.icnc1 = 0                                  'Если 1 - активируется шумоподавление (стр.135 http://www.atmel.com/images/atmel-8159- … asheet.pdf)
On Capture1 Int_capture1 Saveall

Tifr.icf1 = 1                                     'Сброс флага прерывания Capture1, вдруг оно уже случилось
Enable Capture1                                   'Разрешение прерываний Capture1
Enable Interrupts                                 ' Разрешаем работу прерываний

Do
   Print Nalili_1
   Waitms 500
Loop

Int_capture1:
'   Pushall                                        'Сохраняем все регистры и SREG
   Incr Nalili_1
'   Popall                                         'Восстанавливаем все регистры и SREG
Return
'
'

Отредактировано Александр Д. (2016-01-07 18:34:28)

0

10

да нечему тут в железе быть виноватым
кнопка на PB.0 + подтяжка к +5в через 4к7 и всё

ps
короче, добавил

Disable Aci                                   
Acsr.acic = 0
Acsr.acd = 0
Acsr.acie = 0
потом разберусь что да как...
вроде пропали проблемы

pps
Кстати, а какая версия Баском? у меня 2,0,7,7

Отредактировано Александр Д. (2016-01-07 22:24:04)

0

11

стр 246  http://www.atmel.com/images/atmel-8159- … asheet.pdf

Bit 2 – ACIC: Analog Comparator Input Capture Enable

When written logic one, this bit enables the input capture function in Timer/Counter1 to be triggered by
the Analog Comparator. The comparator output is in this case directly connected to the input capture
front-end logic, making the comparator utilize the noise canceler and edge select features of the Timer/
Counter1 Input Capture interrupt. When written logic zero, no connection between the Analog
Comparator and the input capture function exists. To make the comparator trigger the Timer/Counter1
Input Capture interrupt, the ICIE1 bit in the Timer Interrupt Mask Register (TIMSK1) must be set.

Если в этом регистре 1, пойдёт захват по ICP, только по умолчанию он-же сброшен, и в исходнике нигде не настраивается.

Отредактировано sasha_1973 (2016-01-08 22:10:09)

0

12

парни, глупый вопрос, но...
три прерывания. На все три входа одновременно приходят три импульса. Совпадают фазы и проч.
Как МК будет обрабатывать прерывания? как в даташите найти про порядок обработки прерываний? ткните ссылкой

0

13

стр. 66   http://www.atmel.com/images/atmel-8159- … asheet.pdf

Table 16-1 Reset and Interrupt Vectors

Всё в порядке очерёдности

Очерёдность

1 0x000 RESET External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
2 0x001 INT0 External Interrupt Request 0
3 0x002 INT1 External Interrupt Request 1
4 0x003 TIMER2 COMP Timer/Counter2 Compare Match
5 0x004 TIMER2 OVF Timer/Counter2 Overflow
6 0x005 TIMER1 CAPT Timer/Counter1 Capture Event
7 0x006 TIMER1 COMPA Timer/Counter1 Compare Match A
8 0x007 TIMER1 COMPB Timer/Counter1 Compare Match B
9 0x008 TIMER1 OVF Timer/Counter1 Overflow
10 0x009 TIMER0 OVF Timer/Counter0 Overflow
11 0x00A SPI, STC Serial Transfer Complete
12 0x00B USART, RXC USART, Rx Complete
13 0x00C USART, UDRE USART Data Register Empty
14 0x00D USART, TXC USART, Tx Complete
15 0x00E ADC ADC Conversion Complete
16 0x00F EE_RDY EEPROM Ready
17 0x010 ANA_COMP Analog Comparator
18 0x011 TWI Two-wire Serial Interface
19 0x012 SPM_RDY Store Program Memory Ready

Отредактировано sasha_1973 (2016-01-08 22:13:16)

0

14

видимо, не так меня поняли
получил int0 - выставил флаг этого прерывания, обработал,
получил int1 - выставил флаг этого прерывания, обработал,
и так далее

а одновременно ли он определяет факт прерываний?

0

15

Чтобы работала приоритетность, то нужно в самом прерывании сразу выполнять действие (но это действие должно выполняться быстро, иначе будут пропуски). Простое выставление флагов и дальнейшее выполнение в обычном теле кода - не поможет (или надо это учитывать).
В общем скорость - наше всё.

0

16

Александр Д. написал(а):

а одновременно ли он определяет факт прерываний?


Одновременно, а вот обрабатывает, по приоритету.

т.е., если во время прерывания пришло ещё одно или несколько, они никуда не денутся, пока не сбросятся соответствующие флаги.

Флаги сбрасываются аппаратно, после выхода из обработчика, или вручную (если есть надобность).

Отредактировано sasha_1973 (2016-01-09 11:17:22)

0

17

понятно. как соберу всё полностью в железе и оттестирую на стенде - отпишусь о результатах

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Надо 3 входа внешних прерываний- INTx. Можно использовать компаратор?