на АТтини 2313 11.0592 Мгц
на выход таймера 1 выход Б повесил ,через транзисторню сборку (UNL2003), писчалку KPX 1205B
писчалка играет музыку
но очень противно звучит
чую что надо убрать верхние частоты RC фильтром
номера нот ноты частоты значение ICT1 для генерации частоты
57 F5 698,4560 989,6113714
56 E5 659,2550 1048,456212
55 D#5 622,2540 1110,800413
54 D5 587,3300 1176,851174
53 C#5 554,3650 1246,831961
52 C5 523,2510 1320,972153
51 B4 493,8830 1399,521749
50 A#4 466,1640 1482,73998
49 A4 440,0000 1570,909091
48 G#4 415,3050 1664,318994
47 G4 391,9950 1763,287797
46 F#4 369,9940 1868,138402
45 F4 349,2280 1979,222743
44 E4 329,6280 2096,909243
но вот теперь вопросы:
как выбрать частоту среза опираясь на ноты (частоты играемые у меня)
как выбрать сопротивление (R=Xc при частоте среза)
в какой схеме установить фильтр на выходе МК или на выходе транзисторной сборки
прога мк если надо
Код: Выделить всё
.include "tn2313def.inc"
rjmp RESET ; Reset Handler
reti ; External Interrupt0 Handler
reti ; External Interrupt1 Handler
rjmp t1overi ; Timer1 Capture Handler
rjmp t1overi ; Timer1 CompareA Handler
rjmp t1overi ; Timer1 Overflow Handler
rjmp t0overi ; Timer0 Overflow Handler
reti ; USART0 RX Complete Handler
reti ; USART0,UDR Empty Handler
reti ; USART0 TX Complete Handler
reti ; Analog Comparator Handler
reti ; Pin Change Interrupt
rjmp t1overi; Timer1 Compare B Handler
reti ; Timer0 Compare A Handler
reti ; Timer0 Compare B Handler
reti ; USI Start Handler
reti ; USI Overflow Handler
reti ; EEPROM Ready Handler
reti ; Watchdog Overflow Handler
////////////////////////////////////////////////////////////////////////////////////
USART_Init:
///// speed cpu 11.0592, 232speed 9600 , X20, UBRR=71
; Set baud rate
ldi r16,71
ldi r17,0
out UBRRH, r17
out UBRRL, r16
; Enable receiver and transmitter
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16
; Set frame format: 8data, 1stop bit
ldi r16, (0<<USBS)|(3<<UCSZ0)
out UCSRC,r16
ret
//////////////////////////////////////////////////////////////////////////////
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
in r31, UDR
ret
//////////////////////////////////////////////////////
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE
rjmp USART_Transmit
; Put data (r16) into buffer, sends the data
out UDR,r30
ret
////////////////////////////////////////////////
LoadM:
clr r16
clr r17
clc
ldi r31,HIGH(music*2)
ldi r30,LOW(music*2)
ldi r26,100
LM1:
//
lpm r0,Z+
//
st X+,r0
inc r16
cpi r16,75
brne LM1
ret
///////////////////////////////////////////////
PlayM:
ldi r26,100
ldi r16,(0<<CS00) //stopt0
out TCCR0B,r16
ldi r16,(1<<TOIE0) //interupt
out TIMSK,r16
ldi r16,0 //start pos
out TCNT0,r16
ldi r16,(4<<CS00) //speed
out TCCR0B,r16
ldi r30,3
rcall USART_Transmit
//ledon
//ldi r16,(1<<3)
//out DDRB,r16
//out PORTB,r16
ldi r16,(1<<4)
out DDRB,r16
////////////////////
ldi r16,(1<<COM1A0) | (1<<COM1B0) | (0<<WGM10)
out TCCR1A,r16
ldi r16,(2<<CS10)|(3<<WGM12)
out TCCR1B,r16
/////////////
ldi r30,2
rcall USART_Transmit
///
clr r19
M1:
ldi r16,(1<<4)
//ldi r16,HIGH(2097)
ld r16, X+
out ICR1H,r16
ld r16, X+
out ICR1L,r16
ld r18,X+
sei
d1:
cpi r18,0
brne d1
inc r19
mov r30,r19
rcall USART_Transmit
cpi r19,25
brne M1
ret
/////////////////////////////////////////////
t0overi:
cli
//push r16
cpi r18,0
brne t0overin
t0overie:
//ledof
//ldi r16,(0<<3)
//out DDRB,r16
//out PORTB,r16
ldi r16,(0<<4)
out DDRB,r16
cli
//pop r16
reti
t0overin:
dec r18
//ddepop r16
sei
/*in r16, ICR1L
ldi r17,1
adc r16,r17
out ICR1L,r16
//mov r30,r16
//rcall USART_Transmit
in r16, ICR1H
ldi r17,0
adc r16,r17
out ICR1H,r16
*/
reti
////////////////////////////////////////////////////
t1overi:
/*clc
cli
in r16, ICR1L
ldi r17,1
adc r16,r17
out ICR1L,r16
in r16, ICR1H
ldi r17,0
adc r16,r17
out ICR1H,r16
sei
*/
reti
RESET:
ldi r16,(0<<3)
//out DDRB,r16
out PORTB,r16
//inits
rcall USART_Init
rcall LoadM
MAIN:
rcall USART_Receive
cpi r31,66 // 'B' beep
breq beep
cpi r31,86 ; 'V' check version, for finding in manager
breq mversion
cpi r31,82 ; 'R' reset
breq RESET
cpi r31,02 ; 02 led on
breq ledon
cpi r31,00 ; 00 led off
breq ledoff
cpi r31,83 ; 'S' gerkon status
breq gerkon
rjmp MAIN
beep:
rcall PlayM
rjmp MAIN
ledon:
ldi r16,(1<<3)
out DDRB,r16
out PORTB,r16
rjmp MAIN
//////////////////////////
ledoff:
ldi r16,(0<<3)
out DDRB,r16
out PORTB,r16
rjmp MAIN
////////////////////////////////////////////
gerkon:
ldi r30,83
rcall USART_Transmit
in r16,PINB
ldi r17,0b11100000
and r16,r17
lsr r16
lsr r16
lsr r16
lsr r16
lsr r16
/*
lsr r16
rol r17
lsr r16
rol r17
lsr r16
rol r17
lsr r16
rol r17
lsr r16
rol r17
lsr r16
rol r17
lsr r16
rol r17
lsr r16
*/
ldi r17,0b00110111
eor r16,r17
mov r30,r16
rcall USART_Transmit
clr r16
//out PORTB,r16
rjmp MAIN
mversion:
// TSE-21
//send answer on V to finding in soft
ldi r30,0x54
rcall USART_Transmit
ldi r30,0x53
rcall USART_Transmit
ldi r30,0x45
rcall USART_Transmit
ldi r30,0x2D
rcall USART_Transmit
ldi r30,0x32
rcall USART_Transmit
ldi r30,0x31
rcall USART_Transmit
rjmp MAIN
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
rjmp RESET
.CSEG /// /// /// /// /// /// ./// ////////////// /// /// //// /// /// /// /// /// /// /// /// /// /// /// /// // //////////
music: .db HIGH(2097),LOW(2097),43, HIGH(1321),LOW(1321),43, HIGH(1321),LOW(1321),86, HIGH(1177),LOW(1177),21, HIGH(1321),LOW(1321),21, HIGH(1399),LOW(1399),43,HIGH(1571),LOW(1571),43,HIGH(1571),LOW(1571),43,HIGH(2097),LOW(2097),64,HIGH(1321), LOW(1321),64,HIGH(1321),LOW(1321),43,HIGH(1177),LOW(1177),21,HIGH(1321),LOW(1321),21,HIGH(1571),LOW(1571),43, HIGH(1571),LOW(1571),43,HIGH(2097),LOW(2097),43,HIGH(1321),LOW(1321),64,HIGH(1321),LOW(1321),64,HIGH(1177), LOW(1177),21,HIGH(1321),LOW(1321),21,HIGH(1399),LOW(1399),64,HIGH(1571),LOW(1571),64,HIGH(1664),LOW(1664),21, HIGH(1571),LOW(1571),21,HIGH(1399),LOW(1399),191
просто хочу практического совета





