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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кто передавал температуру 18в20 по радиоканалу?


Кто передавал температуру 18в20 по радиоканалу?

Сообщений 91 страница 100 из 100

91

Нарыл как пользоваться счетчиками Counter0(1).
'настраиваем таймер в режим захвата по восходящему фронту
Config Timer0 = Counter , Edge = Falling , Prescale = 1
On Timer0 Uphigh

Stop Counter0
Enable Interrupts
Enable Timer0
'*******************************************************************************
Frequensy:
  Counter0 = 0
  Overcounter = 0

  Start Counter0
  Waitms 256
  Stop Counter0

  Timercounter = Counter0
  Freq = Overcounter                                       
  Shift Freq , Left , 8
  Freq = Freq + Timercounter

  Freqstr = Str(freq)
  Freqstr = Format(freqstr , "0000.000")
Return
'-------------------------------------------------------------------------------
Uphigh:
  Incr Overcounter
Return
Это все работает пока в протеус. Прерывание используется только в этой подпрограмме. Для подсчета переполнений TIMER0. Единственно нужно заменить время счета   Waitms 256 на более точное измерение. Почему 256. Перед МК стоит делитель на 64/256. Реальная частота измерения до 1ГГц.

0

92

Пробовал делать так.
'--------------------------------------------------------------
Config Timer1 = Timer , Prescale = 64
Stop Timer1
'*******************************************************************************
Frequensy:
  Counter0 = 0
  Timer1 = 0
  Overcounter = 0

  Start Counter0
  Start Timer1
  If Timer1 = 64000 Then                                    '256 мСек
'  Waitms 256
    Stop Counter0
    Stop Timer1
  End If

  Timercounter = Counter0
  Freq = Overcounter
  Shift Freq , Left , 8
  Freq = Freq + Timercounter

  Freqstr = Str(freq)
  Freqstr = Format(freqstr , "0000.000")
Return
Не работает. Где ошибка, не понимаю.

-1

93

Попробуй так:

Код:
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 40
$framesize = 64
'-------------------------------------------------------------------------------
Dim Flag_n As Byte 
Dim Zahvatvrem As Word 
Dim Chastota As Single ,  Chastota1 As Single , Period1 As Single 
Dim Sd As String * 2 
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1 , Clear Timer = 1       'конфигурации для 1-го таймера. Отвечает за скорость ветра
Config Portb.0 = Input                                      'Порт для IC1
Enable Interrupts                                           'Разрешаем прерывания
Enable Capture1                                             'Разрешаем захват
Enable Timer1                                               'Разрешаем таймер
Start Timer1                                                'Запускаем таймер
'-------------------------------------------------------------------------------
On Capture1 Zahvat1                                        'Если произошло событие(увеличение сигнала по фронту) то идем                                                                                                                                                                                                                                                                                                   
Const T = 0.000064                                          '0.000064= 4.194304/65536  где 4.194304=1024*65536/16000000                              
Zahvatvrem = 0                                                'Флаги приравниваем к 0
Do
   Period1 = Zahvatvrem * T                         'Вычисляем cколько таймер успел потикать.Общее число                                                                   
                                                   '(захваченного значения) умножаем на время необходимое для одного
  If Period1 = 0 Then
      Chastota = 0
   Else
      Incr Flag_n
      Chastota = 1 / Period1
      Chastota1 = Chastota1 + Chastota
      If Flag_n = 8 Then
         Chastota1 = Chastota1 / 8
         Chastota2 = Round(chastota1)
      End If
   End If
   Sd = Str(chastota2)
   Sd = Format(sd , "00")
Loop
'--------Подрограмма захвата------------------------------------------------------------------------
Zahvat1:
   Zahvatvrem = Timer1                               'При прерывании берем значение  Timer1
   Timer1 = 0                                          'чтобы вычислить частоту
Return


Переменные типа Single можно избежать , написав алгоритм обработки по другому.Но мне это не мешало, поэтому оставил.
В общем алгоритм такой: запускаем таймер, по приходу восходящего фронта уходим в прерывания таймера и берем значение таймера. Умножаем полученное значение на постоянную величину(время одного тика таймера) , получаем  период сигнала. Зная период- получаем частоту. У вас я так и не понял как вычисляете частоту.

Отредактировано Niya (2018-12-11 21:51:26)

0

94

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

Зная период- получаем частоту

Так-то оно вроде и так, но чёт как-то кривовасто.

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

запускаем таймер, по приходу восходящего фронта уходим в прерывания

А где алгоритм нисходящего фронта?   

Вообще проще на тактовых входах считать количество импульсов за единицу времени используя АППАРАТНЫЕ возможности проца. Но это подходит только для синусоидальных сигналов или для меандра. В методе, предложенным тобой измеряется ВРЕМЯ каждого перехода через "0". В этом случае можно "вычислить" не только частоту сигнала а и ещё что нибудь, например наполнение ШИМ.
Вообщ попробуй в прерывании On Change записывать показаниЯ счётчика для положительных и отрицательных фронтов отдельно, а там уж математикой посчитаешь то, что нужно.     :flag:

0

95

Niya
С такого подхода начинал, отказался. В данном случае порт ICP1 постоянно стои на ожидании импульса(в вечном прерывании). Условие
Do
If Period1 = 0 Then
      Chastota = 0
не выполняется. По скольку на входе пусто.
Что выложил выше, принцип обычного частотомера. Порта Т0 привязан к TIMER0, T1 к TIMER1. Соответственно переполнение 256, 65536 импульсов.
Start Counter0 'Таймер привязывается к импульсам на входе Т0. Сколько импульсов, столько тиков.
Waitms 1 'Время измерения. Количество импульсов в сек. Гц, в мсек. кГц.
Stop Counter0 '
Timercounter = Counter0 'Готовая частота в кГц. С условием, что таймер не переполнялся. до 255 кГц.
прерывание:
Uphigh:     
  Incr Overcounter   'Считает количество переполнений таймера.
Return

Freq = Overcounter ' Конечное значение пока равно количеству переполнений
  Shift Freq , Left , 8 'Сдвигаем число влево на 8 бит. Тоже, что Freq * 256. Количество переполнений в число.
  Freq = Freq + Timercounter 'Добавляем, что насчитали без переполнения. Реальная частота.

0

96

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

-NMi- написал(а):

А где алгоритм нисходящего фронта?

Зачем мне он нужен? Я измеряю период и по нему частоту. И еще по сдивугу относительно этого сигнала измеряю направление.
Поэтому  мне не нужны ,именно, временные интервалы, а не

-NMi- написал(а):

количество импульсов за единицу времени

И никаких пероход через 0 у меня в устройстве нет.

-NMi- написал(а):

В методе, предложенным тобой измеряется ВРЕМЯ каждого перехода через "0".

Оба сигнала положительной полярности относительно нуля. И измеряю я время между приходами положительных фронтов. Не знаю, откуда вы взяли переходы через 0
Вы, как я понял, не поняли принцип работы самого устройства(это и ясно, потому что я привел часть кода, чтобы показать один из способов измерения частоты, а не написал про свое устройство). Поэтому дали кучу советов...

0

97

rom-i написал(а):

В данном случае порт ICP1 постоянно стои на ожидании импульса(в вечном прерывании).

Так вы , как я писал ранее, посадите вход одновременно на внешнее прерывание и запустите захват по этому внешнему прерыванию и отключите

rom-i написал(а):

Waitms 1

если нет сигналов
как можно wait-ом получить точное измерение частоты, и еще использовать ее в прерываниях ?

0

98

Niya
Считает этод метод очень хорошо. Проверял в железе на макетке. Если на входе есть импульсы считает. Заткнул вход ICP1 на землю, программа в стопоре(В режиме захвата). Ждет импульса. Пробовал писать
Disable Capture1
Тоже самое.
Но у Вас интересная конфигурация таймера.
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1 , Clear Timer = 1
Что означают эти установки?
Noise Cancel = 1 , Clear Timer = 1

0

99

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

Так вы , как я писал ранее, посадите вход одновременно на внешнее прерывание и запустите захват по этому внешнему прерыванию и отключите

Здесь не понимаю как это реализовать.

0

100

rom-i написал(а):

Что означают эти установки?
Noise Cancel = 1 , Clear Timer = 1

Clear Timer = 1-очистить Timer1, когда произойдет прерывание
Noise Cancel = 1-включена фильтрация шумов

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кто передавал температуру 18в20 по радиоканалу?