Страница 1 из 1
Инверсия
Добавлено: Сб май 17, 2014 23:59:17
Denis17
Привет всем. Есть программа для двух бегущих огоньков. В АВР Студио работает, но при подключении к схеме происходит не последовательное загорание диодов а последовательное гашение. Я так понимаю необходимо сделать инверсию, но не обладаю достаточными знаниями. Помогите кто чем может, спасибо.
Текст программы:
.nolist
.include "8515def.inc"
.list
.equ DelayValue=10
ldi R31 , high (RAMEND)
out SPH, R31
ldi R31 , low(RAMEND)
out SPL, R31
ldi R16 ,0b11111111
out DDRB, R16
Label: ldi R16,0b00000011
MainLoop :
out PORTB, R16
rcall Delay
cpi R16,0b11000000
breq Label
lsl R16
rjmp MainLoop
Delay :
ldi R24 , low( DelayValue )
ldi R25 , high ( DelayValue )
DelayLoop :
sbiw R24 , 1
brne DelayLoop ;
ret
Re: Инверсия
Добавлено: Вс май 18, 2014 00:12:54
ARV
схемка-то у вас, небось, такая: катод светодиода на пин МК, а анод - на пиатние через резистор

вот у вас и гашение вместо загорания. переставьте светодиоды: анод через резистор на пин МК, а катод - на общий, и будет вам загорание вместо гашения

Re: Инверсия
Добавлено: Вс май 18, 2014 00:18:43
ИС-пытатель
Код: Выделить всё
.nolist
.include "8515def.inc"
.list
.equ DelayValue=10
ldi R31 , high (RAMEND)
out SPH, R31
ldi R31 , low(RAMEND)
out SPL, R31
ldi R16 ,0b11111111
out DDRB, R16
Label: ldi R16,0b11111100
MainLoop :
out PORTB, R16
rcall Delay
cpi R16,0b00111111
breq Label
lsl R16
inc r16
rjmp MainLoop
Delay :
ldi R24 , low( DelayValue )
ldi R25 , high ( DelayValue )
DelayLoop :
sbiw R24 , 1
brne DelayLoop ;
ret
Re: Инверсия
Добавлено: Вс май 18, 2014 09:06:09
BOB51
Чтобы не иметь проблем по поводу выходной полярности используй т для промежуточного накопления и обработки не сам регистр порта, а промежуточный буфер-регистр из регистрового файла. Затем при операции вывода из буфера в порт можно вствить и инверсию и маскирование (по необходимости) а не "курочить" всю программу обработки данных.

Re: Инверсия
Добавлено: Вс май 18, 2014 10:59:50
Denis17
В том и суть, что я не имею права трогать схему, моя задача-изменить программу..
Re: Инверсия
Добавлено: Вс май 18, 2014 11:02:21
Denis17
За ответ спасибо ИС-пытатель..на неделе проверю работоспособность, в программе работает как задумывалось
Re: Инверсия
Добавлено: Вс май 18, 2014 11:51:22
ИС-пытатель
BOB51 писал(а):Чтобы не иметь проблем по поводу выходной полярности используй т для промежуточного накопления и обработки не сам регистр порта, а промежуточный буфер-регистр из регистрового файла.
BOB51, так у него и так через r16 все сделано.
Re: Инверсия
Добавлено: Вс май 18, 2014 14:32:31
BOB51
Вот тут и "прикол" - R16 в данном фрагменте - основной рабочий регистр, а не буфер вывода.
Для внесения исправлений по инверсии потребуется в нескольких местах код править (хотя-бы минимум замена LSL на ROL с CY=1).
Ежли использовать дополнительный буфер - потребуется делать манипуляцию только с результатом.

Re: Инверсия
Добавлено: Вс май 18, 2014 15:03:37
ИС-пытатель
Можно и через "буфер", это более правильный подход. Но в такой маленькой программе это чрезмерно. Буфер - это всегда дополнительный расход процессорного времени и памяти. Проще, чем я написал, уж некуда.