Atmega8 melodije zvonjenja. Preproste zvočne sirene na MK AVR. Uporaba zvočnega modula

Članek opisuje principe glasbene sinteze na AVR. Priložena programska oprema vam omogoča pretvorbo katere koli midi datoteke v vir v C za mikrokrmilnike AVR za dodajanje predvajanja glasbenih fragmentov že pripravljenim razvojem. Obravnavan je primer uporabe programske opreme v glasbeni skrinjici.

Najprej kratek video, kako vse skupaj deluje:

Kaj omogoča programska oprema

Računalniška programska oprema vam omogoča pridobitev vira C za CodeVision AVR, ki predvaja izbrano midi datoteko:

1. Povežite common\hxMidiPlayer.h, common\hxMidiPlayer.c s svojim projektom. Kopirajte predloge ATMega8Example\melody.h, ATMega8Example\melody.c, ATMega8Example\hxMidiPlayer_config.h in se povežite.
2. Zaženite MidiToC.exe
3. Naložite datoteko Midi.
4. Nastavite predvajalnik: hitrost vzorčenja, število kanalov, valovno obliko itd. Programska oprema predvaja melodijo na enak način, kot jo bo predvajal AVR.
5. Kliknite »Ustvari konfiguracijo predvajalnika« in prilepite vir v hxMidiPlayer_config.h.
6. Kliknite »Ustvari kodo melodije« in prilepite izvor v melody.c
7. V našem projektu implementiramo metodo Player_Output() za izhod zvoka prek PWM ali zunanjega DAC.
8. Nastavite časovnik na hitrost vzorčenja in pokličite Player_TimerFunc() iz prekinitve.
9. Pokličite Player_StartMelody(&s_melody, 0).

Melodija se predvaja od prekinitve časovnika. To pomeni, da lahko mikrokrmilnik med predvajanjem opravlja tudi koristno delo.

Kako deluje

V nadaljevanju članka bom poskušal na kratko razložiti, kako se vse to izvaja. Žal ne bo zelo kratek – materiala je veliko. Če vas ne zanima, lahko takoj odprete razdelka »Opis programske opreme« in »API predvajalnika«.

Kaj je glasba

Glasba je zaporedje zvokov različnih frekvenc in trajanja. Frekvenca osnovnega harmonika zvoka mora ustrezati frekvenci določene note. Če se frekvenca nihanja zvokov razlikuje od frekvenc not, se nam zdi, da je glasbenik »neuglašen«.

Tabela. Opombe frekvenc, Hz.

Vse note so razdeljene na oktave, po 7 not v vsaki + 5 poltonov (črne tipke na klavirju). Frekvence not v sosednjih oktavah se razlikujejo natanko 2-krat.

Najenostavnejši predvajalnik glasbe vsebuje tabelo z zaporedjem not (nota + trajanje) melodije in tabelo s frekvencami not. Za sintetiziranje zvoka se uporablja eden od časovnih kanalov, ki tvori meander:

Na žalost ima tako primitiven igralec fiksno valovno obliko (kvadratni val), ki ni zelo podobna pravim glasbilom in lahko igra samo eno noto naenkrat.

Prava melodija vsebuje vsaj dva dela (solo + bas), pri igranju na klavirju pa prejšnja nota še vedno zveni, ko se začne naslednja. To je enostavno razumeti, če se spomnimo zgradbe klavirja - vsaka nota ustreza ločeni struni. S potegom rok po tipkah lahko poskrbimo za zvok več strun hkrati.

Nekateri mikrokontrolerji imajo več časovnih kanalov, ki jih je mogoče uporabiti za predvajanje več not hkrati. Toda običajno so ti kanali dragocen vir in ni priporočljivo, da jih uporabite vseh. Razen seveda, če samo izdelujemo glasbeno skrinjico.
Za pridobitev polifonije in različnih zvokov glasbenih instrumentov morate uporabiti sintezo zvoka.

Sinteza zvoka na AVR

hxMidiPlayer uporablja zvočno sintezo in lahko predvaja polifonijo z različnimi valovnimi oblikami. Predvajalnik izračuna amplitudo izhodnega signala v obdelovalniku prekinitve časovnika s frekvenco 8-22 KHz (koliko procesorske moči je dovolj; odvisno tudi od valovne oblike in števila kanalov).

Načelo sinteze zvoka je mogoče pojasniti na primeru sinusne sinteze.

Vzemimo tabelo velikosti 64, v vsaki celici katere so vrednosti sinusne amplitude zapisane v indeksu točk * 2 * PI / 64 (eno obdobje):

Statični flash uint8_t s_sineTable [ 64 ] = ( 0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x93, 0x93, 0x94, 0x95, 0x95, 0x9 5, 0x95, 0x95, 0x94 , 0x93, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7E, 0x7C, 0x7A, 0x78, 0x76, 0x74, 0x73, 0 x7 1, 0x70, 0x6F, 0x6D, 0x6D, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x7E );

128 (0x80) ustreza ničli, 255 (0xff) največji pozitivni točki, 0 največji negativni točki.

Zdaj pa recimo, da bomo vrednosti iz tabele oddali v zunanji DAC v prekinitvi časovnika, ki se kliče pri frekvenci 1000 Hz:

Statični uint8_t s_index = 0; // Primerjava izhoda Timer1 Prekinitvena rutina prekinitvene storitve void timer1_compa_isr(void) ( SetDac(s_sineTable[ s_index]); if (s_index == 63) ( s_index = 0; ) else ( s_index++; ) )

Kaj bomo dobili kot rezultat? Dobili bomo sinusna nihanja s frekvenco 1000/64 Hz.

Zdaj povečajmo indeks v prekinitvi ne za 1, ampak za dva.
Očitno bo izhodna frekvenca nihanja že 1000/64 * 2 Hz.

Na splošno, če želite dobiti frekvenco F, morate povečati indeks v tabeli za:
seštej = F / 1000 * 64

To število je lahko delno, vendar se za doseganje visoke hitrosti uporablja aritmetika s fiksno vejico.

Število vnosov v tabeli in frekvenca časovnika vplivata na kakovost sintetiziranega zvoka. V našem primeru zadošča 64 vnosov v tabeli na periodo, frekvenca časovnika pa je 12kHz. Najmanjša sprejemljiva frekvenca časovnika je 8 kHz, idealna je 44 kHz.

Očitno je, da lahko s frekvenco časovnika 12 kHz ustvarimo največ 6 kHz kvadratnih valov, saj moramo narediti vsaj dve stikali na obdobje. Vendar pa bodo višje frekvence še vedno prepoznavne, če je izhodno stanje pravilno izračunano ob vsakem tikku časovnika.

V tabelo lahko vnesete vrednosti za obdobje nesinusoidnih nihanj in dobite drugačen zvok.

Slabljenje

Če glasbilo temelji na strunah (na primer klavir), potem po pritisku na tipko zvok gladko izzveni. Da bi dobili bolj naraven zvok sintetizatorja, morate gladko zmanjšati amplitudo tresljajev po začetku note ("zaviti" tresljaje v obliko dušenja - "ovojnico").

Predvajalnik vsebuje tabelo upadanja, ki jo uporablja za zmanjšanje amplitude sinusa (ali druge valovne oblike) od trenutka, ko se nota začne.
"Sine", "zavit" v takšno lupino, spominja na zvok mehanske glasbene skrinjice.

Sinteza meandra

Posebna oblika vala meandra omogoča bistveno poenostavitev sinteze. Tabele se v tem primeru ne uporabljajo. Dovolj je izračunati, kakšno stanje (1 ali 0) mora imeti izhod pri določeni frekvenci ob trenutnem tiku časovnika. To se izvede z uporabo celoštevilske aritmetike in deluje zelo hitro, kar pojasnjuje priljubljenost uporabe kvadratnega vala za predvajanje melodij v 8-bitnih set-top boxih.

Primer: deklaracija števca:

Statični uint16_t s_števec = 0;

ki ga bomo povečali za 0x8000 pri vsaki prekinitvi časovnika, najpomembnejši bit števca pa bo izhod v vrata:

// Primerjava izhoda Timer1 A prekinitvena rutina storitve prekinitev void timer1_compa_isr(void) ( PORTA.0 = (s_counter >> 15) & 1; s_counter += 0x8000; )

Ker je 0x8000 + 0x8000 = 0x10000, se spremenljivka s_counter prelije, 17. bit se zavrže in 0x0000 se zapiše v spremenljivko.
Tako bo s frekvenco časovnika 8 KHz izhod kvadratni val 4 KHz.
Če povečate števec za 0x4000, dobite kvadratni val 2KHz.

Na splošno lahko frekvenco F dobite tako, da dodate:
dodaj = F / 8000 * 0x10000

Če želite na primer dobiti kvadratni val s frekvenco 1234Hz, morate dodati 0x277C. Dejanska pogostost se bo nekoliko razlikovala od podane, ker izraz zaokrožujemo na celo število. To je sprejemljivo v sintetizatorju.

Sinteza zvokov pravih instrumentov

Zvok note pred klavirjem lahko digitalizirate (z uporabo ADC za shranjevanje vrednosti amplitude zvoka v pomnilnik v rednih intervalih):
in nato predvajajte zvok (z uporabo DAC za izpis posnetih vrednosti v rednih intervalih).

Na splošno morate za sintetiziranje bobnov posneti zvoke bobnov in jih predvajati v pravem trenutku. V 8-bitnih konzolah se namesto zvokov bobnov uporablja "beli šum". Vrednosti amplitude za "beli šum" se pridobijo z generatorjem naključna števila. Stroški pomnilnika so minimalni.
hxMidiPlayer uporablja "beli šum" za sintezo bobna.

Mešanje kanalov

Amplituda zvoka pri danem časovniku se izračuna za vsak kanal posebej. Če želite dobiti končno vrednost amplitude, morate dodati vrednosti vseh kanalov. Pravilno je treba prilagoditi vsoto, saj je zaznana glasnost podrejena logaritemski odvisnosti, vendar se boste v tako preprostem sintetizatorju morali zadovoljiti s preprostim seštevanjem. Zato je največja amplituda vsakega kanala 255/N.

Oddajanje zvoka iz AVR

Po izvedbi vseh potrebnih izračunov igralec prejme nivo signala, ki ga je treba pretvoriti v analogni. Za te namene lahko uporabite zunanji DAC ali PWM.
Tukaj je treba opozoriti, da je v obeh primerih priporočljivo filtrirati prejeti signal - odstraniti visokofrekvenčni šum, ki nastane zaradi nizke frekvence sinteze in zaokroževanja.

Izhod na zunanji vzporedni DAC

Ker ni smiselno uporabljati natančnih čipov DAC, se takšni projekti običajno zadovoljijo z matriko R2R:

S to shemo preprosto izpišemo izračunano amplitudo v vrata:

PORTB = vzorec;

Napake:
1) tudi izhod matrike R2R šibek signal, obvezna je uporaba analognega ojačevalnika;
2) potrebno je uporabiti vsaj 5 zatičev (po možnosti 8);
Ta metoda je upravičena le, če ni prostih kanalov PWM.

(za shranjevanje pinov lahko uporabite zunanji ADC z vmesnikom SPI).

PWM

Če obstaja brezplačen kanal PWM, je najlažji način, da uporabite to metodo.

Inicializacija PWM (ATMega8):

// Inicializacija časovnika/števca 2 // Vir ure: Sistemska ura // Vrednost ure: 20000.000 kHz // Način: hitra PWM top=0xFF // Izhod OC2: neinvertirana PWM ASSR=0x00; TCCR2=0x69; TCNT2=0x00; OCR2=0x00; In vzorčni izhod: void Player_Output(uint8_t sample) ( OC2 = vzorec. )

Običajna praksa za uporabo PWM vključuje glajenje izhodnega signala z uporabo RC filtra:

Na žalost je po filtriranju signal preveč oslabljen, zato morate za priključitev zvočnika narediti analogni ojačevalnik.

Za poenostavitev vezja je bolje, da ostanete "digitalni" do samega zvočnika. Ker poceni zvočnik še vedno ne more reproducirati frekvenc nad 30 kHz, jih ni treba filtrirati. Difuzor bo sam "filtriral" visoke frekvence PWM.

Če potrebujete več toka, lahko uporabite tranzistorski ojačevalnik. R1 je izbran tako, da zagotavlja potreben tok zvočniku.

Tako lahko povežete majhne zvočnike iz igrač:

Za večje zvočnike je bolje sestaviti pogon z 2 tranzistorjema in namestiti LC filter za odstranitev hrupa:

Kondenzator C1 služi za omejevanje toka skozi zvočnik, ko PWM ne deluje. Tudi zaradi vključitve serijskega kondenzatorja signal, ki je simetričen okoli ničle, doseže zvočnik. Tako se bo stožec zvočnika premaknil glede na sredinski "sproščeni" položaj, kar pozitivno vpliva na kakovost zvoka.
V tem primeru tranzistorji delujejo v preklopnem načinu, zato ni potrebe po kompenzaciji osnovnega odmika.

PWM, dvopolna povezava

Pomanjkljivost prvih dveh vezij je, da je zvočnik napajan s tokom v eno smer. Če spremenimo smer toka, lahko glasnost povečamo za 2-krat, ne da bi presegli dovoljeno moč. Da bi to naredili, je zvočnik povezan z dvema zatičema mikrokontrolerja - neobrnjenim in obrnjenim, na primer OC1A in /OC1A. Če ni neinvertiranega izhoda, lahko uporabite drugi kanal v invertiranem načinu (OC1B):

// Inicializacija časovnika/števca 1 // Vir ure: Sistemska ura // Vrednost ure: 24500.000 kHz // Način: Hitra PWM top=0x00FF // Izhod OC1A: Neinv. // Izhod OC1B: Obrnjen // Zmanjševalec hrupa: Izklopljen // Zajem vhoda na padajočem robu // Prekinitev prekoračitve Timer1: Izklopljena // Prekinitev zajemanja vhoda: Izklopljena // Primerjava prekinitve ujemanja A: Izklopljena // Primerjava prekinitve ujemanja B: Izklopljena TCCR1A =0xB1; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; void Player_Output(uint8_t sample) ( OCR1A = vzorec; OCR1B = vzorec; )

PWM, dva pina, ojačevalnik razreda D

Slabost predlaganih vezij je poraba toka med tišino.
"Tišina" za nas ustreza ravni signala 128, to je PWM s 50% polnjenjem - tok vedno teče skozi zvočnik!

Z rahlo spremembo programske opreme lahko dobite dokaj zmogljiv programski in strojni ojačevalnik razreda D:

Void Player_Output(uint8_t sample) ( if (sample >= 128) ( TCCR2=0x21; //normalno, jasno pri primerjalnem ujemanju TCCR2=0x21 | 0x80; //CLEAR OC2 PORTC.0 = 0; TCCR2=0x69; //non -obračanje PWM OCR2 = (vzorec-128) * 2; ) sicer // če (vzorec< 128) { TCCR2=0x31; //normal, set on compare match TCCR2=0x31 | 0x80; //SET OC2 PORTC.0 = 1; TCCR2=0x79; //inverting PWM OCR2 = (128-sample) *2; } }

V tem primeru je en par tranzistorjev priključen na izhod PWM, drugi pa na običajni digitalni izhod.

Kot lahko vidite iz kode, signal nad 128 obravnavamo kot tok, usmerjen v eno smer, signal pod 128 pa kot tok, usmerjen v drugo smer. Pri 128 sta oba zatiča zvočnika povezana z istim zatičem za napajanje in ni toka. Pri odstopanju od ravni 128 se polnjenje PWM poveča in skozi zvočnik teče tok ustrezne polarnosti.

Pomembna točka pri izvedbi je prisilni preklop izhoda PWM v želeno stanje v trenutku preklopa drugega (navadnega digitalnega) pina (PORTC.0). Zapisovanje v register OCR2 je medpomnilnik za odpravo napak PWM. Takoj moramo preklopiti izhod PWM, ne da bi čakali na konec obdobja.

Slednje vezje je IMHO najboljša možnost v smislu enostavnosti, prihranka energije in izhodne moči.

Zvočni izhod z valovno obliko SquareWave

Pri sintezi meandra se uporabljajo poenostavljeni algoritmi.

Vsak kanal (vključno z bobni) oddaja 0 ali 1. Tako 3-kanalni gramofon oddaja vrednosti v območju 0..3. Zato je pri uporabi PWM izhodni postopek videti takole:

Void Player_Output(vzorec uint8_t) ( OCR2 = vzorec * (255 / HXMIDIPLAYER_CHANNELS_COUNT); )

Če ne uporabljate PWM, sta za izhod 3-kanalne melodije dovolj dva običajna digitalna izhoda in 2-bitna matrika R2R.

MIDI format

Če pogledate nastalo kodo melodije, lahko zlahka vidite, da niz uporablja ponavljajoče se številke iz majhnega obsega. To je razumljivo: melodija uporablja omejeno število not znotraj 1-2 oktav, tempo melodije je fiksen - enake zakasnitve, število kanalov je v območju 0..15.
Vse to pomeni, da je mogoče nastalo matriko znatno zmanjšati z uporabo nekakšnega algoritma stiskanja.
Algoritmi, kot je ZIP, zagotavljajo dobro stiskanje, vendar zahtevajo tudi veliko pomnilnika za delovanje (ZIP slovar - 64 Kb). Uporabimo lahko zelo preprosto metodo stiskanja, ki ne zahteva tako rekoč nobenega pomnilnika, katere bistvo je naslednje.

V enem bajtu so vsa števila enakomerno porazdeljena v območju 0...255, vsako število pa je predstavljeno z 8 biti. V našem primeru so nekatere številke veliko pogostejše od drugih. Če številke, ki se pogosto pojavljajo, kodirate z manj bitov, redke pa z več, lahko pridobite spomin.

Izberemo fiksno metodo kodiranja: kombinacije bitov 000,001 in 010 (dolžina - 3 biti) bodo predstavljale 3 najpogosteje pojavljajoče se številke. Bitne kombinacije 0110, 0111 (dolžina – 4 biti) – naslednji 2 najpogostejši številki itd.:

//000..010 - 0..2 //011 x 3..4 //100 xx 5..8 //101 xxx 9..16 //110 xxx 17..24 //111 takoj

Kombinacija, ki se začne s 111 (dolžina – 11 bitov), ​​bo kodirala vse ostale številke.
Metoda bitnega kodiranja je lahko drugačna. Preizkusil sem več metod in izbral to, ki daje najboljše rezultate pri takih podatkih.

Postopek stiskanja izgleda takole:
1. Izračunajte skupno število števila X v toku za X = .
2. Razvrsti po padajoči pogostosti pojavljanja v toku.
3. Vzemite prvih 25 številk. Kodirani bodo v manj bitih.
4. Kodirajte vhodni tok.

Izhod je niz 25 najpogosteje pojavljajočih se števil in bitni tok.
To stiskanje vam omogoča, da dosežete 50-odstotno stiskanje z minimalnimi stroški pomnilnika in zmogljivosti. Na žalost to poveča kodo predvajalnika, zato stiskanje ni priporočljivo za kratke melodije.

Shranjevanje frekvenc not

Shranjevanje frekvenc vseh not v tabeli iz spomina je precej drago. Pravzaprav obstaja formula za določanje frekvence note z njeno midi številko:

F = 2^((N - 69)/12) * 440, Hz

Toda izračun frakcijske moči je precej težaven. Namesto tega predvajalnik shrani 12 notnih frekvenc v zgornji oktavi. Frekvence not v spodnjih oktavah se določijo tako, da se frekvenca zmanjša za 2^Y večkrat, kjer je Y število oktav navzdol.

Nadaljnji razvoj kompresije

Melodija pogosto vsebuje ponavljajoče se fragmente (»refrene«, »verze«). Z iskanjem ponavljajočih se fragmentov in predstavitvijo melodije v obliki fragmentov lahko melodijo zmanjšate za dodatnih 50%, pri čemer ne porabite skoraj nič časa Oven in produktivnost. Takšnega algoritma nisem implementiral, da ne bi kompliciral projekta.

Opis programske opreme

Glavno okno programa za pretvorbo:

Gumb Naloži midi vam omogoča nalaganje midi datoteke. Program takoj začne predvajati datoteko s trenutno izbranimi parametri in simulira zvok, ki bo v strojni opremi.

Okno z informacijami (4) prikazuje:
– Dolžina – dolžina izbranega fragmenta melodije v ms;
– Max Active synthesizer channels – največje število hkrati aktivnih sintetizatorskih kanalov;
– Max active drum channels – največje število hkrati aktivnih sintetizatorskih kanalov, ki reproducirajo »bobne«;
– Največje število aktivnih stereo not – največje število kanalov, ki predvajajo isto noto (glejte spodaj);
– Ocenjena velikost, bajti – velikost melodije v bajtih. V načinu »Vzorec po meri« je velikost prikazana kot A+B, kjer je A velikost melodije, B velikost vzorca. Velikost kode igralca tukaj ni navedena.

Okno napredka prikazuje trenutni položaj predvajanja.
Lahko kliknete na vrstico napredka, da začnete predvajanje od določene točke.
Vnosna polja na levi in ​​desni vam omogočajo, da določite začetek in konec fragmenta melodije v ms.

Oznaka »Ni dovolj kanalov za predvajanje melodije« v rdeči barvi pomeni, da ni dovolj kanalov sintetizatorja za predvajanje melodije s trenutnimi nastavitvami. Če predvajalnik ne najde prostega kanala, izklopi najstarejši zapis. V mnogih primerih bo to dobro delovalo. Število kanalov je smiselno povečati le takrat, ko melodija za uho zveni napačno.

Nastavitve lahko razdelimo na nastavitve predvajalnika in nastavitve obdelave datotek midi. Predvajalnik bo lahko predvajal nastalo kodo melodije, če sta bili konfiguracija predvajalnika in koda melodije ustvarjeni z istimi nastavitvami predvajalnika. Poleg tega bo predvajalnik lahko predvajal melodijo, katere koda je bila ustvarjena za predvajalnik z manjšim (vendar ne večjim) številom kanalov.

Nastavitve strojne opreme predvajalnika vključujejo:

– Sampling Rate – frekvenca sinteze. Največja frekvenca fuzije se določi eksperimentalno. Na podlagi Atmega 16MHz lahko začnete pri 12000Hz za predvajalnik s 6 kanali in ga povečate po želji, dokler v strojnem predvajalniku ne postane opazno popačenje melodije. Največja frekvenca je odvisna od števila kanalov, valovne oblike in kompleksnosti same melodije.

– Valovna oblika – valovna oblika:
– kvadratni val – meander;
– sinus – sinus;
– sinus + ovojnica – sinus z dušenjem;
– Waveform * + Envelope – različne možnosti za nesinusne valove z in brez slabljenja;
– Custom Sample – uporabite vzorec instrumenta.

Gumb »Naloži vzorec« vam omogoča nalaganje vzorca iz datoteke WAV. Datoteka WAV mora biti v PCM 8-bitni mono, 4173 Hz, C-5. Namig: lahko povečate frekvenco in znižate noto, vendar spremenite Pitch v nastavitvah predvajalnika. Ni preverjanja formata - če je format drugačen, se zvok ne bo predvajal pravilno.
Višina – omogoča spreminjanje višine zvoka. Na primer, če želite igrati 1 oktavo višje, morate nastaviti Pitch +12.

Uporabi stiskanje – uporabi stiskanje melodije.
Omogoči sintetizator bobnov – omogoči sintetizator bobnov.

Kanali predvajalnika: število kanalov sintetizatorja (največje število not, ki bodo zvenele hkrati).

Nastavitve obdelave datotek Midi vključujejo:

Običajno taka fina nastavitev ni potrebna. Te nastavitve lahko pustite privzete.

API predvajalnika

Izvedba predvajalnika se nahaja v datotekah Common\hxMidiPlayer.c in Common\hxMidiPlayer.h. Te datoteke morajo biti vključene v projekt. Prav tako morate ustvariti datoteko hxMidiPlayer_config.h, v katero morate postaviti konfiguracijo.
Predvajalnik je napisan v C brez montažnih vložkov, kar omogoča enostavno prenašanje na druge mikrokontrolerje.

Extern void Player_StartMelody(const flash TMelody* _pMelody, uint16_t _delay);

Začnite igrati melodijo. _delay nastavi začetni zamik pred predvajanjem, 255 enot = 1 sekunda.

Void Player_Stop();

Nehaj predvajati melodijo.

Extern bool Player_IsPlaying();

Vrne false, če je melodija končana.

Extern void Player_WaitFinish();

Počakajte, da se melodija predvaja.

Extern void Player_TimerFunc();

To funkcijo je treba poklicati v prekinitvi časovnika pri hitrosti vzorčenja, določeni v konfiguraciji. Ko se melodija predvaja, vam ni treba več klicati.

Extern void Player_Output(uint8_t vzorec);

Izvesti ga mora uporabnik. Prikliče ga igralec, ko je treba izpisati naslednji vzorec.

Extern void Player_Started();

Izvesti ga mora uporabnik. Pokliče se, ko igralec začne igrati melodijo. Uporablja se lahko za konfiguriranje prekinitev časovnika.

Extern void Player_Finished();

Izvesti ga mora uporabnik. Pokliče se, ko igralec zaključi z igranjem melodije. Uporablja se lahko za onemogočanje prekinitev časovnika ali za začetek predvajanja druge melodije.

//#define NOTES_TO_EEPROM //#define SINETABLE_TO_EEPROM //#define ENVELOPE_TO_EEPROM

Te vrstice morajo biti odkomentirane v datoteki hxMidiPlayer_config.h, če morajo biti tabela not, tabela sinusov in tabela slabljenja v eepromu.

Primeri projektov

ATMega644Example – projekt za ATMega644, 25MHz, PWM izhod na PB3.

Zahteve za pomnilnik

Tabela. Velikost predvajalnika in melodije v flash.

*pri dodajanju igralca obstoječemu nepraznemu projektu bo velikost kode manjša

**ni dovolj kanalov za normalno predvajanje melodij

Melodija 1: bach_minuet_in_g.mid, 35 sek
Melodija 2: yiruma-river_flows_in_you.mid, 165 s
Melodija 3: Franz Schubert – Serenade.mid, 217 sek

Kot lahko vidite iz tabele, lahko v minimalni konfiguraciji stisnete precej dolgo melodijo tudi v ATTiny2313. Stiskanje lahko zmanjša melodijo za več kot dvakrat, vendar se velikost kode predvajalnika poveča za ~600 bajtov.

Tabele sinusov in razpadov lahko postavite v EEPROM, s čimer prihranite približno 16, 50 oziroma 100 bajtov bliskavice.

Ko uporabljate vzorec iz datoteke wav, morate velikosti vzorca v bajtih dodati velikosti kode predvajalnika.

Primer uporabe

Kot primer uporabe predvajalnika si oglejmo postopek ustvarjanja glasbene skrinjice.

Vzamemo že pripravljeno škatlo iz MDF:

Kot mikrokontroler vzamemo ATTiny85 v ohišju SO-8 kot najcenejšega z dovolj veliko količino pomnilnika. Nadgradili ga bomo na 27 MHz, da bi dobili sintezno frekvenco 18 KHz s 4 kanali sinus + ovojnica.

Ojačevalec bo D razreda s 4 tranzistorji za varčevanje z baterijami.

Tranzistorji delujejo v preklopnem načinu in so lahko katere koli vrste. Induktor L1 in kondenzator C6 sta izbrana po okusu, da dobimo zvok brez visokofrekvenčnega šuma. R1 in R2 je mogoče povečati do 2K, da znižate glasnost in zmanjšate odboj zvočnikov.

Končno stikalo iz diskovnega pogona se popolnoma prilega, kot da bi bilo ustvarjeno posebej za škatlo (deluje tako, da se odpre - ko odprete pokrov, se na ploščo napaja napajanje):

Viri vdelane programske opreme se nahajajo v imeniku ATTiny85MusicBox.

8Kb ustreza:
1) predvajalnik: 18000Hz, 4 kanali, sinus + ovojnica, višina + 12, kompresija, predvaja melodije eno za drugo (zadnja je shranjena v EEPROM)
2) Yiruma – Reka teče v vas
3) Franz Schubert – Serenada
4) P.I. Čajkovski "Oktober"

Rezultat na videu:

Nadaljnji razvoj

Načeloma je mogoče predvajalnik nadalje razvijati in ga pripeljati do polnopravnega predvajalnika Midi ali MOD. Osebno menim, da bi bilo za kakovostno melodijo lažje priklopiti kartico SD in z nje predvajati vse datoteke WAV z veliko več najboljša kakovost kot je na splošno mogoče pridobiti s sintezo programske opreme. In takšen predvajalnik je programsko in strojno veliko preprostejši. Niša hxMidiPlayerja je dodajanje dobrega zvoka že pripravljenim projektom, ko je na voljo nekaj nog in malo prostora v bliskavici. S to nalogo se "odlično" spopada že v obstoječi obliki.

Mislim, da lahko to reši vprašanje ustvarjanja vseh vrst glasbenih skrinjic/zvonov na AVR :)

Nadaljevanje pouka je trajalo dolgo, kar je razumljivo, moral sem obvladati delo s spominskimi karticami in datoteko FAT sistem. A vseeno se je zgodilo, lekcija je pripravljena - pravzaprav novoletni čudež.

Da ne bi bil članek preobremenjen z informacijami, ne bom opisal strukture zapisa datoteke wav, informacij je v iskalnikih več kot dovolj. Dovolj je reči, da če odprete datoteko z nekakšnim hex urejevalnikom, potem prvih 44 bajtov vsebuje vse informacije o vrsti datoteke, hitrosti vzorčenja, številu kanalov itd. Če morate analizirati datoteko, preberite to glavo in srečni boste.

Podatki o koristnem tovoru se začnejo pri 44 bajtih in v bistvu vsebujejo nivoje napetosti, ki tvorijo zvok. O napetostnih nivojih smo že govorili v zadnjem delu lekcije. Tako je vse preprosto, te korake morate oddati zvočniku pri frekvenci vzorčenja datoteke.

Kako fizično povzročiti tresenje zvočnika? Te nivoje napetosti morate oddati s pomočjo PWM ali uporabiti R2R. V vsakem primeru je uporaba zelo enostavna, preberite številko, jo vstavite v OCR ali PORTx. Nato sem po določenem času zamenjal naslednjo vrednost in tako naprej do konca datoteke.

Primer, določena datoteka wav, podatki prihajajo iz bajtov 44=0x2C, tam je zapisana številka 0x80, zvok reproduciramo na primer s PWM prvega časovnika, napišemo OCR1A=0x80; Recimo, da je frekvenca vzorčenja vzorca 8 kHz, zato mora biti prekinitev nastavljena na isto frekvenco. V prekinitvi nadomestite naslednjo vrednost 0x85 po 1/8000 = 125 µs.

Kako nastaviti prekinitev na 8kHz? Spomnimo se, da če časovnik deluje na frekvenci 250 kHz, je treba primerjalni register prekinitev zamenjati (250/8)-1=31-1 ali 0x1E. Tudi pri PWM je vse preprosto; višja kot je frekvenca, na kateri deluje, bolje je.

Za delovanje vdelane programske opreme se strinjamo, da je bliskovni pogon formatiran v FAT32 z uporabo PetitFat lib iz lekcije 23.2. Datoteka je v formatu wav, 8 kHz ali 22,050 kHz, mono. Ime datoteke 1.wav. Analizirajmo vdelano programsko opremo.

#vključi #include "diskio.h" #include "pff.h" unsigned char buffer[ 512 ] ; /* medpomnilnik, v katerega se kopirajo informacije iz bliskovnega pogona */ volatile unsigned int count; //števec kopiranih podatkov prekinitev [TIM2_COMP] void timer2_comp_isr(void) //prekinitev, v kateri so vrednosti zamenjane( OCR1A = vmesni pomnilnik[ štetje] ; // oddaj zvok v zvočnikče (++ število >= 512) //povečaj števecštetje = 0; //če je 512 ponastavljen) void main(void) ( unsigned int br; /* števec branja/pisanja datoteke */ nepredznačeni char buf = 0; //spremenljivka, ki določa, kateri del medpomnilnika je prebran FATFS fs; /* Delovni prostor (predmet datotečnega sistema) za logične pogone */ PORTB= 0x00; DDRB= 0x02 ; //skočna podložka ocr1a // Inicializacija časovnika/števca 1// Vir takta: Sistemska ura // Vrednost takta: 8000.000 kHz // Način: Hitri PWM top=0x00FF // Izhod OC1A: Neinv. TCCR1A= 0x81; TCCR1B= 0x09; TCNT1= 0x00; OCR1A= 0x00 ; // Inicializacija časovnika/števca 2// Vir takta: Sistemska ura // Vrednost takta: 250.000 kHz // Način: CTC top=OCR2 TCCR2= 0x0B ; TCNT2= 0x00; //OCR2=0x1E; //nastavitev primerjalnega registra za 8kHz OCR2= 0xA ; //za 22kHz #asm("sei") // Inicializacija prekinitve časovnika/števcače (disk_initialize() == 0) //inicializirajte bliskovni pogon( pf_mount(&fs) ); //mount datotečni sistem pf_open("1.wav"); //odpri nit pf_lseek(44) ; //premaknite kazalec na 44 pf_read(medpomnilnik, 512,& br); //prvič pogoltnemo 512 bajtov naenkrat TIMSK= 0x80 ; //vklopi glasbo medtem (1) ( if (! buf && count> 255 ) //če je reproduciranih več kot 255 bajtov,(pf_read(& medpomnilnik[0], 256,& br); //nato preberemo informacije iz bliskovnega pogona v prvo polovico medpomnilnika buf= 1; če (br< 256 ) //če medpomnilnik ne vsebuje 256 vrednosti, pomeni konec datoteke odmor ; ) if (buf && count< 256 ) { pf_read(& buffer[ 256 ] , 256 ,& br) ; // preberite drugi del medpomnilnika z bliskovnega pogona buf = 0; če (br< 256 ) break ; } } TIMSK = 0x00 ; //глушим все pf_mount(0x00 ) ; //razstavite tančico) medtem ko (1 ) ( ) )

#vključi #include "diskio.h" #include "pff.h" medpomnilnik nepodpisanih znakov; /* medpomnilnik, v katerega se kopirajo informacije iz bliskovnega pogona */ volatile unsigned int count; //števec prekinitve kopiranih podatkov void timer2_comp_isr(void) //prekinitev, v kateri so zamenjane vrednosti ( OCR1A = medpomnilnik; //oddaj zvok zvočniku, če (++count >= 512) //povečaj števce števca = 0; //če je 512 ponastavljeno ) void main(void) ( unsigned int br; /* števec branja/pisanja datoteke */ unsigned char buf = 0; //spremenljivka, ki določa, kateri del vmesnega pomnilnika je prebran FATFS fs; /* Deluje območje (predmet datotečnega sistema) za logične pogone */ PORTB=0x00; DDRB=0x02; //preskoči podstavek ocr1a // Inicializacija časovnika/števca 1 // Vir ure: sistemska ura // Vrednost ure: 8000.000 kHz // Način: Fast PWM top=0x00FF // OC1A izhod: Non-Inv. TCCR1A=0x81; TCCR1B=0x09; TCNT1=0x00; OCR1A=0x00; // Inicializacija časovnika/števca 2 // Vir ure: sistemska ura // Vrednost ure : 250.000 kHz // Način: CTC top= OCR2 TCCR2=0x0B; TCNT2=0x00; //OCR2=0x1E; //nastavitev primerjalnega registra za 8kHz OCR2=0xA; //za 22kHz #asm("sei") // Časovnik(i)/Števec(i) Inicializacija prekinitev if(disk_initialize()==0) //inicializacija bliskovnega pogona ( pf_mount(&fs); //priklop datotečnega sistema pf_open("1.wav"); //odpri vejo pf_lseek(44); //premaknite kazalec na 44 pf_read(buffer, 512,&br); //prvič pogoltnemo 512 bajtov naenkrat TIMSK=0x80; //vklopi glasbo while(1) ( if(!buf && count>255) //če je bilo predvajanih več kot 255 bajtov, ( pf_read(&buffer, 256,&br);//nato preberi informacije iz bliskavice pogon v prvo polovico medpomnilnika buf=1; če (br< 256) //если буфер не содержит 256 значений значит конец файла break; } if(buf && count<256) { pf_read(&buffer, 256,&br); // читаем во вторую часть буфера с флешки buf = 0; if (br < 256) break; } } TIMSK = 0x00; //глушим все pf_mount(0x00); //демонтируем фат } while (1) { } }

Za preverjanje priključimo zvočnik na pin OCR1A preko kondenzatorja 100uF, “+” na pin mikrokontrolerja, “-” na zvočnik. “-” zvočnik na maso, “+” na kondenzator.

Ne pričakujte glasnega signala na izhodu; za glasen zvok potrebujete ojačevalnik. To je jasno vidno na videu. Za test sem petelina naložil z 8 kHz, skladbo pa z 22 kHz.

Tisti, ki želijo, lahko varno povečajo frekvenco timer2 za predvajanje datotek 44 kHz; poskusi kažejo, da je mogoče doseči precej dobro kakovost zvoka. V videu je zvok šibak in slaba kvaliteta, ampak v bistvu je to posledica dejstva, da sem ga posnel s kamero.

Objavljam tudi materiale, ki jih je prijazno posredoval Apparatchik - izvorno kodo za GCC, iz katere je bila napisana vdelana programska oprema za CAVR.

In video s predvajanjem 44 kHz.

Ob tej priložnosti vsem čestitam za novo leto, želim vam, da vam vsa firmware in naprave delajo :)

projekt predvajalnika wav na Atmega8

Napisal sem programski modul, ki omogoča dodajanje funkcije predvajanja melodij ali zvočnih sekvenc skoraj vsakemu projektu na mikrokrmilniku AVR.

Lastnosti modula:

Enostavna integracija z že pripravljenim projektom

Uporablja se samo 8-bitni časovnik t2, medtem ko je še vedno možna uporaba za anketiranje ali oblikovanje časovnih intervalov.

Modul je nastavljiv na skoraj vsako frekvenco taktnega generatorja

Višina not je določena kot simbolne konstante (C0, A2 itd.) ali v Hertzih

Trajanja so določena v standardni obliki (četrtine, osmine itd.) ali v milisekundah

Možno je nastaviti tempo predvajanja melodije in število njenih ponovitev

Med predvajanjem lahko melodijo začasno ustavite


Priključitev zvočnega modula

1. Kopirajte vse datoteke modula (ton.h, sound.h, sound.c) v mapo projekta.

2. Povežite datoteko sound.c s projektom.

Za IAR `a – z desno miškino tipko kliknite okno delovnega prostora in izberite Dodaj > Dodaj datoteke…

Za WINAVR je približno enako, samo sound.c je treba dodati v makefile:

SRC = $(TARGET).c zvok.c

3. Vključite datoteko glave sound.h v ustrezen modul. Na primer, v main.c

#include "sound.h"

4. Nastavite nastavitve modula v datoteki sound.h

//če komentirate, bo trajanje opomb

//izračunano iz BPM, določenega v melodiji

//če ostane, potem od spodaj navedene vrednosti

//#določite SOUND_BPM 24

//taktna frekvenca μ

#define SOUND_F_CPU 16U

//izhod mikrokontrolerja, na katerem se bo generiral zvok

#define PORT_SOUND PORTB

#define PINX_SOUND 0

//število določenih melodij.

#define SOUND_AMOUNT_MELODY 4

5. Dodajte svoje melodije v sound.c in zapišite imena melodij v polje melodij.

Dodajanje melodij zvonjenja

Melodija je niz 16-bitnih števil in ima naslednjo strukturo

BPM (četrtine na minuto) je konstanta, ki se uporablja za izračun trajanja not in določa hitrost predvajanja melodije.

BPM se lahko giblje od 1 do 24, kar ustreza 10 oziroma 240 četrtinkam na minuto.

Če je trajanje not/zvokov določeno v milisekundah, mora biti BPM, zapisan v matriki, enak 1.

Če je konstanta SOUND_BPM komentirana v datoteki glave sound.h, se trajanje not izračuna med izvajanjem programa v skladu z BPM, podanim v matriki. Če SOUND_BPM ni komentiran, se trajanje not izračuna na stopnji kompilacije na podlagi vrednosti te konstante, vse melodije pa bodo predvajane v istem tempu. To omejuje funkcionalnost, vendar prihrani nekaj bajtov kode.

Število ponovitev. Lahko sprejme vrednosti 1 ... 254 in LOOP (255). LOOP - pomeni, da se bo melodija ponavljala v nedogled, dokler ne boste podali ukaza SOUND_STOP ali SOUND_PAUSE.

Trajanje opombe– čas, v katerem se ustvari določen zvočni ton ali vzdržuje premor. Lahko se določi v ms, z uporabo makra ms(x) ali kot standardne notne vrednosti - osmine, šestnajstine itd. Spodaj je seznam podprtih trajanj. Če obstaja potreba po nekaterih eksotičnih trajanjih, jih lahko vedno dodate v datoteko tone.h

n1 - celotna nota

n2 - polovična nota

n4 - četrtina

n8 - osmi

n3 - osmi trojček

n16 - šestnajsti

n6 - sextole

n32 - dvaintrideseti

Visina not je določen z uporabo simbolnih konstant, opisanih v datoteki tone.h, na primer C2, A1 itd. Tudi višino not je mogoče določiti v Hertzih z uporabo makra f(x).

Program ima omejitve glede najmanjše in največje frekvence zvoka!

Oznaka konca melodije. Vrednost zadnjega elementa matrike mora biti nič.

Uporaba zvočnega modula

Na začetku main morate poklicati funkcijo SOUND_Init(). Ta funkcija nastavi izhodni pin mikrokrmilnika, konfigurira časovnik T2 in inicializira spremenljivke modula.

Potem morate nastaviti zastavico za omogočanje prekinitve - __enable_interrupt(), ker modul uporablja prelivanje časovnika T2 in prekinitve naključja.

Po tem lahko začnete predvajati melodije.

Na primer takole:

SOUND_SetSong(2);

SOUND_Com(SOUND_PLAY); //predvajaj melodijo

//nastavite kazalec na 2. melodijo

//in začnite predvajanje

SOUND_PlaySong(2);

Predvajanje melodije lahko kadarkoli ustavite z ukazom SOUND_STOP.
Z ukazom SOUND_PAUSE lahko tudi začasno ustavite melodijo. Naknadna izdaja ukaza SOUND_PLAY nadaljuje predvajanje melodije od točke, kjer je bila ustavljena.

Načeloma ta funkcionalnost ni posebej potrebna (kar sem si jo izmislil) in pri delu z modulom zadostuje funkcija SOUND_PlaySong(unsigned char numSong);

Datoteke

Primere uporabe zvočnega modula lahko prenesete s spodnjih povezav. Nisem narisal diagrama, ker je tam vse preprosto. priključen na pin PB0, gumb za zagon melodij je povezan na pin PD3. V projektih so definirane 4 melodije. S pritiskom na gumb se vsakič zažene nova melodija. Uporabljen je mikrokrmilnik atmega8535. Sprva sem se želel ukvarjati s projektom s štirimi gumbi - PREDVAJAJ, USTAVI, PREMORI in NAPREJ, potem pa se mi je zdelo nepotrebno.

PS: Modul ni bil podvržen obsežnemu testiranju in je na voljo »kakršen je«. Če so kakšni racionalni predlogi, jih dodelajmo.

V tem članku si bomo ogledali, kako igrati tone in se naučili igrati enoglasno melodijo.

Priprave na delo

Program deklarira dve matriki. Niz z notami opombe vsebuje preprost seznam opomb. Te note se ujemajo s trajanjem zvoka v nizu utripi. Trajanje v glasbi določa delilec note glede na celotno noto. Vrednost, vzeta kot celotna opomba, je 255 . Polovice, četrtine, osmine dobimo z deljenjem tega števila.
Upoštevajte, da trajanje prve note ne dobite tako, da 255 delite s potenco dvojke. Tukaj boste morali preiti na glasbeno teorijo. Ogledate si lahko note originalne melodije. Te note so združene v triplete. Če jih združimo na ta način, tri osmine zvenijo enako kot ena četrtina. Zato je njihovo relativno trajanje 21.
Uporabnik mora tudi izrecno določiti število opomb v zaporedju z direktivo:

# definirajte SEQU_SIZE 19

V glavnem programu se najprej preračunajo frekvenčni nizi in trajanje v obdobja signalov in trajanje not.
S signalnimi obdobji (matrika obdobje_signala) vse je preprosto. Če želite dobiti trajanje obdobja v mikrosekundah, preprosto delite 1.000.000 s frekvenco signala.
Za izračun absolutnega trajanja zvoka not je potrebno navesti tempo glasbenega dela. To se naredi z direktivo

# definiraj TEMPO 108

Tempo v glasbi je število četrtin na minuto. V vrsti

# definirajte WHOLE_NOTE_DUR 240000 / TEMPO

Izračuna se trajanje celotne note v milisekundah. Zdaj je dovolj, da ponovno izračunate relativne vrednosti iz matrike s pomočjo formule utripi v absolutni niz note_duration.
V glavni zanki spremenljivka pretečen čas se po vsaki periodi predvajanega signala poveča za trajanje te periode, dokler ne preseže trajanja note. Vredno je biti pozoren na ta vnos:

medtem ko (pretečeni_čas< 1000 * ((uint32_t) note_duration[ i] ) )

Spremenljivka pretečen čas 32-bitni in elementi polja notes_duration 16-bitni. Če 16-bitno število pomnožimo s 1000, je prelivanje zagotovljeno in spremenljivka pretečen čas bodo primerjali s smetmi. Modifikator (uint32_t) pretvori element matrike notes_duration[i] v 32-bitnem številu ni preliva.
V zvočni zanki lahko vidite še eno funkcijo. Funkcije ne bo mogoče uporabljati _delay_us(), ker njegov argument ne more biti spremenljivka.
Če želite ustvariti takšne zamude, uporabite funkcijo VarDelay_us(). V njem se zanka z zamikom 1 μs pomakne določeno število krat.

void VarDelay_us(uint32_t takt) ( medtem ko (takt- - ) ( _delay_us(1) ; ) )

Pri predvajanju melodije se uporabljata še dve zakasnitvi. Če se note igrajo brez premorov, se združijo v eno. Da bi to naredili, je med njima vstavljena zakasnitev 1 ms, ki jo določa direktiva:

# definirajte NOTES_PAUSE 1

Po vsakem končanem ciklu predvajanja melodije se program ustavi za 1 s in ponovno začne predvajati.
Kot rezultat smo prejeli kodo, v kateri je enostavno spremeniti tempo, prilagoditi trajanje ali popolnoma prepisati melodijo. Za to bo dovolj, da transformiramo samo del programa z direktivami in deklaracijami spremenljivk.

Individualne naloge

  1. V predlagani melodiji poskusite spremeniti tempo in med ponovitvami naredite 5-sekundni premor.
  2. Elementi niza utripi Sprejmite samo vrednosti od 0 do 255. Spremenite bitno širino elementov polja in poglejte v izhod prevajalnika, da vidite, kako to vpliva na količino pomnilnika, ki ga zaseda program.
  3. Zdaj poskusite sami spremeniti melodijo. Na primer, tukaj je "Imperial March" iz istega filma: int notes = ( A4, R, A4, R, A4, R, F4, R, C5, R, A4, R, F4, R, C5, R, A4, R, E5, R, E5, R, E5, R, F5, R, C5, R, G5, R, F5, R, C5, R, A4, R); int utripov = (50, 20, 50, 20, 50, 20, 40, 5, 20, 5, 60, 10, 40, 5, 20, 5, 60, 80, 50, 20, 50, 20, 50, 20, 40, 5, 20

    Če vaš avto nima nameščene zvočne sirene in se še vedno ne morete odločiti, katero kupiti in namestiti, potem je ta članek samo za vas. Zakaj bi kupovali drage alarme, če lahko vse skupaj sestavite sami na dokaj preprost način?

    Predstavljam dva od teh enostavna vezja na mikrokontrolerjih AVR ATmega8 in Attiny2313 oziroma je preprosto implementirano isto vezje za delo na teh dveh mikrokontrolerjih. Mimogrede, v arhivu boste našli dve različici vdelane programske opreme za mikrokrmilnik Atmega8, od katerih prva reproducira zvok, podoben avto alarm, drugi zvok pa je podoben varnostnemu alarmu zgradbe (hiter in oster signal).

    Vso firmware si lahko naložite spodaj v arhivu (vse so podpisane), v arhivu boste našli tudi simulacijo vezij v Proteusu, kar pomeni, da lahko po poslušanju vseh melodij iz seznama izberete tisto, ki vam je najbolj všeč .

    Spodaj je signalni diagram za Atmega8

    Seznam radijskih komponent, uporabljenih v vezju Atmega8

    U1- AVR mikrokrmilnik 8-bitni ATmega8-16PU, št. 1,
    R1- Upor z nazivno vrednostjo 47 Ohmov, št. 1,
    R2, R3 - upor z nazivno vrednostjo 270 ohmov, št. 2,
    D2,D3-LED, št. 2,
    LS1-zvočnik, št. 1,
    S1-senzor.

    In v signalnem vezju na Attiny2313 je bil spremenjen samo MK.
    U1- Mikrokrmilnik AVR 8-bitni ATtiny2313-20PU, št. 1.

    Tiskano vezje za Atmega8 izgleda takole:

    Kot lahko vidite, je vezje zelo preprosto, v njem je samo en mikrokrmilnik, 3 upori, 2 LED in še en zvočnik. Namesto gumba lahko uporabite reed stikalo ali drug kontakt.

    Načelo delovanja je naslednje. Takoj, ko vključimo napajanje, LED (v vezju D3) takoj zasveti ali začne utripati (odvisno od strojne programske opreme), in če se senzorja ne dotaknemo, bo alarm tih. Zdaj, če se senzor sproži, bo tudi sirena delala, LED bo tudi utripala, vendar D2.

    Če želite, da žarometi avtomobila utripajo, ko alarm deluje, potem morate za to povezati pin mikrokrmilnika 24 PC1 na rele prek tranzistorja in sam rele na žaromete. Če želite izklopiti sireno, morate napravo izklopiti in znova vklopiti ali preprosto pritisniti gumb. Za delovanje mikrokontrolerja potrebujete notranji 8 MHz oscilator,

    Če želite nekako izboljšati zvok alarma, lahko sestavite ojačevalnik s tranzistorji in ga priključite na vezje. Točno to sem naredil, vendar tega nisem upodobil v tem diagramu.

    Preidimo na vezje na Attiny 2313, kot sem že rekel, ima vse iste podrobnosti in isti princip delovanja, le MK je bil spremenjen in posledično povezani zatiči.Ta mikrokrmilnik deluje iz notranji 4 MHz oscilator, čeprav se lahko utripa na 1 MHz.

    Spodaj je diagram povezave že na Attiny2313

    Za ta MK sem napisal samo eno različico vdelane programske opreme, sestavil vse na vezju, preveril, vse deluje v redu.
    In varovalke je treba nastaviti, kot je prikazano spodaj:





Vrh