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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Мерцание семисегментного индикатора


Мерцание семисегментного индикатора

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

1

сделал устройство, которое считывает температуру с датчика ds18b20 и выводит на индикатор, управляет нагревателем
работает нормально, но при обновлении температуры индикатор помаргивает.
контроллер attiny2313

Код:
Config Portb = Output , Portd = Output
A Alias Portb.5 : B Alias Portb.7 : C Alias Portb.1 : D Alias Portb.3 : E Alias Portb.4 : F Alias Portb.6 : G Alias Portb.0 : Dp Alias Portb.2    
Dig1 Alias Portd.5 : Dig2 Alias Portd.1 : Dig3 Alias Portd.0 : Dig4 Alias Portd.4       
Dim I As Byte , X As Byte , Cifri(4) As Byte , Perenoschikobsh_provodov As Byte , Perenoschiksegmentov As Byte   

Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse : Enable Timer0     ' прерывания для обновления индикатора
Config Timer1 = Timer , Prescale = 256 : On Timer1 Temp : Enable Timer1     ' прерывания для обновления температуры

дальше у меня программа управления нагревателем

вот подпрограммы прерываний индикатора: (нашел её где-то на просторах интернета)
Pulse:                                                
Perenoschikobsh_provodov = 255
Gosub Perenos
Incr X : If X > 3 Then X = 0
Perenoschiksegmentov = Lookup(cifri(x + 1) , Dta)

Reset Perenoschikobsh_provodov.x

Gosub Perenos
Return                                                     


Perenos:
Dig1 = Perenoschikobsh_provodov.3
Dig2 = Perenoschikobsh_provodov.2
Dig3 = Perenoschikobsh_provodov.1
Dig4 = Perenoschikobsh_provodov.0
A = Perenoschiksegmentov.5
B = Perenoschiksegmentov.7
C = Perenoschiksegmentov.3
D = Perenoschiksegmentov.1
E = Perenoschiksegmentov.0
F = Perenoschiksegmentov.6
G = Perenoschiksegmentov.4

Return

Dta:                                                       
Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE , &H00 , &H00 , &H10

как, если это возможно, устранить мерцание индикатора?

0

2

Может попробовать поставить Prescale=1 в таймере обновления индикатора?

0

3

sva-don если сделать  Prescale=1, то  на индикаторе один разряд начинает налазить на другой. Скорее всего это связано с инерционность индикатора, так как в протеусе такой проблемы нету, впрочем как и нету помаргивания.

вот подпрограммы опроса датчика (взял её с форума)

Код:
Temp:
1wreset
1wwrite &HCC                                                
1wwrite &H44                                               

Bitwait Portd.6 , Set                                     

1wreset
1wwrite &HCC
1wwrite &HBE                                             

Byte0 = 1wread()                                          
Byte1 = 1wread()                                           

If Err = 1 Then                                           
 Er1 = 1
 Else
 Er1 = 0
 End If

If Byte1 >= 248 Then                                       
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
T1 = Byte0 / 16                                            

T2 = Byte1 * 16                                           

T1 = T1 + T2
I1 = -1 - T1
Else


T1 = Byte0 / 16                                          

T2 = Byte1 * 16                                            
T1 = T1 + T2
I1 = T1                                              
End If

пробовал вообще убирать Bitwait Portd.6 , Set   так он всеравно помаргивает. т.е. при обращении к 1ware контроллер на какое-то время замирает
Видел аналогичный проект написанный на С, так там всё работает красиво  без марганий.

0

4

Слишком много прерываний, и одного вполне хватит.
В этом прерывании поставить счётчик для опроса датчика.
Послал команду на измерение, запустил счётчик, а через секунду
можешь читать результат.
В прерывании как можно меньше команд.

0

5

Mrshilov спасибо попробовал... на глаз ничего не изменилось.
alex_r61 попробовал сократить подпрограмму Temp до такого:

Код:
Temp:
1wreset
1wwrite &HCC                                               
1wwrite &H44                                                

Bitwait Portd.6 , Set                                    

1wreset
1wwrite &HCC
1wwrite &HBE                                              

Byte0 = 1wread()                                           
Byte1 = 1wread()                                           

If Err = 1 Then                                           
 Er1 = 1
 Else
 Er1 = 0
 End If
    Return

пересчет принятых значений не производится и соответственно на индикаторе 00, но они всеравно помаргивают.
мне кажется что bascom как-то не оптимально работает с 1ware или подпрограмма обновления индикатора неудачная.

0

6

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

пересчет принятых значений не производится и соответственно на индикаторе 00, но они всеравно помаргивают.
мне кажется что bascom как-то не оптимально работает с 1ware или подпрограмма обновления индикатора неудачная.

Это не Баском, это шина такая не оптимальная :blush:  Смысл её как раз в том, что 0 и 1 отличаются по времени. Что-бы к примеру послать команду в датчик нужно время и при этом контроллер не должен ни на что не отвлекаться. Иначе команда исказиться. Вот когда срабатывает прерывание по таймеру1, динамическая индикация останавливается.
Задержку вызывают не вычисления , а работа с датчиком. Поэтому команду на измерение температуры лучше посылать в конце программы термометра, а в начале  её считывать, как предложилMrshilov. Тогда "Temp:" отработает быстрее и не будет задерживать индикацию.
Я бы попробывал вынести "Temp:" в основную программу и убрать таймер1. Но опять-же всё зависит от самой программы.

0

7

Нужно хотя-бы видеть структуру программы.
От "Bitwait Portd.6 , Set" надо избавиться,
ожидание , как я писал, через таймер.
На этой команде останов до появления результата.
И ещё, по молчанию разрядность реэультата у DS18B20 12 бит,
если её уменьшить то время ожидания сократится.

0

8

спасибо за советы.
в основном цикле программы происходит сравнение установленной температуры с считанной из датчика.... ничего сложного или навороченного. всё сделано через if then else... так что на работу индикатора это не может повлиять....

вся загвоздка в работе с 1were.
буду пробовать оптимизировать работу с опросом датчика.
alex_r61 подскажите пожалуйста как уменьшить разрядность 18b20

и ещё может посоветуете другую подпрограмму обновления индикатора

0

9

Если посмотреть даташит, то увидим:

CONFIGURATION REGISTER
Byte 4 of the scratchpad memory contains the configuration register, which is organized as illustrated in
Figure 8. The user can set the conversion resolution  of the DS18B20 using the R0 and R1 bits in this
register as shown in Table 3.      The power-up default of these bits is R0 = 1 and R1 = 1 (12-bit resolution).
Note that there is a direct tradeoff between resolution and conversion time. Bit 7 and bits 0 to 4 in the
configuration register are reserved for internal use by the device and cannot be overwritten; these bits will
return 1s when read.

CONFIGURATION REGISTER Figure 8

                         bit 7     bit 6    bit 5     bit 4     bit 3    bit 2     bit 1     bit 0

                          0        R1        R0        1         1         1         1        1

THERMOMETER RESOLUTION CONFIGURATION Table 3

                         R1       R0         Resolution         Max Conversion Time
                          0        0             9-bit            93.75 ms           (tCONV/8)
                          0        1            10-bit            187.5 ms           (tCONV/4)
                          1         0           11-bit             375 ms            (tCONV/2)
                          1         1           12-bit             750 ms             (tCONV)
                                                                                       
При разрешении 9-bit имеем точность 0.5 градуса, время конверсии сами видите.
А 1-Wire не причём, сколько уже термометров и терморегуляторов собрал.
Вот здесь по русски: http://www.masterkit.ru/zip/ds18b20-rus.pdf

Отредактировано alex_r61 (2011-12-26 23:39:16)

0

10

вот здесь смотрели?
http://avrproject.ru/publ/termometr_na_ … r/1-1-0-29

0

11

Mrshilov в программе ничего секретного нету.... но проект ещё не готов. Обещаю, что когда сделаю, чтобы всё красиво работало опубликую его на форуме с исходниками. Первый опыт в разработке будет )))

Viktor этот проект я уже видел и пробовал сделать как у автора.
но возникла проблема. там переключение разрядов индикатора сделано с помощью Portd = &B11111101 и тд, а у меня к портам D3 и D2 подключена нагрузка. и получается что при обновлении индикатора меняется состояние порта. меня этот вариант не устроил.
Вот вспомнил свой старый вопрос, который хотел задать на форуме: Можно ли поменять состояние только половины порта?

alex_r61
спасибо за ссылку. Наконец то я начинаю понимать принцип работы с датчиком 18b20 и вообще с шиной 1wire...

Отредактировано FlashKiller (2011-12-27 15:00:57)

0

12

А не проще ли перестать париться с динамикой, для этого есть готовые микросхемы.
Вот когда то делал такой термометр. Индикатор на схеме конечно же для модели, а в реале можно любой прилепить.
http://uploads.ru/t/X/m/9/Xm9M2.jpg

Отредактировано sva-don (2011-12-27 17:46:36)

0

13

sva-don согласен с вами - так проще и освобождается память контроллера, ну и конечно ему уже не надо отвлекаться постоянно на обновление индикатора.
но не хотелось бы вносить ещё какие либо элементы в схему т.к. она уже собрана в железе. И я хочу сделать максимально дешевый и функциональный терморегулятор с парочкой интересных функций

Отредактировано FlashKiller (2011-12-27 17:57:32)

0

14

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

но возникла проблема. там переключение разрядов индикатора сделано с помощью Portd = &B11111101 и тд, а у меня к портам D3 и D2 подключена нагрузка. и получается что при обновлении индикатора меняется состояние порта. меня этот вариант не устроил.
Вот вспомнил свой старый вопрос, который хотел задать на форуме: Можно ли поменять состояние только половины порта?

Применяйте логические операции(команды).   команду "AND", "OR"(лог И, ИЛИ), так сказать накладывайте маску.
&bxxxx00xx or &b0000yy00=&bxxxxyyxx

0

15

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

Применяйте логические операции(команды).   команду "AND", "OR"(лог И, ИЛИ), так сказать накладывайте маску.
&bxxxx00xx or &b0000yy00=&bxxxxyyxx

можно поподробнее с примером....

0

16

Mrshilov всё что мне надо я уже узнал. И большое спасибо всем за помощь.
Я не хочу чтобы за меня всю работу сделали.... мне хочется самому дойти до решения проблемы.

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Мерцание семисегментного индикатора