а так не пробовали
Config Portd.3 = Input
Код: Выделить всё
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$prog &HFF , &HF4 , &HDB , &HFF ' generated. Take care that the chip supports all fuse bytes.
Dim Count As Byte
Dim Number1 As Byte
Dim Number2 As Byte
Dim Number3 As Byte
Config Portb = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Dig1 Alias Portd.3
Dig2 Alias Portd.4
Dig3 Alias Portd.5
Config Timer0 = Timer , Prescale = 64
On Timer0 Int_timer0
Enable Interrupts
Enable Timer0
Do
Loop
End
Int_timer0:
Reset Dig1 : Reset Dig2 : Reset Dig3
Incr Count : If Count > 3 Then Count = 1
If Count = 1 Then
Portb = &B11010101
Set Dig1
End If
If Count = 2 Then
Portb = &B11010101
Set Dig2
End If
If Count = 3 Then
Portb = &B11010101
Set Dig3
End If
Return
Digits:
Data &B00010001 , &B11010111 , &B00100101 , &B10000101 , &B11000011 ' 0 1 2 3 4
Data &B10001001 , &B00001001 , &B11010101 , &B00000001 , &B10000001 ' 5 6 7 8 9
Код: Выделить всё
If Count = 1 Then
Portb = &B00010001
Set Dig1
End If
If Count = 2 Then
Portb = &B11010101
Set Dig2
End If
If Count = 3 Then
Portb = &B11010111
Set Dig3
End If
SAU писал(а):Помогите разобраться с динамической индикацией)
Код: Выделить всё
If Count = 1 Then
Portb = &B11010101
Set Dig1
Waitms 2
End IfКод: Выделить всё
$regfile = "attiny2313.dat" ' тип МК
$crystal = 8000000 ' выбор кристала для расчета задержек
'******************************[Определение переменных и констант]************************************
Dim Count As Byte ' переменная для индикации
Dim Number(3) As Byte ' значения трех разрядов
'***************************************[Инициализация портов]**********************************************
Config PORTA.1 = Output ' светодиод
Config PORTB = Output ' порт сегментов индикатора
Config PORTD.4 = Output ' первый разряд индикатора
Config PORTD.5 = Output ' второй разряд индикатора
Config PORTD.6 = Output ' третий разряд индикатора
'************************************[Инициализация прерываний]*****************************************
Config Timer0 = Timer , Prescale = 64 ' конфигурируем таймер индикации
On Ovf0 Refresh ' метка на прерывание индикации
'***********************************[Присвоение уникальных имен]*****************************************
Led Alias PORTA.1 ' присваиваем имя светодиоду
Dig1 Alias PORTD.4 : Dig2 Alias PORTD.5 : Dig3 Alias PORTD.6 ' и разрядам
'***********************************[Начало основной программы]******************************************
Enable Interrupts ' разрешаем все прерывания
Enable Ovf0 ' и для индикации в частности
'-----------------------------------------
Number(1) = 4 ' выведем на индикатор 456
Number(2) = 5
Number(3) = 6
'-----------------------------------------
Do ' крутимся здесь, ожидая прерывание
Toggle Led ' мигаем светодиодом
Wait 1
Loop
'************************[Процедуры обработки подпрограмм и прерываний]************************
Refresh: ' прерывание таймера Т0 (индикация)
Reset Dig1 : Reset Dig2 : Reset Dig3 ' гасим индикатор
Incr Count : If Count > 3 Then Count = 1 ' выбираем разряд для загрузки
PORTB = Lookup(number(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' и включаем соответствующий разряд индикатора
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
End Select
Return ' выход из обработчика прерывания
'********************************************************[DATA]****************************************************
Digits: ' цифры
Data &B11111100 , &B01100000 , &B11011010 , &B11110010 , &B01100110 ' 0 1 2 3 4
Data &B10110110 , &B10111110 , &B11100000 , &B11111110 , &B11110110 ' 5 6 7 8 9
'*********************************************************************************************************************Потом отпишитесь, а то уже интересно почему такая загагулина.SAU писал(а):вечером попробую его код..
Код: Выделить всё
Do ' основной цикл
PORTB = Lookup(number(1) , Digits) ' в первый разряд выводим 4
Set Dig1 ' зажигаем первый разряд
Waitms 2 ' задержка
Reset Dig1 ' гасим первый разряд
PORTB = Lookup(number(2) , Digits) ' во второй разряд выводим 5
Set Dig2 ' зажигаем второй разряд
Waitms 2 ' задержка
Reset Dig2 ' гасим второй разряд
PORTB = Lookup(number(3) , Digits) ' в третий разряд выводим 6
Set Dig3 ' зажигаем третий разряд
Waitms 2 ' задержка
Reset Dig3 ' гасим третий разряд
Loop ' начинаем сначала
Вы будете смеяться, но в протеусе, да, все работает.а подключил свои кт361 эммитер на землю, коллектор на анод- даже не светятся..К тому же схему подключения брал отсюда..http://radiokot.ru/articles/30/amv2000 писал(а):Подключаете не правильно, эмиттеры на землю и всё у Вас получится
Ржу не могуSAU писал(а):Вы будете смеяться, но в протеусе, да, все работает.
SAU писал(а):ну у него в обработке прерывания таймера я тоже задержки не увидел..)
amv2000 писал(а):Сейчас просмотрел снова код, действительно задержка Waitms нужна когда в главном цикле, а в прерывании нет
Вот именно по этой причине я никогда и не выкладываю исходные коды своих законченных творений. Потому как даже не попытавшись разобраться, начинают втыкать задержки, костыли и подпорки, а потом меня же упрекают в том, что мой код не работает.SAU писал(а):Причем я пробовал ставить задержки и в обработке прерывания таймера...