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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » Вопрос про TIMER1 в режиме Capture Edge.


Вопрос про TIMER1 в режиме Capture Edge.

Сообщений 31 страница 35 из 35

31

Здравствуйте всем. Не стал плодить темы, хотя вопрос в другом, но тема схожая.
Нужно измерять длину периода. Сигнал-меандр, но поскольку скважность может быть отличной от 2, то замерять при помощи Capture не получиться. По этому решил через int0.  Первое прерывание запускаем таймер, второе - останавливаем Казалось бы всё просто, но показания не стабильны. В архиве , сократил до минимума, наблюдаю за переменной в протеусе Taimer1, и она постоянно скачет в пределах 2-3 едениц. Кто подскажет в чём может быть косяк, как исправить, или может другой метод замера?

Код:
$regfile = "m88pdef.dat"
$crystal = 16000000
$hwstack = 24
$swstack = 32
$framesize = 64
$loadersize = 1024

Ddrb.5 = 1

Config Timer1 = Timer , Prescale = 1

Config Int0 = Rising

Enable Timer1

Enable Interrupts

On Int0 Cont Nosave
On Timer1 Tim1 Nosave
Dim A As Byte , W As Word , S As String * 15 , I As Byte , V As Word , W_ind As Word
Dim Cont_fl As Byte , Freq As Dword , Fl_lcd As Byte , Ft As Byte , Cont_lcd As Byte
Dim F_int As Byte


'====================================================
'ÎÑÍÎÂÍÎÉ ÖÈÊË
'====================================================
A1:
   Cls


   Enable Int0

   Do


      If Fl_lcd = 1 Then
        Disable Int0
        Fl_lcd = 0
        Cont_fl = 0
         Eifr = 3
         Enable Int0

      End If

   Loop




Tim1:
   !push R16
   !in R16 , sreg
   !push R16

   lds R16 , {F_int }
   inc R16
   sts {F_int } , R16

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

Cont:
   $asm
      PUSH R26
      PUSH R27
      push r25
      PUSH R24
      PUSH R16
      IN R24,SREG
      PUSH R24
   $end Asm
   Stop Timer1
   If Cont_fl = 0 Then
            Timer1 = 20
      Start Timer1
      Cont_fl = 1
   Else
      Fl_lcd = 1
   End If
   $asm
      POP R24
      Out Sreg , R24
      POP R16
      POP R24
      pop r25
      POP R27
      POP R26
   $end Asm
Return

ссылка на архив https://yadi.sk/d/HjHFoyrYfwElKA

Отредактировано kip (2020-10-31 10:42:57)

0

32

Какая нужна разрешающая способность?

0

33

Ну, поскольку техника цифровая, хочется понять, почему вообще показания прыгают. По этому, хотелось бы, что бы вообще цифра стояла как вкопанная. А так, получается даже при прыгании в 2-3 единицы, при переводе в реальные показания, например частоты, ( Freq=crystal/timer1) индикация довольно не красиво прыгает. Т.е. вопрос скорее не в разрешающей способности, а в выводе на индикацию. Но всё же интересно, почему в "цифре" ведёт себя как в аналоге. 8-)
Пытался поймать зависимость, переодичность, не смог. Всё рандомно. :'(

0

34

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

почему вообще показания прыгают.

У вас два обработчика прерываний. Если при возникновении прерывания от Int0 будет выполняться обработчик таймера, прерывание Int0 будет ждать своей очереди и наоборот.

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

По этому, хотелось бы, что бы вообще цифра стояла как вкопанная.

Для этого нужно изменять длину периода аппаратно, а не программно.

0

35

Прерывание по переполнению таймера на случай слишком большого периода.  При частоте больше 300 Гц, оно вообще не срабатывает. В принципе, для проверки, его вообще можно убрать, ни чего не меняется в дёргании показаний.

Пётр написал(а):

Для этого нужно изменять длину периода аппаратно, а не программно.

Так я только замеряю длину периода, я его не меняю программно.

0


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » Вопрос про TIMER1 в режиме Capture Edge.