Вопросы по программированию AVR на ассемблере
Добавлено: Пт май 02, 2014 21:24:40
Я заинтересовался проектом http://cxema.my1.ru/publ/skhemy_ustrojs ... 9-1-0-2397 , но там оказались проблемы с кодом.
У меня возникли вопросы в листинге программы помогите разобраться:
1) Метка есть, а где сам переход по метке?
2) В проекте предложен движковый переключатель для выбора подпрограммы[img][img]http://img.radiokot.ru/files/96849/thumbnail/bx1f1ma3k.jpg[/img][/img]
Я хочу его заменить на две кнопки. Не могли бы вы подсказать листинг программы, чтобы, допустим, первая кнопка была для "Подпрограмма загорания светодиодов по очереди", а вторая - для "Подпрограмма загорания светодиодов по возрастанию".
3) Что имел ввиду автор под понятием "среднее арифметическое действие"
4) Если есть что-то еще напишите
У меня возникли вопросы в листинге программы помогите разобраться:
1) Метка есть, а где сам переход по метке?
Код: Выделить всё
DIP: nop
in tmp, PORTA
nop
sbis PINA, 1 ;пропустить если не нажат DIP1.1
rjmp qq0Код: Выделить всё
s1: nop
sbis PINB, 6 ;пропустить если не нажат DIP1.2
rjmp qq1
nop
rjmp qq2Я хочу его заменить на две кнопки. Не могли бы вы подсказать листинг программы, чтобы, допустим, первая кнопка была для "Подпрограмма загорания светодиодов по очереди", а вторая - для "Подпрограмма загорания светодиодов по возрастанию".
3) Что имел ввиду автор под понятием "среднее арифметическое действие"
Код: Выделить всё
;среднее арифметическое действие
ass: nop
clr r8
clc
add tmp2, r2
adc r9, r8
add tmp2, r6
adc r9, r8
add tmp2, r6
adc r9, r8
clc
lsr r9
ror tmp2
lsr r9
ror tmp2
clr r9
clc
add tmp3, r3
adc r9, r8
add tmp3, r5
adc r9, r8
add tmp3, r7
adc r9, r8
clc
lsr r9
ror tmp3
lsr r9
ror tmp3
lsr r9
ror tmp3
nop
retКод: Выделить всё
.include "tn26def.inc"
.list
.def tmp = r16
.def tmp2 = r17
.def tmp3 = r18
.def tempo = r19
.def pir = r22
.def pur = r23
.def par = r20
.def Xa = r21
.def adr = r0
.def prg1 = r24
.def prg2 = r25
.cseg
.org 0x00
rjmp RESET
rjmp EXT_INT0;прерывание по входному сигналу
rjmp EXT_PIN ;прерывание не используется
rjmp TIME_CMPA ;прерывание от таймера
rjmp TIME_CMPB ;прерывание от таймера
rjmp TIME_OVF1 ;прерывание от таймера
rjmp TIME_OVF0 ;прерывание от таймера
rjmp USI_STRT ;прерывание от USI
rjmp USI_OVR ;прерывание от USI
rjmp EE_RDY ;прерывание от таймера
rjmp ANA_COMP ;прерывание от компаратора
rjmp ADC_ ;прерывание от АЦП
;"Заглушки" обработчиков неиспользуемых прерываний
EXT_INT0:;прерывание по входному сигналу
EXT_PIN: ;прерывание не используется
TIME_CMPA: ;прерывание от таймера
TIME_CMPB: ;прерывание от таймера
TIME_OVF1: ;прерывание от таймера
TIME_OVF0: ;прерывание от таймера
USI_STRT: ;прерывание от USI
USI_OVR: ;прерывание от USI
EE_RDY: ;прерывание от таймера
ANA_COMP: ;прерывание от компаратора
ADC_: ; ADC Conversion Handler
reti
; настройка портов
RESET:
ldi tmp,RAMEND
out SP,tmp
clr tmp
out DDRA, tmp
out PORTA, tmp ; обнулить порт А
clr tmp
ldi tmp, $FC ; РА0, РА1, - входы
out DDRA, tmp
clr tmp
out DDRB, tmp
out PORTB, tmp ; обнулить порт В
clr tmp
ldi tmp, $BF ; РВ6-вход
out DDRB, tmp
;Начало программы
nStart: nop
;сброс всех значений
clr pir
clr pur
clr prg1
clr prg2
clr adr
;вход в подпрограмму опроса АЦП1
nop
ldi tmp3, $80 ;источник питания, ADC2, ADMUX
ldi tmp2, $C6 ;одиночное, запуск, 1/64, ADCSR
;опрос уровня заряда конденсатора
mov r30, tmp2 ;загрузка младшего разряда
mov r31, tmp3 ;загрузка старшего разряда
nop
ldi tmp2, $B5 ;значение младшего разряда порога
ldi tmp3, $01 ;значение старшего разряда порога
;вычитание значения АЦП и порога
sub r30, tmp2
;проверка на ноль старшего байта
clr tmp
rol tmp
sub r31, tmp3 ;вычитание старшего байта с заемом
sub r31, tmp ;вычитание заема
loki: nop
brmi nStart ;переход, если результат < 0
nop
;опрос DIP1
DIP: nop
in tmp, PORTA
nop
sbis PINA, 1 ;пропустить если не нажат DIP1.1
rjmp qq0
s1: nop
sbis PINB, 6 ;пропустить если не нажат DIP1.2
rjmp qq1
nop
rjmp qq2
; DIP1.1
qq0: nop
sbis PINB,6 ;пропустить если не нажат DIP1.2
rjmp qq3
nop
rjmp nStart
qq3: nop
clr pir
cvb: nop
inc pir
rcall zader
nop
rcall opros
nop
cls
cpi pir, $0B
brlt cvb
nop
rjmp nStart
; DIP1.2
qq1: nop
sbis PINB, 1 ;пропустить если не нажат DIP1.1
rjmp qq4
nop
rjmp nStart
qq4: nop
clr pir
cvbn: nop
inc pir
rcall zader
nop
rcall opron
nop
cls
cpi pir, $0B
brlt cvbn
nop
rjmp nStart
; DIP1
qq2: nop
nop
cvbm: nop
inc pir
rcall zader
nop
rcall oprom
nop
cls
cpi pir, $14
brlt cvbn
nop
rjmp nStart
;Настройка АЦП
nop
nop
nop
nop
nop
nop
nop
clr tmp
awe: nop
cpi tmp, $04
brsh ass
clr tmp3
ldi tmp3, $83 ;внутренний источник, вход ADC3
out ADMUX, tmp3 ;коммутация входов АЦП
clr tmp2
clr tmp3
ldi tmp2, $C4 ;одиночное, запуск, 1/16
out ADCSR, tmp2 ;запуск АЦП на преобразование
WAIT:
sbis ADCSR,ADIF ;Если флаг ADIF установлен, пропустить следующую команду
rjmp WAIT ;Иначе флаг ADIF сброшен, преобразование не завершено, вернуться на метку WAIT для опроса флага
;Флаг ADIF установлен, преобразование завершено.
in R16,ADCSR ;Считать содержимое ADCSRA в рег.R16
ori R16,(1<<ADIF) ;Установить бит ADIF, не трогая остальные биты
out ADCSR,R16 ;Занести в ADCSRA содержимое R16 c установленным битом ADIF для сброса флага ADIF
;Сохранение данных АЦП
in tmp2, ADCL
in tmp3, ADCH
mov r2, tmp2
mov r3, tmp3
mov r4, r2
mov r5, r3
mov r6, r4
mov r7, r5
inc tmp
;среднее арифметическое действие
ass: nop
clr r8
clc
add tmp2, r2
adc r9, r8
add tmp2, r6
adc r9, r8
add tmp2, r6
adc r9, r8
clc
lsr r9
ror tmp2
lsr r9
ror tmp2
clr r9
clc
add tmp3, r3
adc r9, r8
add tmp3, r5
adc r9, r8
add tmp3, r7
adc r9, r8
clc
lsr r9
ror tmp3
lsr r9
ror tmp3
lsr r9
ror tmp3
nop
ret
; Подпрограмма задержки включения светодиодов
zader: nop
wdr
clr r26
clr r29
ldi r29, $AF
cpi tmp3, $00
brne goo
ldi r26, $01
add r26, tmp3
nop
goo: nop
mov r26, tmp3
dm: nop
cpi tmp2, $00
brne goq
ldi Xa, $01
add Xa, tmp2
nop
goq: nop
mov Xa, tmp2
dv: nop
wdr
nop
dx: dec r29
brpl dx
cln
dec Xa
brpl dv
cln
dec r26
brne dm
ret
;Подпрограмма опроса светодиодов программа1
opros: nop
ldi ZH, high(2*prog1A)
ldi ZL, Low(2*prog1A)
Add ZL, pir
LPM
mov prg1, adr
out PORTB, prg1
nop
ldi ZH, high(2*prog1B)
ldi ZL, Low(2*prog1B)
Add ZL, pir
LPM
mov prg2, adr
out PORTB, prg2
ret
;Подпрограмма опроса светодиодов программа2
opron: nop
ldi ZH, high(prog2A*2)
ldi ZL, Low(prog2A*2)
Add ZL, pir
LPM
mov prg1, adr
out PORTB, prg1
nop
ldi ZH, high(prog2B*2)
ldi ZL, Low(prog2B*2)
Add ZL, pir
LPM
mov prg2, adr
out PORTB, prg2
ret
;Подпрограмма опроса светодиодов программа3
oprom: nop
ldi ZH, high(prog3A*2)
ldi ZL, Low(prog3A*2)
Add ZL, pir
LPM
mov prg1, adr
out PORTB, prg1
nop
ldi ZH, high(prog3B*2)
ldi ZL, Low(prog3B*2)
Add ZL, pir
LPM
mov prg2, adr
out PORTB, prg2
ret
.org $200
prog1A:
.DB $00, $00, $00, $00, $80, $40, $20, $10
.DB $08, $04
prog1B:
.DB $08, $04, $02, $01, $00, $00, $00, $00
.DB $00, $00
prog2A:
.DB $00, $00, $00, $00, $80, $C0, $E0, $F0
.DB $F8, $FC
prog2B:
.DB $08, $0C, $0E, $0F, $0F, $0F, $0F, $0F
.DB $0F, $0F
prog3A:
.DB $0C, $18, $30, $60, $C0, $80, $00, $00
.DB $0C, $08
prog3B:
.DB $00, $00, $00, $00, $00, $01, $03, $06
.DB $0C, $08
.EXIT