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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Режим захвата Таймер1


Режим захвата Таймер1

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

1

Как включить режим захвата на меге48р(...328)?
командой Config Timer1 = Counter , Capture_Edge =RISING, Prescale = 1 включается обычный счётчик. Т.е. регистры WGM1 3:0 =0000.
можно включить прерывание по захвату и сбрасывать таймер. Но показания Сapture1 немного прыгают.
Если я правильно понял, то  при WGM1 3:0 =1100 счётчик считает до сигнала на ICP1, далее сбрасывается в 0, а значение записывается в регистр захвата. Но включив их в ручную, я ни чего не получаю в Сapture1.

0

2

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

Как включить режим захвата на меге48р(...328)?

Примерчик

'===============================================================================
                            'Настройка МК
'===============================================================================
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.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 = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000    '230400
  Ucsr0a.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

  Config Timer1 = Timer , Prescale = 1 , Noise Cancel = 0 , Capture Edge = Falling

'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

  Dim Счетчик As Word

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





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

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

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

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

    Счетчик = Capture1

    Capture1 = 0
    Timer1 = 0

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

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

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

http://s2.uploads.ru/t/eyXOp.jpg

Отредактировано sasha_1973 (2016-01-17 02:45:30)

0

3

Саша, ты в прерывании сбрасываешь таймер1. Режим таймера включается Normal, и таймер считает до FFFF.
http://s3.uploads.ru/t/npG2D.png
А по идее, должен включиться таймер в режим СТС, и таймер1 должен сбрасываться в 0 после захвата. http://s6.uploads.ru/t/rYR4U.png

0

4

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

должен включиться таймер в режим СТС, и таймер1 должен сбрасываться в 0 после захвата

Если верить документации, в Atmega аппаратного сброса счетчика TIMER в прерывании по CAPTURE нет, как вариант, аппаратный сброс счетчика TIMER в прерывании по CAPTURE есть в AtXmega.

Почему Atmel этого не сделал в Atmega, хотя сброс туда, так и просится, загадка для шпиёна.

CTC связан с OCR, прерывания по CAPTURE не будет.

Единсвенный вариант, стр.116 (16.6 Input Capture Unit)

По приходу нужного уровня на ICP, аппаратно, копируются данные из TIMER в CAPTURE, по выходу из прерывания (или сбросу Bit 5 – ICF1: Timer/Counter1, Input Capture Flag) TIMER продолжает считать, или софтовый сброс счётчика TIMER в прерывании CAPTURE, для получения следующего точного отсчета.

Если прыгают показания CAPTURE (хотя не должны), поднимите частоту МК и понизьте Prescale (стр. 134   Table 16-5. Clock Select Bit Description)

Если не хватает размерности TIMER (долгие временные интервалы), и в то-же время нужна точность, нужно задействовать прерывание по переполнению TIMER (подсчитывать количество преполнений) и в прерывании по CAPTURE, посчитать,  65536 * счётчик переполнений + хвостик CAPTURE

Отредактировано sasha_1973 (2016-01-18 04:39:30)

0

5

Странно, но они же пишут:

16.9.2 Clear Timer on Compare Match (CTC) Mode
In Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 12), the OCR1A or ICR1 Register are used to
manipulate the counter resolution. In CTC mode the counter is cleared to zero when the counter value (TCNT1)
matches either the OCR1A (WGM13:0 = 4) or the ICR1 (WGM13:0 = 12).
The OCR1A or ICR1 define the top
value for the counter, hence also its resolution. This mode allows greater control of the compare match output
frequency. It also simplifies the operation of counting external events.

И почему, когда я в ручную выставляю (WGM13:0 = 12), он вообще ни чего не считает? Что не так?

0

6

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

И почему, когда я в ручную выставляю (WGM13:0 = 12), он вообще ни чего не считает? Что не так?


Почему не считает, считает и уходит в прерывания по значению в COMPARE, на CAPTURE не реагирует.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Режим захвата Таймер1