Бегущий огонек на ATtiny2313 с переключением эффектов :)
Добавлено: Сб янв 31, 2009 21:11:19
У меня возникла проблема, когда пытался адаптировать урок "Переключение между массивами. Б.О. v2.2". Ниже представил код уже полученной и глюченной программы.. выделил для работы еще 2 регистра, хотя было бы достаточно одного.. Но для начала решил сделать с двумя, лишь бы работало.
Еще думаю что код очень не оптимизирован.. Так же хочется знать, нельзя-ли писать в массивах не 8 битами а 15? (что-бы обрабатывались сразу 2 порта).. массивы специально не переводил в десятиричную систему, для удобства. Код ниже, строго не судите - я пока-что новичок и в МК и в Ассемблере
Ошибка, как я понял, по метке "ReadArray"
Забыл написать! Цель этой адаптации - задействовать порт D
Спасибо заранее
Еще думаю что код очень не оптимизирован.. Так же хочется знать, нельзя-ли писать в массивах не 8 битами а 15? (что-бы обрабатывались сразу 2 порта).. массивы специально не переводил в десятиричную систему, для удобства. Код ниже, строго не судите - я пока-что новичок и в МК и в Ассемблере
Ошибка, как я понял, по метке "ReadArray"
Забыл написать! Цель этой адаптации - задействовать порт D
Код: Выделить всё
.include "D:\Other\AVR\avrasm\APPNOTES\tn2313def.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def ResCnt=R20
.cseg
.org 0
rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;****************************************************************************************
;* ИНИЦИАЛИЗАЦИЯ *
;****************************************************************************************
Reset: ldi Temp1,0 ;Анти-дребезг
ldi Temp2,0 ;----------
l_res: dec Temp1 ;----------
brne l_res ;----------
dec Temp2 ;----------
brne l_res ;----------
inc ResCnt ;инкремент счетчика сбросов
ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp ;----------
ldi Temp,0b1111111 ;----------
out DDRD,Temp ;----------
ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp ;----------
ldi Temp,0b00000010 ;тактовый сигнал = CK/8
out TCCR1B,Temp ;----------
ldi Temp,0x4C ;инициализация компаратора
out OCR1AH,Temp ;----------
ldi Temp,0x4B ;----------
out OCR1AL,Temp ;----------
ldi Temp,RamEnd ;установка указателя стека
out SPL,Temp ;----------
ldi Temp1,0 ;инициализация индикатора
ldi Temp2,0 ;----------
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp ;----------
out TCNT1L,Temp ;----------
sei ;разрешить прерывания
;****************************************************************************************
;* ОСНОВНОЙ ЦИКЛ *
;****************************************************************************************
Inf: rjmp Inf ;бесконечный цикл
;****************************************************************************************
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА *
;****************************************************************************************
Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp ;----------
out TCNT1L,Temp ;----------
SelectArray: ;выбор массива
andi ResCnt,0b00000011 ;отсечка лишних разрядов сч. сбросов
cpi ResCnt,0 ;сравнение счетчика сбросов с конст.
brne Tst1 ;если не равно - след. проверка
ldi ZH,High(ArrayB0*2) ;загрузка начального адреса массива
ldi ZL,Low(ArrayB0*2) ;----------
ldi YH,High(ArrayD0*2) ;----------
ldi YL,Low(ArrayD0*2) ;----------
rjmp ReadArray
Tst1: cpi ResCnt,1
brne Tst2
ldi ZH,High(ArrayB1*2)
ldi ZL,Low(ArrayB1*2)
ldi YH,High(ArrayD1*2)
ldi YL,Low(ArrayD1*2)
rjmp ReadArray
Tst2: cpi ResCnt,2
brne Tst3
ldi ZH,High(ArrayB2*2)
ldi ZL,Low(ArrayB2*2)
ldi YH,High(ArrayD2*2)
ldi YL,Low(ArrayD2*2)
rjmp ReadArray
Tst3: ldi ZH,High(ArrayB3*2)
ldi ZL,Low(ArrayB3*2)
ldi YH,High(ArrayD3*2)
ldi YL,Low(ArrayD3*2)
rjmp ReadArray
ReadArray:
ldi Temp,0 ;прибавление относит. адреса
ldi Temp3,0 ;----------
add ZL,Temp1 ;----------
adc ZH,Temp ;----------
add YL,Temp2 ;----------
adc YH,Temp3 ;----------
lpm R0,Z ;загрузка из ПЗУ
ld R1,Y ;----------
mov Temp,R0 ;копирование в РОН
mov Temp3,R1 ;----------
cpi Temp,0 ;пороверка на нулевой элемент
breq Init ;если да - инициализация
inc Temp1 ;увеличение относит адреса на 1
inc Temp2
rjmp Output ;перейти на вывод в порт
Init: ldi Temp1,0 ;вернутся к выбору массива
ldi Temp2,0 ;----------
rjmp SelectArray ;----------
Output: out PortB,Temp ;вывод в порт
out PortD,Temp3 ;----------
reti ;выход из обработчика
ArrayB0:
.db 0b10000000,0b01000000,0b00100000,0b00010000
.db 0b00001000,0b00000100,0b00000010,0b00000001
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0,0
ArrayB1:
.db 0b00000001,0b00000010,0b00000100,0b00001000
.db 0b00010000,0b00100000,0b01000000,0b10000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0,0
ArrayB2:
.db 0b10000001,0b01000010,0b00100100,0b00011000
.db 0b00011000,0b00100100,0b01000010,0b10000001
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0,0
ArrayB3:
.db 0b10000000,0b01000000,0b00100000,0b00010000
.db 0b00001000,0b00000100,0b00000010,0b00000001
.db 0b00000001,0b00000010,0b00000100,0b00001000
.db 0b00010000,0b00100000,0b01000000,0b10000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000
.db 0,0
ArrayD0:
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b1000000,0b0100000,0b0010000,0b0001000
.db 0b0000100,0b0000010,0b0000001,0b0000000
.db 0,0
ArrayD1:
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000001,0b0000010,0b0000100,0b0001000
.db 0b0010000,0b0100000,0b1000000,0b0000000
.db 0,0
ArrayD2:
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b1000001,0b0100010,0b0010100,0b0001000
.db 0b0001000,0b0010100,0b0100010,0b1000001
.db 0,0
ArrayD3:
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b0000000,0b0000000,0b0000000,0b0000000
.db 0b1000000,0b0100000,0b0010000,0b0001000
.db 0b0000100,0b0000010,0b0000001,0b0000001
.db 0b0000010,0b0000100,0b0001000,0b0010000
.db 0b0100000,0b1000000
.db 0,0Спасибо заранее