суть программы основана на работе цап и ацп! а точнее синтезирование звуковых сигналов!
вот код из ассемблера:
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
т.к. я еще новичок для меня это очень трудный код! пробовал откомпилировар в авр студио, не получилось т.к. мне выдавались ошибки о синтактических ошибках!
помогите кто чем может в разбирании кода!
если что не хватает напишите по мере моих сил постараюсь дополнить!