Потом она проскакивает не зажигая через один светодиод:
Дальше работает вроде как по программе. Периодически эти желтые сигналы откуда-то появляются.
Собрал реальное устройство - работает совсем по-другому, чем в Протеусе. В реальном биты порта D подтянуты резисторами на 6 кОм к плюсу. Каши нет никакой, все вроде нормально, но на кнопки все равно никак не реагирует.
Код: Выделить всё
; Автор: Владимир Николаевич
; Дата: 06.11.13
; Версия: 0.01
; Имя файла: Running LED
; Для AVR: ATmega32A
; Тактовая частота: 4 МГц
; Выполняемые функции: Бегущий огонек
.device ATmega32
.nolist
.include "C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m32def.inc"
.list
; ==========
; Объявления
.def temp = r16
.def Mark240 = r17
.def Counter = r18
.def Speed = r19
; ==========
; Начало программы
rjmp Init
; ==========
; Инициализация
Init:
ldi Mark240, 240 ; Начальное значение маркера - 240
ldi Counter, 5 ; Начальное значение счетчика - 5
ldi Speed, 5 ; Начальное значение регистра - 5
ldi temp, 0b00000101
out TCCR0, temp ; Т/С0 сконфирурирован как таймер с частотой СК/1024
ser temp
out DDRB, temp ; Порт В - биты 0..7 - выходы
ldi temp, 0b11111100
out DDRD, temp ; Порт D - биты 0,1 - входы, биты 2..7 - выходы
ldi temp, 0b00000001
out PortB, temp ; Порт В - начальное состояние PB0 - вкл, остальные - выкл.
ldi temp, 0b00000011
out PortD, temp ; Порт В - биты 0,1 - вкл. подтяжку, биты 2..7 - начальное состояние все выкл.
; ==========
; Основная программа
Start:
sbis PinD, 0 ; Проверяем, нажата ли кнопка уменьшения скорости
rjmp UpTest ; Если не нажата, переходим по метке
inc Speed ; Если нажата, уменьшаем скорость (увеличиваем Speed на 1)
cpi Speed, 11 ; Сравниваем с числом 11, регистр равен 11?
brne ReleaseDown ; Если нет, переходим по метке
dec Speed ; Уменьшаем Speed на 1
ReleaseDown:
sbis PinD, 0 ; Ждем отпускания кнопки
rjmp ReleaseDown
UpTest:
sbis PinD, 1 ; Проверяем, нажата ли кнопка увеличения скорости
rjmp Timer ; Если не нажата, переходим по метке
dec Speed ; Если нажата, увеличиваем скорость (уменьшаем Speed на 1)
brne ReleaseUp ; Если не равно нулю, то переходим по метке
inc Speed ; Увеличиваем Speed на 1
ReleaseUp:
sbis PinD, 1 ; Ждем отпускания кнопки
rjmp ReleaseUp
Timer:
in temp, TCNT0 ; Загружаем значение таймера в temp
cp temp, Mark240 ; Сравниваем значение таймера со значением маркера
brne Start ; Если не равны, переходим по метке
subi Mark240, -240 ; Прибавляем 240 к значению маркера
dec Counter ; Декркментируем счетчик
brne Start ; Если не ноль, переходим по метке
; Заданное время прошло, меняем светодиод
mov Speed, Counter ; Перенести значение из Speed в Couner
in temp, PortB ; Загружаем значение из PortB в temp
lsl temp ; Логический сдвиг влево
brcc PC+2 ; Пропустить команду, если флаг переноса сброшен
ldi temp, 0b00000001 ; Сбрасываем в исходное состояние
out PortB, temp ; Изменяем состояние выводов порта В
rjmp Start
; ==========
В общем, разобрался почему не реагировала на кнопки. Эту строку:
Код: Выделить всё
mov Speed, Counter ; Перенести значение из Speed в Couner
Код: Выделить всё
mov Counter, Speed ; Перенести значение из Speed в Couner


