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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Mерцание индикаторов при опросе DS1820


Mерцание индикаторов при опросе DS1820

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

1

Всем доброго времени суток.Ребят помогите разобратся с такой проблемой делаю знакомому светодиодные часы с отображением часов минут даты месяца года и температуры , с часами все в порядке , нормально работают , но стоит начать опрос датчка температуры , сразу начинается мерцание всех индикаторов, как только не пробовал ничего не получается. стоит добавить
1wreset
1wwrite &HCC
1wwrite &H44
и все индикаторы мерцают. Подскажите может чтото не так сделал или еще в чем-то может проблема.
P.S. за листинг сильно не пинайте , делаю как могу)))) Вот проект , и небольшой набросок в протеусе , хоть и не работает , но я в нем смотрю ход программы.проект
читал по тому поводу , даже соберал одну схемку , но там все тоже самое , хотя автор утверждал что все норм.
фьюзы выставлены кстати так фьюзы может тут проблемма?

Отредактировано ptihka (2013-08-01 23:06:39)

0

2

Жесть!
Других слов нет. Всё перевёрнуто с ног на голову.
1. Пытаетесь использовать аппаратный и софт I2C вместе.
2. По таймеру нужно делать индикацию, а  опрос датчика
в основном цикле а не наоборот.
Это как минимум. Да и датчик достаточно опрашивать раз
в несколько секунд.

+1

3

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

1. Пытаетесь использовать аппаратный и софт I2C вместе.

это почему? Объясните ели не трудно.

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

2. По таймеру нужно делать индикацию, а  опрос датчика
в основном цикле а не наоборот.
Это как минимум. Да и датчик достаточно опрашивать раз
в несколько секунд.

у меня датчик опрашивается и так раз в 20 секунд где-то , разве нет?
а по поводу индикации пробовал разные варианты :
1-индикация по таймеру опрос датчика в основном цикле
2-индикация по таймеру , опрос датчика по этому же таймеру
3- индикация по таймеру , опрос датчика по второму таймеру
4-опрос датчика в основном цикле , индикация основной цикл
самый лучший вариант вот так как в листинге на данный момент, датчики менял , схему перепроверял все в порядке.
по поводу опроса датчика, стоит вписать только опрос шины 1-wipe , без всяких преобразований , и все начинает моргать.

0

4

По схеме SCL  сидит на PC3  а должен на PC5.
Хотя указана аппаратная библиотека.
И приоритет отдан именно датчику.
И откуда 20 секунд, при таких параметрах чуть больше 8.
У датчика время преобразования 12 бит(по умолчанию),
это 750мсек. При этом МК тупо сидит в прерывании эти 750мсек.
Отсюда и мигания.

0

5

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

У датчика время преобразования 12 бит(по умолчанию),
это 750мсек. При этом МК тупо сидит в прерывании эти 750мсек.
Отсюда и мигания.

Я читал вот эту тему Ссылка там вы тоже советовали уменьшить разрядность в 10 посту , но я так и не понял как это сделать, и пробовал соберать схему в 14 посту (ситуация таже мерцание никуда в этой схеме не деваются), если не трудно не могли бы показать как уменьшить разрядность програмно? А по поводу I2C протокола , если я не использую ноги МК  SCL и SDA которые подписаны на МК , а беру другие , то можно не подключать библиотеку $lib "ds1307clock.lib" , я вас правельно понял? Просто наталкивался много раз , что лучше не использовать аппаратный I2C , что он типо глючит.

0

6

Может у "хороших танцоров"аппаратный I2C и глючит,
а у остальных нормально.
При софт I2C библиотека не нужна.

Config Sda = Portb.5
Config Scl = Portb.7
I2cinit
CONFIG CLOCK = soft

И если посмотреть пост 13, я там всё указал.

Отредактировано alex_r61 (2013-08-02 03:20:23)

0

7

Поправил код, все-таки наверно проблема было в том что я задействовал для апаратного I2C библиотеку , и из за этого был конфликт с датчиком , он же висел на ножке I2C . Только вот проблема теперь в том , что температура иногда отображается 00 или вылазит какая то другая цифра , из за чего это может быть? И как это исправить. И еще опрос , я использовал таймер1 поэтому в его регистр записаю Timer1pre = 57000 иначе если он считает от 0 и от этого появляется мерцание , все это потому что на таймере0 температура выводится вообще коряво , я где то читал , на форуме , что датчик работает по таймер0 вот и происходят конфликты. Или это опять все не правда и просто тут мой косяк опять в чем то.

переделанный код

$regfile = "m8def.dat"
$crystal = 8000000
'----------------------

Const Ds1307w = &HD0
Const Ds1307r = &HD1
'----------------------
Ddrb = &B01111000
Config Portc = Input
Config Portd = Output
'----------------------
Config Sda = Portc.4
Config Scl = Portc.3
I2cinit
Config Clock = Soft
'----------------------
Mplus Alias Pinb.1                                          'êíîïêè
Hplus Alias Pinb.2
Spius Alias Pinb.3
'-------------------
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Dat As Byte
Dim Month As Byte
Dim Year As Byte
'----------------------
Dim Blink_flag(14) As Byte
Dim Wert As Integer
Dim O As Integer
'----------------
Dim Mass(12) As Integer
Dim S As Integer
Dim X As Byte
Dim Z As Integer
Dim H1 As Integer
Dim H2 As Integer
Dim B As Integer
Dim W As Integer
Dim M As Integer
Dim L As Integer
Dim Vb As Integer
Dim V As Integer
Dim Vd As Integer
''------------------
Dim Dig As Integer
Dim Mods As Integer
Dim Roo As Integer
Vd = 990
Z = 1
L = 1
'===========================================
Config 1wire = Portc.5
'++++++++++++++++++++++++++
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Byte
Dim T2 As Byte
Dim Temperatura As Byte
'===========================================
Config Timer1 = Timer , Prescale = 1
Const Timer1pre = 57000
On Timer1 Puls:
Enable Interrupts
Enable Timer1
'*******************************************
'===========================================
Do
If Mplus = 0 Then Gosub Setup
If Hplus = 0 Then Gosub Plus
'-------------------------
'*******************************
'============================

I2cstart                                                    '÷òåíèå äàííûõ ÷àñîâ
I2cwbyte Ds1307w
I2cwbyte &H00
I2cstart
I2cwbyte Ds1307r
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Ack
I2crbyte Day , Ack
I2crbyte Dat , Ack
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop

'------------------------
Mine = Makedec(mine)
Hour = Makedec(hour)
Dat = Makedec(dat)
Month = Makedec(month)
Year = Makedec(year)
'------------------------
If Mplus = 0 Then Gosub Setup
If Hplus = 0 Then Gosub Plus
'''-------------

If Z > 12 Then Z = 1                                        'çàíîñèì äàííûå ÷àñîâ â ìàññèâ
  If S = 6 Then S = 0
  If S = 2 Then W = Dat
  If S = 3 Then W = Month
  If S = 4 Then W = Year
  If S = 5 Then W = Temperatura
  If S = 1 Then W = Mine
  If S = 0 Then W = Hour
'-------------------------------
H2 = W Mod 10
Mass(z) = H2
Z = Z + 1
B = W - H2
H1 = B / 10
Mass(z) = H1
Z = Z + 1
B = B Mod 10
S = S + 1
'=============================

'------------------------------
If Mplus = 0 Then Gosub Setup
If Hplus = 0 Then Gosub Plus
'------------------
If Vd = 1000 Then
1wreset
1wwrite &HCC
1wwrite &H44

Waitms 750

1wreset
1wwrite &HCC
1wwrite &HBE

Byte0 = 1wread()

Byte1 = 1wread()

If Byte1 >= 248 Then

Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"

Else
Signtemperatura = "+"
End If

T1 = Byte0 / 16
T2 = Byte1 * 16

Temperatura = T1 + T2

If Signtemperatura = "-" Then
T1 = T1 + 1
End If

If Signtemperatura = "+" And T1 = 0 Then
Signtemperatura = " "
End If

Vd = 0
Else
Incr Vd
End If

'***************************************

'*****************

Loop
'---------------------------------------

Puls:

    If L = 13 Then L = 1                                    ' âûâîä íà èíäèêàòîðû
'----------------------------------
Incr V : If V > 12 Then V = 1                               'ìåðöàíèå èíäèêàòîðàìè , åñëè íóæíî
Incr Wert : If Wert > 600 Then Wert = 1
'----------------------------------------
         Decr L
If Blink_flag(v) = 1 And Wert > 300 Then
   X = Lookup(15 , Ind1)
Else

   X = Lookup(l , Ind1)
End If

   Shiftout Portd.6 , Portb.0 , X , 1
'-----------------------------------
If Blink_flag(v) = 1 And Wert > 300 Then
   X = Lookup(15 , Ind1)
Else
   X = Lookup(l , Ind2)
End If
   Shiftout Portd.6 , Portb.0 , X , 1
'-----------------------------------
          Incr L
   M = Mass(l)
   X = Lookup(m , Look)
Shiftout Portd.6 , Portb.0 , X , 1
          Incr L
Pulseout Portd , 7 , 5
Timer1 = Timer1pre
Return
'---------------------------------------
Setup:
If Vb > 600 Then                                            'âûáîð çíà÷åíèÿ êîòîðîå áóäåì íàñòðàèâàòü
   Incr O : If O > 12 Then O = 0                            'ìåðöàíèå èíäèêàòîðîâ ÷àñû,ìèíóòû è ò.ä.
   If Blink_flag(o) = 0 Then
Blink_flag(o) = 1
        Incr O
Blink_flag(o) = 1
        Decr O
Else
Blink_flag(o) = 0
        Decr O
Blink_flag(o) = 0
        Incr O
        Incr O
Blink_flag(o) = 1
        Incr O
Blink_flag(o) = 1
        Decr O
   Vb = 0
If Blink_flag(11) = 1 And Blink_flag(12) = 1 Then Blink_flag(11) = 0 : Blink_flag(12) = 0 : Blink_flag(13) = 0
  End If
Else
        Incr Vb
End If
Return
'-------------------------
Plus:
If Vb > 600 Then                                            'êíîïêà äîáàâëåíèÿ çíà÷åíèÿ ÷àñû ìèíóòû è ò.ä
                                                            'åñëè ìèãàþò èíäèêàòîðû
If Blink_flag(1) = 1 And Blink_flag(2) = 1 Then
Dig = 23
Mods = Hour
Roo = 2
End If
If Blink_flag(3) = 1 And Blink_flag(4) = 1 Then
Dig = 59
Mods = Mine
Roo = 1
End If

If Blink_flag(5) = 1 And Blink_flag(6) = 1 Then
Dig = 31
Mods = Dat
Roo = 4
End If
If Blink_flag(7) = 1 And Blink_flag(8) = 1 Then
Dig = 11
Mods = Month
Roo = 5
End If
If Blink_flag(9) = 1 And Blink_flag(10) = 1 Then
Dig = 30
Mods = Year
Roo = 6
End If
   If Blink_flag(1) = 1 Or Blink_flag(3) = 1 Or Blink_flag(5) = 1 Or Blink_flag(7) = 1 Or Blink_flag(9) = 1 Then
   Incr Mods : If Mods > Dig Then Mods = 0
        Mods = Makebcd(mods)
I2cstart
I2cwbyte &HD0
I2cwbyte Roo
I2cwbyte Mods
I2cstop
Mods = Makedec(mods)
      Vb = 0
Else

End If
Else
      Incr Vb
End If
Return

'áëîê äàííûõ 1234567890
Look:
Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 , &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001
'áëîê äàííûõ èíäèêàòîðîâ
Ind1:
Data &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111110 , &B11111101 , &B11111011 , &B11110111 , &B11101111 , &B11011111 , &B10111111 , &B11111111
Ind2:
Data &B11111110 , &B11111101 , &B11111011 , &B11110111 , &B11101111 , &B11011111 , &B10111111 , &B01111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111 , &B11111111

0

8

Нужно проверять контрольную сумму, чтобы не было 00 или других каких цифр :))

Код:
Sc(1) = 1wread(9)                            'Читаем байты из массива
               If Sc(9) = Crc8(sc(1) , 8) Then              'Проверка контрольной суммы
                  Byte0 = Sc(1)                             'Читаем нулевой байт
                  Byte1 = Sc(2)                             'Читаем первый байт
                    If Byte1 >= 248 Then                    ' Проверка на отрицательность температуры
                     Byte0 = &H100 - Byte0
                     Byte1 = &HFF - Byte1
                     Znak = "-"
                    Else
                     Znak = "+"
                    End If
               End If

+1

9

Те же грабли, вид сбоку.
Код в прерывании должен быть как можно короче, работайте через флаги.
Задействуйте вывод SOUT часов, задайте на этом выводе секундные импульсы
и разложите всё по полочкам. Раз в секунду считывайте с часов только секунды
и если ноль читайте остальное. Обращение к датчику так же разделите.
В первую секунду дайте команду на преобразование, в следующую - чтение,
в третью - обработка результата, и так по циклу.

Отредактировано alex_r61 (2013-08-02 18:06:11)

+1

10

radan спасибо ваш код помог , alex_r61 и вам огромное спасибо , за ценные советы, учту все что вы сказали, в следующий раз буду стараться сократить код , но пока учусь , делаю как могу , научусь потихоньку , ну не все же сразу))))).

0

11

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

If Byte1 >= 248 Then                    ' Проверка на отрицательность температуры
                     Byte0 = &H100 - Byte0
                     Byte1 = &HFF - Byte1
                     Znak = "-"
                    Else
                     Znak = "+"
                    End If
               End If

При таком расчете, погрешность составляет 0,1 градуса в отрицательном диапазоне температур.


Без погрешности:

        If Byte1 > 248 Then                       'Проверка на отрицательность температуры
            Byte0 = &H101 - Byte0
            Byte1 = &HFF - Byte1
            Znak_temperatura = "-"                'Знак "-"
          Else
            Znak_temperatura = " "                'Вместо знака "+", ставим пробел
        End If

Отредактировано sasha_1973 (2013-08-06 07:06:46)

0

12

1wreset
1wwrite &HCC                                 конфигурация датчика
1wwrite &H4E
1wwrite &HFF
1wwrite &HFF
1wwrite &H00
1wreset
1wwrite &HCC
1wwrite &H48
1wreset
1wwrite &HCC                           опрос датчика
1wwrite &H44
Waitms 500                               в моем случае было 500,а на самом деле там менее 100   хватит                       
1wreset
1wwrite &HCC
1wwrite &HBE

Вот кусок кода для уменьшения разрядности,долго искал,но так и не смог найти,пришлось курить самому.

0

13

Программирование Ds18b20, проверено в железе.

'=================================================
'                              Программирование датчика ds18b20
' Запись разрядности (1F - 9 бит, 3F - 10 бит, 5F - 11 бит, 7F - 12 бит) в ПЗУ датчика Ds18b20
'                         Запись значений Alarm search в ПЗУ Ds18b20
'=================================================
'-----------------------  Запись значений в ПЗУ Ds18b20  -------------------------
'=================================================
    1wreset       ' Сброс линии
    1wverify 1_id_ds18b20(1)       ' Обращаемся именно к этому датчику
   '--------------------------------
    1wwrite &H4E       ' Команда записи данных в ОЗУ датчика
   '--------------------------------
    1wwrite &H78       ' Максимальная температура (для сигнала аварии  "120°C"). Можно не использовать
    1wwrite &HCE       ' Минимальная температура (для сигнала аварии "-50°C").  Можно не использовать
    1wwrite &H7F       ' Устанавливаем разрешающую способность (7F - 12 бит, 5F - 11 бит , 3F - 10 бит , 1F - 9 бит)
   '--------------------------------
    1wverify 1_id_ds18b20(1)       ' Обращаемся именно к этому датчику
    1wwrite &H48       ' Команда записи данных из ОЗУ в ПЗУ датчика, для последующего использования
    1wreset       ' Сброс линии
   '--------------------------------
     Waitms 20
'=================================================

Отредактировано sasha_1973 (2013-10-06 14:31:40)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Mерцание индикаторов при опросе DS1820