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

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

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

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


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


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

Сообщений 61 страница 90 из 164

61

Вместо

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

If Принятый_символ <> 13 Then
     If Принятый_символ <> 10 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
   Else

Можно попроще

If Принятый_символ <> 13 And Принятый_символ <> 10 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)

Хотя... Дело хозяйское... ;)

0

62

Nord
Так писать нет смысла. Если в предыдущей строке мы не взяли 10, она достанется следующей строке. Строка будет начинаться с 10. Соответственно Else пустит тебе пустышку. Но все идет к лучшему. Если хотим забрать из буфера абсолютно все, тогда нужно игнорировать 13, а заканчивть прием 10. Вот самое правильное.
If Принятый_символ <> 10 Then
     If Принятый_символ <> 13 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
   Else
Не понимаю свой браузер Макстон. Иногда нормуль, но чаще всего не перетащить из Bascom кириллицу. Вместо букв знаки вопроса. Наоборот, такая же хрень. Комменты можно затереть. Но если переменные на кириллице, кранты. Пробовал черезь блокнот, тож самое.

0

63

rom-i
Языковой значек должен быть RU и в окне Bascom и в окне браузера.

0

64

pavel1969
Спасибо. Думаю, что понял. Действительно в браузере по умолчанию EN, а в Bascom, что придется. Вот, и получается. То нормально, то восклицаловки.

0

65

Для дальности передачи пришлось перейти на кварцованные контроллеры.
Передатчик ATtiny84a, 8mHz. Скорость передачи оставил 2400 бод. Для надежности. На жрачку аккума сильно не влияет.
Состав:
Темература 18в20
Температура, влажность DHT22
Вход АЦП контроль разряда батареи
Сон черезь павердовн 9мкА. Передача, раз в 5 минут.

Код:
$regfile = "attiny84.dat"
$crystal = 8000000
$hwstack = 160
$swstack = 160
$framesize = 64
'-------------------------  Настройка Watchdog  --------------------------------
  On Wdt Обработка_прерывания_watchdog                      ' Nosave       ' Переход на подпрограмму обработки прерывания после переполнения таймера-счётчика Watchdog
  Config Watchdog = 1024                                    'время срабатывания ~1сек., при соответствии $crystal и фьюзов МК      ' 16   32   64   128   256   512   1024   2048   4096   8192

'=======Подключаем DHT22===============================================================================
Config Pina.2 = Input
Dht_get1 Alias Pina.2
'===============================================================================
Config Porta.1 = Output
Pitanie Alias Porta.1
'===============================================================================
 Dim Sch As Byte
 Dim Secunda As Word
 Dim Sinhr As Byte : Sinhr = &B10101010
 Dim Albyte As String * 18
 Dim Id As String * 4 : Id = "1550"
 Dim L As Word
 Dim L_str As String * 3
'========Переменные 1 датчика 18В20====================================================================================================
 Dim Tds1 As Integer                                        'температура получаемая с 1 датчика в 0.1градуса. 10 = 1,0 градус
 Dim Tds1_str As String * 4
 Dim Err_c1 As Bit
'======переменные для работы датчиков DHT22=========================================================================
Const Min_time = 3
Dim Count As Byte
Dim D As Byte
Dim Hb(5) As Byte                                           '$337 Overlay                           '$11d Overlay
Dim Kod As Dword At Hb + 1 Overlay                          '$338                                    '$11e
Dim Hu(2) As Word At Kod Overlay
Dim Chs As Byte

Dim Tdht1 As Integer                                        'переменная для хранения температуры С.1
Dim Hdht1 As Integer                                        'переменная для хранения влажности   С.1
Dim Tdht1_str As String * 5                                 'дисплейные
Dim Hdht1_str As String * 4

Declare Sub Dht22
Declare Sub Read_timings1
'========конфигурируем АЦП===========================================================
  Config Adc = Single , Prescaler = Auto , Reference = Internal
'===============================================================================
  Enable Wdt                                                ' Разрешаем прерывание от переполнения таймера Watchdog
  Enable Interrupts
'===============================================================================
 Главный_цикл:

  If Secunda = 300 Then
    Pitanie = 0
  Adcsra.aden = 1                                           'Включаем АЦП
  Open "coma.3:2400,8,n,1" For Output As #1
    Waitms 100
    L = Getadc(0)                                           'считываем третий канал АЦП и записываем в переменную
'    L = L - 1
    L_str = Str(l)
    L_str = Format(l_str , "000")
    Gosub 18b20
    Gosub Dht22
   Albyte = Id + Tds1_str + Tdht1_str + Hdht1_str + L_str

   For Sch = 0 To 3
      Waitms 50
      Printbin #1 , Sinhr
      Print #1 , Albyte
   Next Sch
     Waitms 50
   Config Porta.3 = Output : Porta.3 = 0                    'Перевод порта для понижения энергопотребления
   Adcsra.aden = 0
     Pitanie = 1
     Waitms 10
     Secunda = 0
   End If

   Powerdown
  Goto Главный_цикл
 End
'===============================================================================
  Обработка_прерывания_watchdog:
      Incr Secunda
  Return
'===============================================================================
'======Обработка датчика температуры DS18B20====================================
18b20:
   1wreset Pina , 5
   If Err = 1 Then
         Err_c1 = 1                                         'ставим флаг ошибки датчика
         Tds1 = 32767                                       'если при опросе небыло ответа ставим флаг ошибки
      Else
         Err_c1 = 0
         1wwrite &HCC , 1 , Pina , 5                        'пропуск ROM(для всех)
         1wwrite &H44 , 1 , Pina , 5                        'конвертировать температуру(для всех)
   End If

     Waitms 750
                                                            'если небыло ошибки при начале конвертирования
   If Err_c1 = 0 Then
      1wreset Pina , 5
      If Err = 1 Then
            Tds1 = 32767                                    'если при опросе небыло ответа ставим флаг ошибки
          Else                                              'иначе, если ошибки не было, продолжаем опрос датчика
            1wwrite &HCC , 1 , Pina , 5
            1wwrite &HBE , 1 , Pina , 5
            Tds1 = 1wread(2 , Pina , 5)
            Tds1 = Tds1 * 10
            Tds1 = Tds1 \ 16
      End If
       Tds1_str = Str(tds1)
       Tds1_str = Format(tds1_str , "+000")
      Else
       Tds1 = 32767
       Tds1_str = "8888"
   End If
 Return
'===============================================================================
Sub Dht22:
   Gosub Read_timings1                                      'DHT22 Порт C1
   Chs = Hb(2) + Hb(3)                                      'считаем контрольную сумму
   Chs = Chs + Hb(4)
   Chs = Chs + Hb(5)
     If Chs = Hb(1) And Chs > 0 Then                        'определяем знак температуры
'     If Chs = Hb(1) Then                                    'определяем знак температуры
      Tdht1 = Hu(1)
      Hdht1 = Hu(2)
      If Hu(1).15 = 1 Then
            Tdht1 = 32768 + Tdht1
            Tdht1 = 0 - Tdht1
      End If
      Tdht1_str = Str(tdht1)
      Tdht1_str = Format(tdht1_str , "+000")
      Hdht1_str = Str(hdht1)
      Hdht1_str = Format(hdht1_str , "000")
   Else
      Tdht1 = 32767
      Tdht1_str = "8888"
      Hdht1_str = "888"
   End If
End Sub

Sub Read_timings1:                                          'опрос DHT22 порт C1
   Local Y As Byte
   Count = 1
   Kod = 0
   Hb(1) = 0
   Config Porta.2 = Output : Porta.2 = 0                    ' request data
   Waitms 20                                                ' wait 20 ms
   Config Pina.2 = Input                                    ' wait for data, receive data
   Waitus 40
'    Waitus 30
   If Dht_get1 = 0 Then
      Bitwait Pina.2 , Reset
     While Count < 42                                       '
        Y = Count - 1                                       '
        Y = 40 - Y
         Pulsein D , Pina , 2 , 1
         If D > Min_time Then Toggle Hb(1).y
         Incr Count
      Wend
   End If
   Waitms 50
End Sub

Приемник решил сделать на ATtiny25.

Код:
$regfile = "Attiny25.dat"
$crystal = 8000000
'===============================================================================
Open "comb.0:2400,8,n,1" For Input As #1
Open "comb.1:9600,8,n,1" For Output As #2
'===============================================================================
'Config Serialin = Buffered , Size = 60
Led Alias Portb.2 : Config Led = Output
'===============================================================================
'===============================================================================
 Dim Sinhr As Byte
 Dim Dat_in As String * 18
 Dim Id As String * 4
 Dim Temper As String * 4
'===============================================================================

'*******************************************************************************
Do
  Waitms 75

   Strt:
    Gosub Kodin
     Id = Left(dat_in , 4)
  If Id = "1550" Then
     Temper = Mid(dat_in , 5 , 14)
     Print #2 , Temper
   Led = 1
     Waitms 10
   Else
     Waitms 10
     Dat_in = ""
    Goto Strt
  End If
  Led = 0
  Loop
End
'===============================================================================
Kodin:
   Inputbin #1 , Sinhr
   Input #1 , Dat_in Noecho
Return
'=============================================================================

Дальше мона мулить к чему хочешь.
Для питания периферии использую р-канал половик. По этому "0" управление.

Отредактировано rom-i (2018-10-26 21:08:29)

0

66

rom-i
Сталкивался с тем,что иногда не вся посылка доходит  в первозданном виде.Например,ID принимает нормально,температура нормально,а время 55 часов 88 минут,или другие варианты с поломкой данных.Чем длиннее строка,тем больше  вероятность порчи.Пришлось добавлять контрольную сумму в передачу и при приёме сравнивать с вычисленной.Только после этого всё чётко.Если ещё не столкнулись с подобным,возможно всё ещё впереди)

0

67

Sergik07
Тоже столкнулся с этим когда длинную строку начал передавать. В конце такой фарш, что переменные переполнятся начали. Основной МК просто вешался. С кварцами нормально стало. Но думаю все равно не надежно. Реальных условий конструкция еще не видела.
Вот, и начал эту тему. Думал кто подскажет как ШИМ на Баском принимать. У Бороды все работает. Дальность приличная.

0

68

Добрый день! Не стал открывать новую тему. Решил задать вопрос тут. Экспериментирую с 433Мгц модулями. Вроде передача и прием есть.Только ума ни приложу как  строковую переменную , которая получается на выходе,  перевести в десятичную(например:у меня получается Bin_kod="00000110"(String*8) , а как получить из нее 6?) 

Прием 6-ки на осциллографе:
http://s5.uploads.ru/t/JSmhc.jpg
передача:

Код:
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
Dim Raz As Byte , Timer0pre As Byte , I As Byte , Z As Byte
Dim Razrad As String * 2
Dim Stroka_binkod As String * 8
Config Timer0 = Timer , Prescale = 8
Enable Timer0
Stop Timer0
Timer0 = Timer0pre
Start Timer0
On Timer0 Pulse
Enable Interrupts
Config Portb.2 = Output
'*******************Тело программы**********************************************                                                \
Do
   Incr I                                                   'отправляем от 1 до 8 (для проверки)
   Stroka_binkod = Bin(i)                                   'перводим в бинарный
   Timer0pre = 220 : Waitms 3                               'отправим пакет , чтобы  приемник был готов к приему
   Timer0pre = 100 : Waitms 3                               'берем по очереди каждый бит в байте
   For Z = 1 To 8
      Razrad = Mid(stroka_binkod , Z , 1)
      Raz = Val(razrad)
      If Raz = 1 Then Timer0pre = 200 : Waitms 3
      If Raz = 0 Then Timer0pre = 180 : Waitms 3
      If Z < 8 Then
         Timer0pre = 100 : Waitms 3
      End If
   Next Z
   Stop Timer0 : Portb.2 = 0
   Waitms 100
   Timer0 = 0 : Start Timer0
   If I = 9 Then I = 0
Loop
End
'*******************************************************************************

Pulse:
   Stop Timer0
   Timer0 = Timer0pre
   Toggle Portb.2
   Start Timer0
Return


прием:

Код:
$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 200
'----------------------------------------------------------------
Dim Flag_dalshe As Boolean
Dim Bid_paketa As Byte , Razdelitel As Byte
Dim Imp As Word , Count As Word
Dim Bit_vbaite As String * 1
Dim Bin_kod As String * 8
Config Timer1 = Timer , Prescale = 1
Config Portb.0 = Input
Enable Interrupts
Enable Capture1
Enable Timer1
Start Timer1
On Capture1 Pulsе
'-------------------------------------------------------------------------------
Do
  If Imp > 714 And Imp < 735 Then Flag_dalshe = 1
   If Flag_dalshe = 1 Then
      If Imp > 2664 And Imp < 2687 Then Incr Razdelitel
      If Imp > 1030 And Imp < 1050 Then Bit_vbaite = "1"
      If Imp > 1350 And Imp < 1375 Then Bit_vbaite = "0"
      If Razdelitel = 8 Then Razdelitel = 0 : Flag_dalshe = 0
      Bin_kod = Bin_kod + Bit_vbaite                                            
   End If
Loop
End
'--------------------Подпрограмма захвата -------------------------
Pulsе:
   Imp = Timer1                                             'При прерывании Timer1 берем значение  Timer1
   Timer1 = 0
Return

Отредактировано Niya (2018-11-11 22:16:34)

0

69

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

Добрый день!

У кого как... ;)

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

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

Оператор ASC покопайте... ;)
Правда, работает только с одним байтом.

С каким р/м работа ?

Отредактировано Nord (2018-11-11 22:30:07)

0

70

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

С каким р/м работа ?

Вот эти:
http://sd.uploads.ru/t/zLWm6.jpg

0

71

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

например:у меня получается Bin_kod="00000110"(String*8) , а как получить из нее 6?

Для данного варианта - банальный перевод позиции в строке в бит.

For a = 1 To 8
b = a - 1
If Mid(Bin_kod, a, 1) = "0" Then nomer.b = 0
If Mid(Bin_kod, a, 1) = "1" Then nomer.b = 1
Next a

UPD
Исправлены очепятки в коде... ;)

Отредактировано Nord (2018-11-11 23:01:20)

0

72

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

Вот эти

Ой, какашка, намучался с ними (без обид)... ;)
Перешёл на HC-12 - в порядок удобнее.

0

73

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

Для данного варианта - банальный перевод позиции в строке в бит.

Получается, что на выходе у меня будет число в десятичной в форме с 8 разрядами ?

0

74

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

Nord написал(а):
Для данного варианта - банальный перевод позиции в строке в бит.

Получается, что на выходе у меня будет число в десятичной в форме с 8 разрядами ?

Что-то я туплю :) ..Взять и просто перевести двоичное число в десятичное ,по определению

0

75

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

Что-то я туплю  ..Взять и просто перевести двоичное число в десятичное ,по определению

Только бяка в том, что изначально полученное значение - далеко не в BIN, а в STRING... ;)
Посему - не "двоичное - в десятичное", а "двоичное значение, представленное в строковом формате - в десятичное"

0

76

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

Только бяка в том, что изначально полученное значение - далеко не в BIN, а в STRING...
Посему - не "двоичное - в десятичное", а "двоичное значение, представленное в строковом формате - в десятичное"

Это понятно. Реализовал в таком виде,  справляется

Код:
Perevesti_binkod:
   For Z = 8 To 1 Step - 1
      B = 8 - Z
      If Mid(bin_kod , Z , 1) = "0" Then Raz = 0
      If Mid(bin_kod , Z , 1) = "1" Then Raz = 1
      Chislo_temp = 2 ^ B
      Chislo_temp = Raz * Chislo_temp
      Chislo = Chislo + Chislo_temp
   Next Z

0

77

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

Реализовал в таком виде,  справляется
Perevesti_binkod:
   For Z = 8 To 1 Step - 1
      B = 8 - Z
      If Mid(bin_kod , Z , 1) = "0" Then Raz = 0
      If Mid(bin_kod , Z , 1) = "1" Then Raz = 1
      Chislo_temp = 2 ^ B
      Chislo_temp = Raz * Chislo_temp
      Chislo = Chislo + Chislo_temp
   Next Z

Не совсем понятна арифметика (выделено)...
Все решаемо Raz.B...

Но, если вам так удобнее, не настаиваю.

0

78

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

Обработка_прерывания_watchdog:
      Incr Secunda
  Return

Интересно..после того, как  watchdog сделает аппаратный сброс МК переменная Secunda где сохранится, чтобы при следуещем срабатвании  увеличить на единицу? Получается, что после каждого сброса Secunda станет =0, а при срабатывании  Watchdog  станет =1.. и так без конца .  Разве не так?

0

79

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

Интересно..после того, как  watchdog сделает аппаратный сброс МК переменная Secunda где сохранится...

Не факт, что сброс произойдет, смотря как WDT настроить...
Перевод из ДШ ATtiny13:

В режиме прерывания WDT дает прерывание по истечении таймера. Это прерывание можно использовать для пробуждения устройства из режимов ожидания, а также в качестве общего системного таймера. Одним из примеров является ограничение максимального времени, разрешенного для определенных операций, что дает прерывание, когда операция работает дольше, чем ожидалось. В режиме сброса системы WDT дает сброс, когда истекает время таймера. Обычно это используется для предотвращения зависания системы в случае кода убегания. Третий режим, режим прерывания и сброса системы объединяет два других режима, сначала передавая прерывание, а затем переключается в режим сброса системы. Этот режим, например, позволит безопасное выключение, сохраняя критические параметры перед сбросом системы.

Отредактировано Nord (2018-11-14 23:21:33)

0

80

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

Не факт, что сброс произойдет, смотря как WDT настроить...

Прочитал Datasheet Attiny24( стр.45)
Там написано:"If WDE is set, WDIE is automatically cleared by hardware when a time-out occurs. This is usefulfor keeping the Watchdog Reset security while using the interrupt. After the WDIE bit is cleared, the next time-out will generate a reset. To avoid the Watchdog Reset, WDIE must be set aftereach interrupt."

Можно, но  для этого надо в регистре WDTCR ,после срабатывания Watcdog, в бит WDIE записать 1. Иначе он автоматически очищается и происходит сброс. Но в вышеизложенном коде нет таких команд.

0

81

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

Прочитал Datasheet Attiny24( стр.45)

Почитайте более глобально (без обид)... ;)
Таблица на стр.47 не наводит на размышления ? ;)
WDT имеет в подавляющем большинстве МК AVR минимум два режима работы.

Отредактировано Nord (2018-11-16 21:43:28)

0

82

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

Почитайте более глобально (без обид)...

Что тут обижаться , форум для этого служит..Чтобы более подготовленные товорищи направляли менее подготовленных в правильном направлении

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

Таблица на стр.47 не наводит на размышления ?

Так я об этой таблице и писал. Вы о 6-ом бите WDIE ? Там буквально написано:

If WDE is set, WDIE is automatically cleared by hardware when a time-out occurs.
Если  WDE установлен,то WDIE автоматически очищается по переполнению таймера.

To avoid the Watchdog Reset, WDIE must be set after each interrupt.
Чтобы избежать сброса сторожевого таймера, WDIE должен быть установлен после каждое прерывания.

А там по умолчанию установлена конфигурация из  2-ой или 4-ой строки? Или 3-й из таблицы ,где WDE=1, WDIE=0. И действие по переполнению Reset, а не Interrup?

Отредактировано Niya (2018-11-17 09:58:04)

0

83

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

Так я об этой таблице и писал. Вы о 6-ом бите WDIE ?

Этот бит там не один... ;)
Поднимитесь выше по ДШ и почитайте про используемые прерывания в МК.
Пазлы начнут складываться... ;)

Как устанавливается "по умолчанию" - не вдавался. ;)

0

84

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

Этот бит там не один...

Именно только этот бит и отвечает за разрешения вызова прерываний от сторожевого таймера,  Если он = 0, то никаких вызовов прерываний от сторожевего таймера не будет. Если WDIE =1 и установлен I бит регистра SREG, то прерывание от Watchdog разрешается. Тут возможны 2 вараинта в зависимости от бита WDE.
WDE=0 - вызов прерывания,
WDE=1-вызов прерывания и переход к режиму системного сброса.

Читаем у Белова А.В.(Микроконтроллеры AVR):"Если при помощи fuse установить WDTON=enable.....то срабатывание всегда вызывает сброс системы....и WDE, бит режимного прерывания и WDIE приобретают фиксрованные значения 1 и 0 соответственно"- стр.389
Т.е по умолчанию  WDE=1,  WDIE=0.
"Для того, чтобы таймер постоянно оставался в режиме прерывания необходимо устанавливать этот режим программным путем после каждого прерывания"- стр.391

Хорошо, пройдемся по коду:

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

Config Watchdog = 1024

Вот тут установлены биты WDP3-WDP0 регистра WDTCR,коэффициент предделителя

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

Enable Wdt                                                ' Разрешаем прерывание от переполнения таймера Watchdog
  Enable Interrupts

Тут первая строка устанавливается бит WDE в регистре WDTCR
Следующая строка устанавливает I бит регистра SREG

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

Обработка_прерывания_watchdog:
      Incr Secunda
  Return


Подпрограмма прерывание, где  изменился бит WDRF регистра MCUSR (соответственно и WDE, потому что он дублирует WDRF )

После просыпания: WDE=1, WDIE=0- получили обратно режим работы "Системный сброс"

Где в этом коде изменение  битов WDCE(чтобы разрешить сделать WDE=0),WDE, WDIE, чтобы получить режим: 
1)  WDE=0 ,WDIE=1 - "Режим прерывания";
1) WDE=1, WDIE=1 - "Режим прерывания и сброс".

ЗЫ:с этой темой  плотно столкнулся  когда некоторый товарищ уверял, что у него  по этой же схеме Attiny13 просыпается и каждые 30 минут передает данные .Но практика показывала шишу..))

Отредактировано Niya (2018-11-17 20:22:07)

0

85

Читаем глубже... ;)
Раздел даташита 8.4 Watchdog Timer:

The Wathdog Timer can also be configured to generate an interrupt instead of a reset. This can be very helpful when using the Watchdog to wake-up from Power-down.
To prevent unintentional disabling of the Watchdog or unintentional change of time-out period, two different safety levels are selected by the fuse WDTON as shown in Table 8-1

Перевод:

Таймер Wathdog также можно настроить для генерации прерывания вместо сброса. Это может быть очень полезно при использовании Watchdog для пробуждения от Power-down.
Чтобы предотвратить непреднамеренное отключение сторожевого таймера или непреднамеренное изменение тайм-аута, два предохранительных уровня выбираются предохранителем (фьюзом) WDTON, как показано в таблице 8-1.


Вывод: при прошивке выключить WDTON и WDT будет выдавать только прерывание, без сброса, о чем Белов А.В. и пишет...
Про установки фьюзов не звучало, отсюда и непонятки... ;)

Отредактировано Nord (2018-11-17 23:32:58)

0

86

Niya
У Тиник есть очень хорошее преимущество. Не моя задумка, нашел в инете.
На самом деле WDT отключен фьюзами, или проще не включен(не выполняет роль перезапуска МК). Работает как таймер в режиме Powerdown. Жрачька при этом от аккума 3.7В, порядка 7мкА. Пробовал реализовать это на Мегах, не получилось. Даже компилятор это не берет. На разных Тиньках прекрасно работает.

0

87

Не хочу начинать новую тему, на этой уже затронули прием по захвату TIMER1(ICP1). Как раз нужно реализовать измерение частоты. Индикатор напряженности поля + частотомер. Готовые есть, но они готовые, и не на Баском. Индикатор представляет измерение напряжения на входе АЦП. Индикация в виде шкалы, и цыфры в виде процентов. Это делал раньше. Решил доработать. Шкала набиралась столбиками на ЛСД 16Х2. 5 столбиков в символе х 16 символов. 80 черточек. Переписал по точкам. Использую в шкале все 8х5 точек в символе х 16, все 640 точек строки. Это все работает.
Суть вопроса. Начал разбираться с (ICP1), в Меге8 (PB0). Частоту считает, но находится в постоянном прерывании(захват сигнала). Пробовал делать Disable Capture1, программа стоит на стопе. Ждет измерения по входу (ICP1). Как можно реализовать дополнением к программе(в моем случае измерение АЦП)?
Второй вопрос. Есть еще один порт (Т0). В Меге8 это (PD4). Что можно с ним делать? Тоже какойто счетчик но с TIMER0. В инет на Баском ничего не нашел.(((

0

88

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

Частоту считает, но находится в постоянном прерывании(захват сигнала).

Можно посадить на прерывание. И по прерыванию запустить захват. У меня метеостанция(измеряет направление и скорость ветра)  есть сделанная по этому принципу. Сейчас не смогу, завтра скину исходник. Может наковыряешь что-нибудь :)

0

89

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

Как можно реализовать дополнением к программе(в моем случае измерение АЦП)?

Снять с германиевого диода сигнал , усилить до стандартного значения , измерить .

0

90

Нарыл как пользоваться счетчиками 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


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