Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: микр-ый генератор
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
dimoni4
Попалась мне такая задачка! Разобраться в программе!
суть программы основана на работе цап и ацп! а точнее синтезирование звуковых сигналов!

вот код из ассемблера:
CODE


.include "C:\Program Files\Atmel\AVR Studio\Appnotes\tn15def.inc"
.list
;***** Регистровые переменные
.def adr = r0 ; Рабочий регистр младший
.def tmp3 = r16 ; Рабочий регистр
.def M = r17 ; Рабочий регистр
.def Y = r18 ; Рабочий регистр
.def X = r19 ; Рабочий регистр
.def tmp = r20 ; Рабочий регистр
.def tmp1 = r21 ; Рабочий регистр
.def tmp2 = r22 ; Рабочий регистр
.def s1 = r23 ; Рабочий регистр старший
.def i1 = r24 ; Рабочий регистр старший
.def s = r25 ; Рабочий регистр младший
.def i = r26 ; Рабочий регистр младший
.def pir = r27 ; Рабочий регистр младший

.cseg
.org 0
rjmp RESET
nop ;rjmp EXT_INT0 прерывание не используется
nop ;rjmp EXT_PIN прерывание не используется
nop ;rjmp TIME_OVF0 прерывание от таймера
nop ;rjmp EE_RDY прерывание от таймера
nop ;rjmp ANA_COMP прерывание не используется


.org 20
;настройка порта В
RESET: nop
clr tmp
out DDRB, tmp
out PORTB, tmp ;обнулить порт В
clr tmp
ldi tmp, $07 ;PB0,PB1,РВ2-выходы
out DDRB, tmp
;Начало программы
;сброс всех значений
clr s1
clr i1
clr s
clr i
clr adr

;Начало цикла
nStart: nop
sbi PORTB, 2
nop
;Превышает 10800?
mov tmp1, i1
mov tmp2, i
cls ;сброс флага знака
subi tmp2, $30 ;проверяем младший байт
brlt eee ;если меньше проверять не надо
cls ;сброс флага знака
subi tmp1, $2A ;проверяем старший байт
brlt eee ;если меньше проверять не надо
nop
rjmp ss
eee: nop
rjmp kk ;удлиняем переход
;Да превышает 10800
ss: nop
clr i ;сброс i в ноль
clr i1 ;сброс i в ноль
rcall adcn ;подпрограмма опроса АЦП
nop
;формирование времени задержки
rcall zader1 ;подпрограмма формирования задержки1
rjmp gg
kk: nop
rcall zader ;подпрограмма формирования задержки
;формирование опроса адреса
gg: nop
;i- двухбайтное число
clz
inc i ;увеличение младшего байта
cpi i, $FF
brne rty ;проверка переполнения мл байта
clr i
inc i1 ;увеличение старшего байта
rty: nop
clz
inc s ;увеличение младшего байта
cpi s, $FF
brne rtu ;проверка переполнения мл байта
clr s
inc s1 ;увеличение старшего байта
rtu: nop
;опрос адреса
rcall opros ;подпрограмма опроса таблицы
nop
clr tmp
out PORTB, tmp
rcall zader
nop
sbi PORTB, 2
sbi PORTB, 1
rcall zader
mov tmp2, r4
nop
rcall pered ;подпрограмма передачи в ЦАП
mov r4, tmp2
;больше 360=168h?
cls
nop
cpi s1, $01
brlt gg ;проверка переполнения ст байта
nop
cls
cpi s, $68
brlt gg ;проверка переполнения мл байта
nop
rjmp nStart ;возвращение на начало цикла

;Настройка АЦП
adcn: 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 ;запуск АЦП на преобразование
;Сохранение данных АЦП
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
rjmp awe
;среднее арифметическое действие
ass: nop
clr r8
clc
add tmp2, r2
adc r9, r8
add tmp2, r4
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
nop
ret
;подпрограмма передачи данных в ЦАП
;младший байт s
;старший байт s1
pered: nop
ldi tmp2, $08
cbi PORTB, 1
wer: nop
dec tmp2
cpi tmp2, $01
brlt vor
cbi PORTB, 2
;временная задержка
nop
wdr
ldi ZL, $E7
ldi ZH, $03
ddd: sbiw ZL, 1
brne ddd
sbi PORTB, 1
clc
rol s1 ;сдвиг влево через перенос
brcs poi ;переход если перенос установлен
cbi PORTB, 0
rjmp redw
poi: nop
sbi PORTB, 0
nop
redw: nop
wdr
ldi ZL, $E7
ldi ZH, $03
ddd2: sbiw ZL, 1
brne ddd2
cbi PORTB, 1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi PORTB, 0
wdr
ldi ZL, $E7
ldi ZH, $03
ddd3: sbiw ZL, 1
brne ddd3
rjmp wer
vor: nop
wer3: nop
dec tmp2
cpi tmp2, $01
brlt vor2
cbi PORTB, 2
;временная задержка
nop
wdr
ldi ZL, $E7
ldi ZH, $03
ddd6: sbiw ZL, 1
brne ddd6
sbi PORTB, 1
clc
rol s ;сдвиг влево через перенос
brcs poi1 ;переход если перенос установлен
cbi PORTB, 0
rjmp redw2
poi1: nop
nop
redw2: nop
wdr
ldi ZL, $E7
ldi ZH, $03
ddd7: sbiw ZL, 1
brne ddd7
cbi PORTB, 1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi PORTB, 0
wdr
ldi ZL, $E7
ldi ZH, $03
ddd8: sbiw ZL, 1
brne ddd8
rjmp wer3
vor2: nop
sbi PORTB, 0
nop
ret

;Подпрограмма задержки включения
zader: nop
wdr
clr M
clr Y
ldi Y, $AF
cpi tmp3, $00
brne goo
ldi M, $01
add M, tmp3
nop
goo: nop
mov M, tmp3
dm: nop
cpi tmp2, $00
brne goq
ldi X, $01
add X, tmp2
nop
goq: nop
mov X, tmp2
dv: nop
wdr
nop
dx: dec Y
brpl dx
cln
dec X
brpl dv
cln
dec M
brne dm
ret
;Подпрограмма задержки 1 без АЦП
zader1: nop
wdr
clr M
clr Y
ldi Y, $CF
cpi tmp3, $00
brne goo1
ldi M, $01
add M, tmp3
nop
goo1: nop
mov M, tmp3
dm1: nop
cpi tmp2, $00
brne goq1
ldi X, $01
add X, tmp2
nop
goq1: nop
mov X, tmp2
dv1: nop
wdr
nop
dx1: dec Y
brpl dx1
cln
dec X
brpl dv1
cln
dec M
brne dm1
ret
;Подпрограмма опроса
opros: nop
ldi ZH, high(2*prog1)
ldi ZL, Low(2*prog1)
Add ZL, pir
LPM
mov pir, adr
ret


.org $300
prog1:
.DB $02, $00, $02, $09, $02, $12, $02, $1B
.DB $02, $24, $02, $2D, $02, $36, $02, $3E
.DB $02, $47, $02, $50, $02, $59, $02, $62
.DB $02, $6A, $02, $73, $02, $7C, $02, $85
.DB $02, $8D, $02, $96, $02, $9E, $02, $A7
.DB $02, $AF, $02, $B7, $02, $C0, $02, $C8
.DB $02, $D0, $02, $D8, $02, $E0, $02, $E8
.DB $02, $F0, $02, $F8, $03, $00, $03, $08
.DB $03, $0F, $03, $17, $03, $1E, $03, $26
.DB $03, $2D, $03, $34, $03, $3B, $03, $42
.DB $03, $49, $03, $50, $03, $57, $03, $5D
.DB $03, $64, $03, $6A, $03, $70, $03, $76
.DB $03, $7C, $03, $82, $03, $88, $03, $8E
.DB $03, $93, $03, $99, $03, $9E, $03, $A3
.DB $03, $A8, $03, $AD, $03, $B2, $03, $B7
.DB $03, $BB, $03, $C0, $03, $C4, $03, $C8
.DB $03, $CC, $03, $D0, $03, $D4, $03, $D7
.DB $03, $DB, $03, $DE, $03, $E1, $03, $E4
.DB $03, $E7, $03, $EA, $03, $EC, $03, $EF
.DB $03, $F1, $03, $F3, $03, $F5, $03, $F7
.DB $03, $F8, $03, $FA, $03, $FB, $03, $FC
.DB $03, $FD, $03, $FE, $03, $FF, $03, $FF
.DB $04, $00, $04, $00, $04, $00, $04, $00
.DB $04, $00, $03, $FF, $03, $FF, $03, $FE
.DB $03, $FD, $03, $FC, $03, $FB, $03, $FA
.DB $03, $F8, $03, $F7, $03, $F5, $03, $F3
.DB $03, $F1, $03, $EF, $03, $EC, $03, $EA
.DB $03, $E7, $03, $E4, $03, $E1, $03, $DE
.DB $03, $DB, $03, $D7, $03, $D4, $03, $D0
.DB $03, $CC, $03, $C8, $03, $C4, $03, $C0
.DB $03, $BB, $03, $B7, $03, $B2, $03, $AD
.DB $03, $A8, $03, $A3, $03, $9E, $03, $99
.DB $03, $93, $03, $8E, $03, $88, $03, $82
.DB $03, $7C, $03, $76, $03, $70, $03, $6A
.DB $03, $64, $03, $5D, $03, $57, $03, $50
.DB $03, $49, $03, $42, $03, $3B, $03, $34
.DB $03, $2D, $03, $26, $03, $1E, $03, $17
.DB $03, $0F, $03, $08, $03, $00, $02, $F8
.DB $02, $F0, $02, $E8, $02, $E0, $02, $D8
.DB $02, $D0, $02, $C8, $02, $C0, $02, $B7
.DB $02, $AF, $02, $A7, $02, $9E, $02, $96
.DB $02, $8D, $02, $85, $02, $7C, $02, $73
.DB $02, $6A, $02, $62, $02, $59, $02, $50
.DB $02, $47, $02, $3E, $02, $36, $02, $2D
.DB $02, $24, $02, $1B, $02, $12, $02, $09
.DB $02, $00, $01, $F7, $01, $EE, $01, $E5
.DB $01, $DC, $01, $D3, $01, $CA, $01, $C2
.DB $01, $B9, $01, $B0, $01, $A7, $01, $9E
.DB $01, $96, $01, $8D, $01, $84, $01, $7B
.DB $01, $73, $01, $6A, $01, $62, $01, $59
.DB $01, $51, $01, $49, $01, $40, $01, $38
.DB $01, $30, $01, $28, $01, $20, $01, $18
.DB $01, $10, $01, $08, $01, $00, $00, $F8
.DB $00, $F1, $00, $E9, $00, $E2, $00, $DA
.DB $00, $D3, $00, $CC, $00, $C5, $00, $BE
.DB $00, $B7, $00, $B0, $00, $A9, $00, $A3
.DB $00, $9C, $00, $96, $00, $90, $00, $8A
.DB $00, $84, $00, $7E, $00, $78, $00, $72
.DB $00, $6D, $00, $67, $00, $62, $00, $5D
.DB $00, $58, $00, $53, $00, $4E, $00, $49
.DB $00, $45, $00, $40, $00, $3C, $00, $38
.DB $00, $34, $00, $30, $00, $2C, $00, $29
.DB $00, $25, $00, $22, $00, $1F, $00, $1C
.DB $00, $19, $00, $16, $00, $14, $00, $11
.DB $00, $0F, $00, $0D, $00, $0B, $00, $09
.DB $00, $08, $00, $06, $00, $05, $00, $04
.DB $00, $03, $00, $02, $00, $01, $00, $01
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, $00, $00, $01, $00, $01, $00, $02
.DB $00, $03, $00, $04, $00, $05, $00, $06
.DB $00, $08, $00, $09, $00, $0B, $00, $0D
.DB $00, $0F, $00, $11, $00, $14, $00, $16
.DB $00, $19, $00, $1C, $00, $1F, $00, $22
.DB $00, $25, $00, $29, $00, $2C, $00, $30
.DB $00, $34, $00, $38, $00, $3C, $00, $40
.DB $00, $45, $00, $49, $00, $4E, $00, $53
.DB $00, $58, $00, $5D, $00, $62, $00, $67
.DB $00, $6D, $00, $72, $00, $78, $00, $7E
.DB $00, $84, $00, $8A, $00, $90, $00, $96
.DB $00, $9C, $00, $A3, $00, $A9, $00, $B0
.DB $00, $B7, $00, $BE, $00, $C5, $00, $CC
.DB $00, $D3, $00, $DA, $00, $E2, $00, $E9
.DB $00, $F1, $00, $F8, $01, $00, $01, $08
.DB $01, $10, $01, $18, $01, $20, $01, $28
.DB $01, $30, $01, $38, $01, $40, $01, $49
.DB $01, $51, $01, $59, $01, $62, $01, $6A
.DB $01, $73, $01, $7B, $01, $84, $01, $8D
.DB $01, $96, $01, $9E, $01, $A7, $01, $B0
.DB $01, $B9, $01, $C2, $01, $CA, $01, $D3
.DB $01, $DC, $01, $E5, $01, $EE, $01, $F7
.DB $02, $00

.EXIT


т.к. я еще новичок для меня это очень трудный код! пробовал откомпилировар в авр студио, не получилось т.к. мне выдавались ошибки о синтактических ошибках!

помогите кто чем может в разбирании кода!
если что не хватает напишите по мере моих сил постараюсь дополнить!
ILYAUL
Этот код не для Tiny15 . Где Вы его взяли?
dimoni4
из книжки 10 практических уроков для AVR
rezident
Цитата(dimoni4 @ Mar 19 2010, 07:17) *
из книжки 10 практических уроков для AVR
Вы считаете, что это настольная книга каждого эмбеддера? Поэтому и ни автора, ни издательства, ни года выпуска указывать не требуется? Для примера даже у Х и Х (догадайтесь-ка, кто это?) "Искусство схемотехники" как минимум пять переизданий и три перевода претерпело . А эта-то книга по популярности среди любителей электроники далеко впереди, в отличие от какой-то неизвестной с 10ю уроками по AVR.
RodionGork
Цитата(dimoni4 @ Mar 19 2010, 05:17) *
из книжки 10 практических уроков для AVR


Так вы посмотрите внимательнее - может быть в книжке кроме текста программы ещё слова какие-то написаны? ;-)))

Программа нормальная, хотя как уже отметили там действительно кое-что по-мелочи попутано... С иных точек зрения она действительно не для tiny15, а с каких-то в общем я других мало знаю контроллеров к которым она по периферии подойдёт... Может кто-то писал её для tiny15, но задумался... ;-)))

Или я не вчитался.

Короче.

Программа несложная. Я похожую года три назад в качестве курсовика сдавал, как раз на tiny15 - она не только звуки воспроизводила, но ещё и воспроизводила их считывая запись нот мелодии из внешней ЕЕПРОМ, куда сама же могла из записать если её подключали к ком-порту и вводили данные с терминала. Прелесть была а не программа. ;-))))))))))))))))))))))))))))))

Так и что вы имеете в виду под словом "помогите разобраться"? Вы хотите чтобы кто-то из товарищей посидел с вами и по пунктам сказал что делает каждый кусочек, а вы бы в тетрадочку записали? Или лучше жирные комменты в программе расставил...

Мне бы лень было. А обитающим здесь гуру - тем более. Это ж типа занятий с репетитором... Зачем у репетиторов хлеб отбивать? 500р в час и бла-бла-бла... ;-)

Но ведь это в целом всё в вашей книжке уже отчасти должно быть... В такой мере чтобы разобраться.

Если вы не против, давайте так поступим:
- курите внимательно вашу книжечку;
- выполните остальные "уроки" из неё - я почему-то думаю что это не первый;
- читайте доп литературу, в т.ч. мануал по микроконтроллеру ;-)))))))
- если будут конкретные вопросы - спросите - и вам с радостью ответят, правильно?

(вопрос "что это за программа и почему она не работает" - не очень конкретный)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.