Sari la conținut
ELFORUM - Forumul electronistilor

Generator sunet(midi) ATTINY 2313


criss

Postări Recomandate

Doresc sa realizez un avertizor gen bip..bip... cu diferse sunete(asta ca sa invat).Am cautat pe net dar nu am gasit doar in limbajul de ansamblare :( pe care din pacate nul cunosc....cu C am inceput sa ma obisnuiesc(ca si incepator).Poate cineva sami dea un exemplu in C pt un 'generator' sunet(sau midi) pt acest microcontroler...buzzerul pot sal conectez doar la una dintre porturi(PB3, PB4)?. nu stiu ce impedanta are un buzzer de calculator dar mai trebuie sa folosesc si o rezistenta? sau direct la pin, fata de masa.am atasat fisierul in assembly.Multumesc

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    2

  • danzup

    1

  • Eugenn

    1

Top autori în acest subiect

iti multumesc dar am inceput sa invat Cul si nu prea as dori sa amestec limbajele...oricum am sa ma uit peste exemplele date de tine.dar astept daca cineva imi poate da exemple in C.Multumesc

Link spre comentariu

Daca buzzerul e piezo, se poate lega la pin printr-o rezistenta de peste 220 ohmi. Daca e cu bobina (am vazut un buzzer gen "tub" negru) trebuie incercat cu rezistenta si daca se aude incet trebuie facut un amplificator minimal, cu 1-2 tranzistori.

 

MIDI cred ca e greu de facut, dar generarea de bipuri de diverse frecvente e simpla - se controleaza doar frecventa semnalului, nu si amplitudinea.

 

Pentru a genera sunetul, e suficient ceva de genul:

// se leaga buzzer la PORTB, pin 1

#define F 1000 // Hz

while(1){

PORTB = PORTB ^ _BV(1); // inverseaza bitul la 1/2 din perioada

delay_us(500000/F);

}

Se poate adapta pentru a genera o perioada de timp un sunet cu o frecventa anume. Dezavantaj - in timp ce suna buzzerul, uC nu poate sa faca altceva, sta in delay.

 

Daca trebuie sa lucreze si la altceva in timp ce genereaza sunet, trebuie folosit un timer ce genereaza intreruperi la interval de 1/2 din perioada. In rutina de intrerupere se inverseaza bitul.

Cand vrei sa generezi un sunet, configurezi perioada timerului si activezi intreruperea din prog principal. Ca sa il opresti, dezactivezi intreruperea.

Dezavantaj - rezolutia de stabilire a frecventei depinde de rezolutia timerului, dar e acceptabila pentru bipuri.

 

Pentru rezolutie mare a frecventei trebuie implementat un DDS in soft - preferabil asm, codul DDS fiind plasat intr-o ISR ce ruleaza la zeci - sute kHz, fi. Ex. acumulatorul DDS pe 24biti, fi = 100kHz => fmax=50kHz, rezolutie 0.006Hz.

 

Cand e nevoie de impus precis durata de executie - ca la generare de semnale, e mai usor de lucrat in asamblare decat in C. Nu e greu de scris programe in asm pt AVR in AVR Studio, pt ca AVR au destule instructiuni spre deosebire de PIC de exemplu, nu trebuie sa testezi STATUS-ul, avand instructiuni de salt conditionale... Mai greu e de combinat C cu asm in WinAVR GCC.

Asa ca poti sa incerci si in asm, site-ul asta are cateva tutoriale

http://www.avr-asm-tutorial.net/avr_en/index.html

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări