Здравствуйте, программка для термометра на тиньке 2313, семисегментник на 2 цифры в динамической индикации с регулировкой яркости путем гашения в нужный момент.
Все работает, яркость регулируется, но при добавлении куска кода для регулировки яркости вместе с тем получил поочередное , так сказать, несанкционированное мерцание с непонятной частотой порядка раз в 0.75c.(осцилом глянул) - не зажигается, то один, то другой индикатор. Значение яркости на частоту этого мерцания никак не влияет.
Причем как бы не просто пропуск зажигания индикатора, а как бы подтормаживание - зажигание идет со своими 150гц, а вот этот провал длится 100гц, откуда оно ума не приложу.
Если у кого есть опыт по регулированию яркости семисегментников, буду рад любым советам, может я вобще как-то не с той стороны подошел к вопросу ?
Зажигание происходит по переполнению таймера0 , но "0" (начало отсчета) программно смещен, для получения какой-то устраиваемой частоты.
Гашение производится по тому же таймеру0, но по сравнению, если достиг нужного значения гасим не дожидаясь переполнения таймера, что-то типа ШИМа должно было быть
Раздел: AVR
Все работает, яркость регулируется, но при добавлении куска кода для регулировки яркости вместе с тем получил поочередное , так сказать, несанкционированное мерцание с непонятной частотой порядка раз в 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