Решил сделать сердце для девушки , подправил немного программу из книги Белова. Алгоритм такой: бегущий огонь вправо, затем три по два импульса типо удары сердца)) В протеусе вроде мигает почти как надо( огонь бежит, потом три раза моргает но почему-то по разу), а вот в железе нет только слабое свечение диодов(
Вот исходный код, во вложении плата в lay. помогите разобраться в чем проблема?)
Раздел: AVR
Вот исходный код, во вложении плата в lay. помогите разобраться в чем проблема?)
.include "tn2313def.inc" ; Присоединение файла описаний
.list ; Включение листинга
.def temp = r16 ; Определение главного рабочего регистра
.def rab = r17 ; Определение рабочего регистра
.equ kdela = 1560
.equ kdelb = 3800
.equ kdelc = 7800
;------------------------- Начало программного кода
.cseg ; Выбор сегмента программного кода
.org 0 ; Установка текущего адреса на ноль
;-------------------------- Инициализация стека
ldi temp, 0x7F ; Выбор адреса вершины стека
out SPL, temp ; Запись его в регистр стека
;-------------------------- Инициализация Главного предделителя
ldi temp, 0x80 ; Записываем число $80 в регистр temp
out CLKPR, temp ; Записываем в регистр CLKPR
ldi temp, 0 ; Записываем 0 в регистр temp
out CLKPR, temp ; Записываем этот ноль в CLKPR
;-------------------------- Инициализация портов ВВ
ldi temp, 0xFF ; Записываем FF в регистр temp
out DDRD, temp ; Записываем FF в DDRD (порт PD на вывод)
out DDRB, temp ; Записываем это число в DDRB (порт PB на вывод)
out PORTD, temp
out PORTB, temp ; Записываем то же число в PORTB (потушить светодиод)
;-------------------------- Инициализация таймера T1
ldi temp, 0x05
out TCCR1B, temp
;--------------------------- Инициализация компаратора
ldi temp, 0x80 ; Выключение компаратора
out ACSR, temp
;------------------------- Начало основного цикла программы
;------------------------- Сдвиг вправо PB
main: ldi rab, 0b10000000 ; Запись начального значения
m2: ldi temp, 0xFF
eor temp, rab
out PORTB, temp ; Вывод текущего значения в порт PB
rcall wait1 ; Задержка
lsr rab ; Сдвиг содержимого рабочего регистра
brcc m2 ; Если не дошло до конца регистра продолжить
ldi temp, 0xFF
out PORTB, temp
;------------------------- Сдвиг вправо PD
ldi rab, 0b00100000 ; Запись начального значения
m4: ldi temp, 0xFF
eor temp, rab
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1 ; Задержка
lsr rab ; Сдвиг содержимого рабочего регистра
brcc m4 ; Если не дошло до конца регистра продолжить
ldi temp, 0xFF
out PORTD, temp
;--------------------------------- Биение сердца
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait3
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait3
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait1
ldi temp, 0xFF
out PORTB, temp ; Вывод текущего значения в порт PB
out PORTD, temp ; Вывод текущего значения в порт PD
rcall wait3
rjmp main ; На начало
;--------------------------------- Подпрограмма задержки 1
wait1: push temp ; Сохраняем содержимое регистра temp
ldi temp, 0 ; Помещаем temp ноль
out TCNT1H, temp ; Записываем этот ноль в старший регистр таймера
out TCNT1L, temp ; Записываем этот ноль в младший регистр таймера
wt1: in temp, TCNT1L ; Считываем младшую половину счетного регистра
cpi temp, low(kdela) ; Сравниваем с младшей частью константы
brlo wt1 ; Переход, если temp меньше low(kd)
in temp, TCNT1H ; Считываем старшую половину счетного регистра
cpi temp, high(kdela); Сравниваем со старшей частью константы
brlo wt1 ; Переход, если temp меньше high(kd)
pop temp ; Восстанавливаем значение регистра temp
ret ; Выход из подпрограммы
;--------------------------------- Подпрограмма задержки 2
wait2: push temp ; Сохраняем содержимое регистра temp
ldi temp, 0 ; Помещаем temp ноль
out TCNT1H, temp ; Записываем этот ноль в старший регистр таймера
out TCNT1L, temp ; Записываем этот ноль в младший регистр таймера
wtt1: in temp, TCNT1L ; Считываем младшую половину счетного регистра
cpi temp, low(kdelb); Сравниваем с младшей частью константы
brlo wtt1 ; Переход, если temp меньше low(kd)
in temp, TCNT1H ; Считываем старшую половину счетного регистра
cpi temp, high(kdelb); Сравниваем со старшей частью константы
brlo wtt1 ; Переход, если temp меньше high(kd)
pop temp ; Восстанавливаем значение регистра temp
ret ; Выход из подпрограммы
;--------------------------------- Подпрограмма задержки 3
wait3: push temp ; Сохраняем содержимое регистра temp
ldi temp, 0 ; Помещаем temp ноль
out TCNT1H, temp ; Записываем этот ноль в старший регистр таймера
out TCNT1L, temp ; Записываем этот ноль в младший регистр таймера
wttt1: in temp, TCNT1L ; Считываем младшую половину счетного регистра
cpi temp, low(kdelc) ; Сравниваем с младшей частью константы
brlo wttt1 ; Переход, если temp меньше low(kd)
in temp, TCNT1H ; Считываем старшую половину счетного регистра
cpi temp, high(kdelc); Сравниваем со старшей частью константы
brlo wttt1 ; Переход, если temp меньше high(kd)
pop temp ; Восстанавливаем значение регистра temp
ret ; Выход из подпрограммы
Прикрепленные файлы:
Раздел: AVR