Проблемы С Регулированием Яркости 7-Сегментникав Bascom

24-01-2013, 13:19 От: admin Посмотрели: 855
Здравствуйте, программка для термометра на тиньке 2313, семисегментник на 2 цифры в динамической индикации с регулировкой яркости путем гашения в нужный момент.

Все работает, яркость регулируется, но при добавлении куска кода для регулировки яркости вместе с тем получил поочередное , так сказать, несанкционированное мерцание с непонятной частотой порядка раз в 0.75c.(осцилом глянул) - не зажигается, то один, то другой индикатор. Значение яркости на частоту этого мерцания никак не влияет.

Причем как бы не просто пропуск зажигания индикатора, а как бы подтормаживание - зажигание идет со своими 150гц, а вот этот провал длится 100гц, откуда оно ума не приложу.



Если у кого есть опыт по регулированию яркости семисегментников, буду рад любым советам, может я вобще как-то не с той стороны подошел к вопросу ?



Зажигание происходит по переполнению таймера0 , но "0" (начало отсчета) программно смещен, для получения какой-то устраиваемой частоты.

Гашение производится по тому же таймеру0, но по сравнению, если достиг нужного значения гасим не дожидаясь переполнения таймера, что-то типа ШИМа должно было быть







$regfile = "attiny2313.dat"
$crystal = 8000000



Config 1wire = Portd.6 ' *************************на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания
Config Portd.4 = Output ' **********************выходы для сегментника
Config Portd.5 = Output
Config Portb = Output
Config Pind.2 = Input ' *************************это кнопки одна реагирует на 0, другая на 1 - так просто, посмотрел чем отличаются
Config Pind.3 = Input

Config Timer0 = Timer , Prescale = 256 , Clear_timer = 0 ' *************************делитель таймера

On Ovf0 Indicat ' ***************************************************зажигание индикатора по переполнению
On Oc0a Res ' *****************************************************гашение индикатора по сравнению


Dim T1 As Byte
Dim T2 As Byte
Dim Temp As Word
Dim Per As Bit
Dim Seg1 As Byte , Seg2 As Byte
Dim Znak As Bit
Dim Flag0 As Bit
Dim Flag1 As Bit
Dim Bright As Byte
Dim Podbor As Byte
Dim Per1 As Byte


Podbor = 47 ' **************************************подбираем начало отсчета таймера переполнения, в данном случае где-то порядка 150гц
Timer0 = Podbor
Bright = 200 '**************************************это сброс индикатора, т.е. регулируемое время горения, соответственно яркость
Ocr0a = 254 ' ************************************начальное значение яркости (практически полная яркость)
Pind.2 = 1
Pind.3 = 0


Enable Interrupts
Enable Ovf0
Enable Oc0a


Do
Disable Interrupts ' ****************************отключаем прерывние на время работы с датчиком температуры
1wreset
1wwrite &HCC '******************************** работа с датчиком
1wwrite &H44
Enable Interrupts ' ****************************включаем прерывания пока датчик думает**
Waitms 750

Disable Interrupts '****************************опять отключаем прерывания на время обмена информацией
1wreset
1wwrite &HCC
1wwrite &HBE
T1 = 1wread()
T2 = 1wread()
Enable Interrupts ' *************************обратно все включаем


'******************************************температуру проверям-преобразовываем
If T2 > 254 Then
T2 = &HFF - T2
T1 = &HFF - T1
Znak = 1
Else
Znak = 0
End If


'***************************************************увеличениие яркости при нажатии и вывод в процентах на экран
If Pind.2 = 0 Then
Ocr0a = Ocr0a + 10
If Ocr0a < Podbor Then Ocr0a = Podbor
Temp = Ocr0a - Podbor
Per1 = 255 - Podbor
Temp = Temp * 100
Temp = Temp / Per1
Seg1 = Temp / 10
Seg2 = Temp Mod 10
Waitms 200
Else
T1 = T1 / 16 '*************************это вывод температуры от датчика
T2 = T2 * 16
T1 = T1 + T2
Seg1 = T1 / 10
Seg2 = T1 Mod 10
End If








Loop
End

data:
Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001 ' 0 1 2 3 4
Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000 ' 5 6 7 8 9

Res:
Reset Portd.4 : Reset Portd.5
Return



Indicat:

Timer0 = Podbor
Reset Portd.5 : Reset Portd.4
If Per = 0 Then
Portb = Lookup(seg1 , Data)
If Znak = 1 Then Portb = &B00111111
Set Portd.4
Per = 1
Else
Portb = Lookup(seg2 , Data)
Set Portd.5
Per = 0
End If
Return

Раздел: AVR

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

Обсудить на форуме


На момент добавления Проблемы С Регулированием Яркости 7-Сегментникав Bascom все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031