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

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

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

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


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


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

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

91

Пробовал делать так.
'--------------------------------------------------------------
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

92

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

Код:
$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

93

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

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

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

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

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

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

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

0

94

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

95

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

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

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

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

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

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

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

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

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

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

0

96

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

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

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

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

Waitms 1

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

0

97

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

98

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

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

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

0

99

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

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

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

0

100

-NMi-
Для понять правду, надо понять неправду.
Если работаем с отрицательными числами, тогда есть одна тема. Ее понят дорогой NMi.
Количество отрицательных голосов против выбранного президента, приводит к переполнению счетчиков.
Получите положительный результат. :crazyfun:

0

101

Это, и есть переход черезь "0".

0

102

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

Для понять правду, надо понять неправду.

-" видишь там на горе, возвышается крест, повиси-ка на нём, а потом приходи... гулять по воде, гулять по воде со мной..."       ... ты и верно д...к...

Ещё в форме афоризма: под лежачего прапорщика коньяк не течёт!

Ещё в форме программиста: если If 2+2 > 4 then пипец else п.з..ц          Так понятнее???

0

103

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

Получите положительный результат.

Для начала "понятия" о ПЕРЕМЕННОМ сигнале или о чём-то ВООБЩЕ ПЕРЕМЕННОМ советую пообщаться с каким-нибудь МАТЕМАТИКОМ или ФИЗИКОМ, дабы понять, что такое есть слово ПЕРЕМЕННАЯ!!!
А уж потом и ноль и фаза будут без разницы...  На фазе через "0" а на нуле постоянно "0" --- парадокс  :D

0

104

Собрал передачу по USART. Передатчик Tiny84, приемних хотел Tiny25, но Китайцы прислали дохлые МК. Пришлось переделовать тоже на Tiny84. Дальность на Китайских радиомодулях 30м. Вполне нормально. Скорость UART 2400бод. Бысрее начинают символы пропадать.
Решил продолжить тему с ШИМ.
$regfile = "attiny84.dat"
$crystal = 8000000
'------------------------------------------------------------------------------------------
Peredacha_bytov:
       Waitus Pausa
       Waitus Pausa
    For Байты = 0 To 5
      Select Case Байты                                     'Все байты Word,что бы не собирать в одно длинное слово
        Case 0 : Buf = Номер                                'Номер передающего устройства
        Case 1 : Buf = Tds1                                 'Температура DS18B20
        Case 2 : Buf = Tdht1                                'Температура DHT22
        Case 3 : Buf = Hdht1                                'Влажность DHT22
        Case 4 : Buf = L                                    'Напряжение батареи
        Case 5 : Buf = Crc                                  'Конторьная сумма
      End Select
          For Nomer_bita = 15 To 0 Step - 1                 'Старшим битом вперед
             If Buf.nomer_bita = 1 Then
                Data_ = 1                                   'Передний фронт импульса передачи
                Waitus Odin                                 'Длительность 1 1500мкС
                Data_ = 0                                   'Задний фронт импульса передачи
                Waitus Pausa                                'Пауза 500мкС. Общая длительность передачи 1 (1500+500=2000мкС)
              Else
                Data_ = 1
                Waitus Nol                                  'Длительность 0 500мкС
                Data_ = 0
                Waitus Pausa                                'Общая длительность передачи 0 (500+500=1000мкС)
            End If
          Next Nomer_bita
    Next Байты
                Data_ = 1                                   'Передний фронт для измерения последнего бита
                Waitus Nol                                  '------
                Data_ = 0                                   '------
Return
В начале передачи идет преамбула 8 импульсов ШИМ 1500/1500мкС, импульс опознавания ШИМ 4000/1000мкС, дальше данные, что в этом коде. В протеус по осциллографу как бы нормально. Но с приемом караул. Может протеус не успевает. Преамбула отсеивается. Импульс опознавания работает. Дальше каша. На дисплее остается последний бит. Всегда правильный.

Код:
$regfile = "m8adef.dat"
$crystal = 16000000

' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portc.1 , Db5 = Portc.2 , Db6 = Portc.3 , Db7 = Portc.4
Config Lcd = 16 * 2                                         ' тип используемого дисплея
Cursor Off
Cls
'настраиваем таймер в режим захвата по восходящему фронту
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
'-------------------------------------------------------------------------------------------------
Dim Scan As Word
Dim Moi_signal As Bit : Moi_signal = 0
Dim Bi As Bit
'--------------------------------------------------------------------------------------------------
Dim Count As Byte : Count = 1
Dim Nomer As Word
Dim Tds As Integer
Dim Tdht As Integer
Dim Hdht As Integer
Dim L As Word
Dim Crc_rx As Word
Dim X As Byte
'------------------------------------------------------------------------------------------
On Capture1 Zaxvat

Scan = 0
Waitms 50
Enable Interrupts
Enable Capture1
'**************************************************************************************************
Do

Locate 1 , 1
Lcd Scan ; "     " ; Nomer
Locate 2 , 1
Lcd Moi_signal

Loop
'**************************************************************************************************
'--------------------------------------------------------------------------------------------------
Zaxvat:
 Scan = Timer1                                              ' копируем значение таймера в переменную
 Timer1 = 0                                                 ' обнуляем таймер
 Gosub Posilka
Return
'-------------------------------------------------------------------------------------------------
Posilka:

 If Scan < 30 Then Return                                   'Сильно короткий, значит помеха выходим
 If Scan > 500 Then                                         'Слижком длинный, значит пауза между посылками
   Moi_signal = 0
   Scan = 0
   Return
 End If

 Select Case Scan
  Case 40 To 70                                             '62.5МС (1000мкС) значит 0
    Bi = 0
    Goto Zapis
    Incr Count
  Case 100 To 150                                           '125МС (2000мкС) значит 1
    Bi = 1
    Goto Zapis
    Incr Count
  Case 250 To 350                                           '312.5МС (5000мкС) значит сигнал опознования
    Count = 1
    Moi_signal = 1
 End Select
Return
'-----------------------------------------------------------------------------------------------------------
Zapis:

  If Moi_signal = 1 Then
    Select Case Count
      Case 1 To 16
        X = 16 - Count
        Nomer.count = Bi
      Case 17 To 32
        X = 32 - Count
        Tds.count = Bi
      Case 33 To 48
        X = 48 - Count
        Tdht.count = Bi
      Case 49 To 64
        X = 64 - Count
        Hdht.count = Bi
      Case 65 To 80
        X = 80 - Count
        L.count = Bi
      Case 81 To 96
        X = 96 - Count
        Crc_rx.count = Bi
    End Select
    If Count = 96 Then
     Count = 1
     Moi_signal = 0
  End If
 End If
Return
 End

Где ошибаюсь?
В железе набросаю. Но если ошибки в коде........ :tired:

0

105

Видимо что-то с "0" не так. Пердупреждал жеЖ  :D

0

106

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

Собрал передачу по USART.
...
Дальность на Китайских радиомодулях 30м. Вполне нормально. Скорость UART 2400бод. Бысрее начинают символы пропадать.

Что за радиомодули ?

0

107

Nord
Приемник TY-RXB22, передатчик впаян вниз надписью. Но они комплектом идут.
Накидал на железе, тоже самое. Где неладный сидит? Завтра заработает!!! Нечисть уйдет. Рождество всетаки)))

0

108

-NMi-
Здесь "0" ,  один. Перед Вами. :tomato:

0

109

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

NordПриемник TY-RXB22, передатчик впаян вниз надписью. Но они комплектом идут.

Наверняка что-то типа "парочки" FS1000A + XY-MK-5V...
Эта "парочка" славится шумом и неустойчивостью сигнала.
Плюс, как результат криворукого пофигизма сборщиков, требуют согласования антенн...
Было два комплекта, с каждым - пляски с бубном...
Вспоминаю их, как страшный сон... ;)

ТТХ, если есть, плиз в студию... ;)

0

110

Nord
Вы меня не поняли.
В данный момент ни каких радиопередачь не произходит. Два МК на прямую по проводу передают. Напутал в приеме. Где, не пойму.

0

111

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

Вы меня не поняли.В данный момент ни каких радиопередачь не произходит. Два МК на прямую по проводу передают.

Напрямую об этом сказано не было, оттого и непонятки... ;)

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

Напутал в приеме. Где, не пойму.

В таком случае, если МК связаны по USART, то зачем такая "игра" с длительностями ?
Или это эмуляция USART ?
Так на эту тему достаточно проверенных наработок...

0

112

Какой USART. Его мне Sergik предложил пол года назад. Вопрос почитай!

0

113

Просто читателям темы нерегнутым написал. Что передачу по радиоканалу с помощью USART закончил. Не плохо работает.

0

114

Nord
Тема начато про, что?
Первый вопрос кто читал?

0

115

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

Тема начато про, что?Первый вопрос кто читал?

Тема про передачу по радиоканалу... ;)

В последнем вопросе - устаканивайте длительности сигналов, учитывайте аппаратные задержки МК.
Даже выдерживание паузы в 200 тактов с использованием ассемблерных вставок требует не 200 повторений, а где-то 190...

0

116

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

0

117

Попробуйте для начала "урезать осетра"... ;)
Добейтесь устойчивого приема одного байта.
Сделайте отправку разных значений, но одного (!) байта.
Потом можно будет расширяться... ;)

0

118

Идет перадача битов. У меня их 96. Но это не важно. Прогамму скинул полную приема.
Не успевает МК отработать на приеме даже 3 бита. В своей пруге пробовал брать первые 4, и последние 4 БИТа.
Изчезают единицы. Вместо &b1111 получаю &b0011. Пробовал инверсно &b1111000000000000, получал &b1100000000000000.
Посылка, то идет непрерывным бинарным кодом. По осциллу передача нормуль. МК гдето ткнется на приеме.
Не успевает.
Почему это работает у людей? Реально, и четко. На PICах. Уже больше 10и лет.
Сколько не пытаюсь повторить, все тщетно. На форумах только сказки советуют. Или знаки минуса ставят.

0

119

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

Не успевает МК отработать на приеме даже 3 бита.

Попробовать увеличить ТЧ принимающей стороны.
Сделать коротюсенькие паузы у передатчика между отправляемыми битами.

На ум приходит аналогия с WS2812B... ;)
Там "0" и "1" кодируются соотношением 350нс+900нс (0) и 900нс+350нс(1)
Причем все 24 бита летят непрерывно и все успевают... ;)
Вот только МК приходится разгонять до 10МГц, а лучше до 16... ;)

0

120

http://s7.uploads.ru/t/lXNGz.jpg
Эти провода достали.
Черные, все датчики.

Отредактировано rom-i (2019-01-06 21:02:46)

0


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