Atmega8 ზარის მელოდიები. ხმის გენერირება AVR-ის გამოყენებით

10.09.2021

მე დავწერე პროგრამული მოდული, რომელიც საშუალებას გაძლევთ დაამატოთ მელოდიების ან ბგერების თანმიმდევრობის დაკვრის ფუნქცია AVR მიკროკონტროლერზე თითქმის ნებისმიერ პროექტში.

მოდულის მახასიათებლები:

მარტივი ინტეგრაცია მზა პროექტთან

გამოიყენება მხოლოდ 8-ბიტიანი ტაიმერი t2, ხოლო მისი გამოყენება შესაძლებელია კენჭისყრის ან დროის ინტერვალების ფორმირებისთვის.

მოდული რეგულირდება თითქმის ნებისმიერი საათის გენერატორის სიხშირეზე

ნოტების სიმაღლე მითითებულია როგორც სიმბოლური მუდმივები (C0, A2 და ა.შ.) ან ჰერცში.

ხანგრძლივობა მითითებულია სტანდარტული ფორმით (კვარტლები, მერვედები და ა.შ.) ან მილიწამებში

შესაძლებელია მელოდიის დაკვრის ტემპის და მისი გამეორებების რაოდენობის დაყენება

დაკვრის დროს მელოდიის შეჩერება შესაძლებელია


ხმის მოდულის დაკავშირება

1. დააკოპირეთ ყველა მოდულის ფაილი (tone.h, sound.h, sound.c) პროექტის საქაღალდეში.

2. შეაერთეთ sound.c ფაილი პროექტთან.

IAR `a-სთვის – დააწკაპუნეთ მაუსის მარჯვენა ღილაკით სამუშაო სივრცის ფანჯარაში და აირჩიეთ დამატება > ფაილების დამატება…

WINAVR-სთვის ეს დაახლოებით იგივეა, მხოლოდ sound.c უნდა დაემატოს მაკიაფილს:

SRC = $(TARGET).c ხმა.გ

3. ჩართეთ სათაურის ფაილი sound.h შესაბამის მოდულში. მაგალითად, ძირითადში.გ

#include "sound.h"

4. დააყენეთ მოდულის პარამეტრები sound.h ფაილში

//თუ კომენტარს გააკეთებთ, შენიშვნების ხანგრძლივობა იქნება

//გამოითვლება მელოდიაში მითითებული BPM-დან

//თუ დარჩა, მაშინ ქვემოთ მითითებული მნიშვნელობიდან

//#define SOUND_BPM 24

//საათის სიხშირე μ

#define SOUND_F_CPU 16U

//მიკროკონტროლერის გამომავალი, რომელზედაც წარმოიქმნება ხმა

#define PORT_SOUND PORTB

#define PINX_SOUND 0

//მითითებული მელოდიების რაოდენობა.

#define SOUND_AMOUNT_MELODY 4

5. დაამატეთ თქვენი მელოდიები sound.c-ს და ჩაწერეთ მელოდიების სახელები მელოდიურ მასივში.

ზარის მელოდიების დამატება

მელოდია არის 16-ბიტიანი რიცხვების მასივი და აქვს შემდეგი სტრუქტურა

BPM (წუთში ნოტები)არის მუდმივი, რომელიც გამოიყენება ნოტების ხანგრძლივობის გამოსათვლელად და განსაზღვრავს მელოდიის დაკვრის სიჩქარეს.

BPM შეიძლება მერყეობდეს 1-დან 24-მდე, რაც შეესაბამება 10 და 240 კვარტალ ნოტს წუთში, შესაბამისად.

თუ ნოტების/ხმების ხანგრძლივობა მითითებულია მილიწამებში, მაშინ მასივში ჩაწერილი BPM უნდა იყოს 1-ის ტოლი.

თუ SOUND_BPM მუდმივი კომენტირებულია სათაურის ფაილში sound.h, მაშინ შენიშვნების ხანგრძლივობა გამოითვლება პროგრამის შესრულებისას მასივში მითითებული BPM-ის მიხედვით. თუ SOUND_BPM კომენტარი არ არის, ნოტების ხანგრძლივობა გამოითვლება კომპილაციის ეტაპზე, ამ მუდმივის მნიშვნელობიდან გამომდინარე, და ყველა მელოდია ითამაშებს იმავე ტემპით. ეს ზღუდავს ფუნქციონირებას, მაგრამ დაზოგავს რამდენიმე ბაიტს კოდს.

გამეორებების რაოდენობა.შეუძლია მიიღოს მნიშვნელობები 1 ... 254 და LOOP (255). LOOP - ნიშნავს, რომ მელოდია გაუთავებლად განმეორდება SOUND_STOP ან SOUND_PAUSE ბრძანების გაცემამდე.

შენიშვნის ხანგრძლივობა– დრო, რომლის დროსაც წარმოიქმნება მოცემული ბგერის ტონი ან შენარჩუნებულია პაუზა. შეიძლება მითითებული იყოს ms-ში, ms(x) მაკროს გამოყენებით, ან როგორც სტანდარტული ნოტების მნიშვნელობები - მერვე ნოტები, მეთექვსმეტე ნოტები და ა.შ. ქვემოთ მოცემულია მხარდაჭერილი ხანგრძლივობების სია. თუ არსებობს გარკვეული ეგზოტიკური ხანგრძლივობის საჭიროება, ყოველთვის შეგიძლიათ დაამატოთ ისინი tone.h ფაილში

n1 - მთელი შენიშვნა

n2 - ნახევარი შენიშვნა

n4 - მეოთხედი

N8 - მერვე

n3 - მერვე სამეული

n16 - მეთექვსმეტე

n6 - სექსტოლი

n32 - ოცდათორმეტი

შენიშვნა მოედანზემითითებულია tone.h ფაილში აღწერილი სიმბოლური მუდმივების გამოყენებით, მაგალითად C2, A1 და ა.შ. ასევე, ნოტების სიმაღლე შეიძლება განისაზღვროს ჰერცში f(x) მაკროს გამოყენებით.

პროგრამას აქვს შეზღუდვები ხმის მინიმალურ და მაქსიმალურ სიხშირეზე!

მელოდიის დასასრულის მარკერი.მასივის ბოლო ელემენტის მნიშვნელობა უნდა იყოს ნული.

ხმის მოდულის გამოყენებით

მთავარის დასაწყისში, თქვენ უნდა გამოიძახოთ SOUND_Init() ფუნქცია. ეს ფუნქცია ადგენს მიკროკონტროლერის გამომავალ პინს, აკონფიგურირებს ტაიმერს T2 და ახდენს მოდულის ცვლადების ინიციალიზებას.

შემდეგ თქვენ უნდა დააყენოთ შეფერხების ჩართვის დროშა - __enable_interrupt(), რადგან მოდული იყენებს T2 ტაიმერის გადინებას და დამთხვევის შეფერხებებს.

ამის შემდეგ შეგიძლიათ დაიწყოთ მელოდიების დაკვრა.

მაგალითად, ასე:

SOUND_SetSong(2);

SOUND_Com(SOUND_PLAY); //მელოდიის დაკვრა

//დააყენეთ მაჩვენებელი მე-2 მელოდიაზე

//და დაიწყე დაკვრა

SOUND_PlaySong(2);

მელოდიის დაკვრა ნებისმიერ დროს შეიძლება შეწყდეს SOUND_STOP ბრძანების გაცემით.
თქვენ ასევე შეგიძლიათ შეაჩეროთ მელოდია SOUND_PAUSE ბრძანების გამოყენებით. SOUND_PLAY ბრძანების შემდგომი გაცემა განაახლებს მელოდიის დაკვრას იმ წერტილიდან, სადაც ის შეჩერდა.

პრინციპში, ეს ფუნქციონალობა განსაკუთრებით არ არის საჭირო (მე ახლახან შევადგინე) და მოდულთან მუშაობისას საკმარისია SOUND_PlaySong(unsigned char numSong) ფუნქცია;

ფაილები

ხმის მოდულის გამოყენების მაგალითები შეგიძლიათ ჩამოტვირთოთ ქვემოთ მოცემული ბმულებიდან. მე არ დავხატე დიაგრამა, რადგან იქ ყველაფერი მარტივია. დაკავშირებულია PB0-თან, მელოდიების დაწყების ღილაკი დაკავშირებულია პინ PD3-თან. პროექტებში 4 მელოდიაა განსაზღვრული. ღილაკზე დაჭერით ყოველ ჯერზე იწყება ახალი მელოდია. გამოიყენება atmega8535 მიკროკონტროლერი. თავიდან მინდოდა შემეწუხებინა პროექტი ოთხი ღილაკით - PLAY, STOP, PAUSE და NEXT, მაგრამ შემდეგ ვფიქრობდი, რომ ეს ზედმეტი იყო.

PS: მოდულს არ გაუვლია ვრცელი ტესტირება და მოწოდებულია „როგორც არის“. თუ არის რაიმე რაციონალური წინადადება, მოდი დავასრულოთ.

ამ სტატიაში განვიხილავთ ტონების დაკვრას და ვისწავლით მონოფონიური მელოდიის დაკვრას.

სამუშაოსთვის მზადება

პროგრამა აცხადებს ორ მასივს. მასივი შენიშვნებით შენიშვნებიშეიცავს შენიშვნების მარტივ ჩამონათვალს. ეს შენიშვნები ემთხვევა მასივში ხმის ხანგრძლივობას სცემს. მუსიკაში ხანგრძლივობა განისაზღვრება ნოტის გამყოფით მთელ ნოტთან მიმართებაში. მთლიანი შენიშვნის სახით აღებული მნიშვნელობა არის 255 . ამ რიცხვის გაყოფით მიიღება ნახევარები, მეოთხედები, მერვედები.
გთხოვთ გაითვალისწინოთ, რომ პირველი ნოტის ხანგრძლივობა არ მიიღება 255-ის 2-ის ხარისხზე გაყოფით. აქ მოგიწევთ მუსიკის თეორიაზე გადასვლა. ორიგინალური მელოდიის ნოტები შეგიძლიათ ნახოთ. ეს ნოტები გაერთიანებულია სამეულებად. ამ გზით შერწყმისას სამი მერვე ნოტი ჟღერს ისევე, როგორც ერთი მეოთხედი ნოტი. ამიტომ მათი შედარებითი ხანგრძლივობაა 21.
მომხმარებელმა ასევე მკაფიოდ უნდა მიუთითოს შენიშვნების რაოდენობა დირექტივის თანმიმდევრობით:

# განსაზღვრეთ SEQU_SIZE 19

მთავარ პროგრამაში, უპირველეს ყოვლისა, ხდება სიხშირის მასივების ხელახალი გამოთვლა და ხანგრძლივობა სიგნალების პერიოდებად და შენიშვნების ხანგრძლივობა.
სიგნალის პერიოდებით (მასივი სიგნალის_პერიოდი) ყველაფერი მარტივია. იმისთვის, რომ მიიღოთ პერიოდის ხანგრძლივობა მიკროწამებში, უბრალოდ გაყავით 1,000,000 სიგნალის სიხშირეზე.
ნოტების ხმის აბსოლუტური ხანგრძლივობის გამოსათვლელად აუცილებელია მუსიკალური ნაწარმოების ტემპის მითითება. ეს კეთდება დირექტივით

# განსაზღვრეთ TEMPO 108

მუსიკაში ტემპი არის მეოთხედი ნოტების რაოდენობა წუთში. რიგში

# განსაზღვრეთ WHOLE_NOTE_DUR 240000 / TEMPO

მთელი ნოტის ხანგრძლივობა გამოითვლება მილიწამებში. ახლა საკმარისია შედარებითი მნიშვნელობების ხელახლა გამოთვლა მასივიდან ფორმულის გამოყენებით სცემსაბსოლუტურ მასივამდე შენიშვნა_ხანგრძლივობა.
მთავარ მარყუჟში, ცვლადი გასული_დროგათამაშებული სიგნალის ყოველი პერიოდის შემდეგ იზრდება ამ პერიოდის ხანგრძლივობით, სანამ არ გადააჭარბებს ნოტის ხანგრძლივობას. ღირს ყურადღება მიაქციოთ ამ ჩანაწერს:

ხოლო (გასული_დრო< 1000 * ((uint32_t) note_duration[ i] ) )

ცვლადი გასული_დრო 32-ბიტიანი და მასივის ელემენტები შენიშვნები_ხანგრძლივობა 16 ბიტიანი. თუ 16-ბიტიანი რიცხვი გამრავლებულია 1000-ზე, მაშინ გადინება გარანტირებულია და ცვლადი გასული_დრონაგავს შეადარებენ. მოდიფიკატორი (uint32_t)გარდაქმნის მასივის ელემენტს ნოტების_ხანგრძლივობა[i] 32-ბიტიან ნომერში არ არის გადინება.
თქვენ შეგიძლიათ ნახოთ სხვა ფუნქცია აუდიო ციკლში. ფუნქციის გამოყენება შეუძლებელი იქნება _ დაგვიანებით_ჩვენ(), ვინაიდან მისი არგუმენტი არ შეიძლება იყოს ცვლადი.
ასეთი შეფერხებების შესაქმნელად გამოიყენეთ ფუნქცია VarDelay_us(). მასში 1 μs დაგვიანებით მარყუჟი გადახვევა განსაზღვრული რაოდენობის ჯერ.

void VarDelay_us(uint32_t takt) ( while (takt- -) (_delay_us(1) ;) )

მელოდიის დაკვრისას გამოიყენება კიდევ ორი ​​დაყოვნება. თუ ნოტები შესრულებულია პაუზების გარეშე, ისინი გაერთიანდებიან ერთში. ამისათვის მათ შორის ჩასმულია 1 ms დაყოვნება, რომელიც მითითებულია დირექტივით:

# განსაზღვრეთ NOTES_PAUSE 1

მელოდიის დაკვრის ყოველი სრული ციკლის შემდეგ, პროგრამა ჩერდება 1 წამით და კვლავ იწყებს დაკვრას.
შედეგად მივიღეთ კოდი, რომელშიც ადვილია ტემპის შეცვლა, ხანგრძლივობის კორექტირება ან მელოდიის მთლიანად გადაწერა. ამისათვის საკმარისი იქნება მხოლოდ პროგრამის მხოლოდ ნაწილის გარდაქმნა დირექტივებითა და ცვლადი დეკლარაციებით.

ინდივიდუალური დავალებები

  1. შემოთავაზებულ მელოდიაში სცადეთ ტემპის შეცვლა და გამეორებებს შორის 5 წამის პაუზა.
  2. მასივის ელემენტები სცემსმიიღეთ მხოლოდ მნიშვნელობები 0-დან 255-მდე. შეცვალეთ მასივის ელემენტების ბიტის სიგანე და შეხედეთ კომპილერის გამომავალს, რომ ნახოთ, როგორ აისახება ეს პროგრამის მიერ დაკავებულ მეხსიერების რაოდენობაზე.
  3. ახლა სცადეთ თავად შეცვალოთ მელოდია. მაგალითად, აქ არის „იმპერიული მარტი“ იმავე ფილმიდან: 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);

    მოდული მუშაობს FAT16-ში ფორმატირებული SD ბარათებით, არაუმეტეს 2 GB ტევადობით და აწარმოებს ხმის ფრაგმენტებს .ad4 ან .wav ფორმატებში ნებისმიერი თანმიმდევრობით. მოდულის შიდა სქემები იკვებება ჩაშენებული 3.3 ვ სტაბილიზატორით, რაც ძალიან მოსახერხებელია, რადგან ის საშუალებას აძლევს თავად მოდულს მიეწოდოს ძაბვა 5 ვ. (ამისთვის საჭიროა დახუროთ „5V“ ” ბალიშით შუა ბალიშით მოდულის დაფაზე, პირველად რომ გახსენით შედუღების ჯუმპერი ბალიშით „3.3V“, როგორც ნაჩვენებია სურათზე 2).

    მოდულის მართვა შესაძლებელია ხელით ან მიკროკონტროლერის გამოყენებით. "ხელით" რეჟიმში საკმარისია ღილაკების დაკავშირება მოწყობილობასთან ნახაზი 3-ზე წარმოდგენილი სქემის მიხედვით. WTV020 მოდულის ტექნიკურ აღწერილობაში შეგიძლიათ იპოვოთ კავშირის სხვა ვარიანტები, რომლებიც ფუნქციონალურობით დიდად არ განსხვავდება მოდულისგან. შემოთავაზებული დიაგრამა.

    დინამიკი უერთდება PWM გამოსავალს ან ჩაშენებულ 16-ბიტიან DAC-ს. ამ უკანასკნელ შემთხვევაში, თქვენ უნდა დააკავშიროთ გარე ოპ-გამაძლიერებელი და გამაძლიერებელი (სურათი 4). PWM არხთან დაკავშირებისას შესაძლებელია დინამიკების დაკავშირება 8 Ohms წინააღმდეგობის და 0.5 W-მდე სიმძლავრით.

    WTV020 მოდულის ქინძისთავები ნაჩვენებია ცხრილში 1. ორსადენიანი საკომუნიკაციო ინტერფეისის არხები შეიძლება გამოყენებულ იქნას როგორც ღილაკების დასაკავშირებლად, ასევე გარე მიკროკონტროლერისთვის.

    ცხრილი 1.

    ნომერი
    გამომავალი

    მიზანი

    აუდიო გამომავალი DAC-დან

    არ გამოიყენება

    PWM გამომავალი

    PWM გამომავალი

    არ გამოიყენება

    მოცულობა "+" / CLK

    თამაში - პაუზა

    ტომი "-" / DI

    არ გამოიყენება

    შემდეგი ფაილი

    არ გამოიყენება

    ვიზუალური შემოწმებისთვის გამოვიყენეთ LCD დისპლეი 2x16 და შესაბამისი კონტროლერი. ზოგადი სქემაპლეერი ნაჩვენებია სურათზე 5. მიკროკონტროლერი და მოდული იკვებება 3.3 ვ ძაბვით, დისპლეი - 4 ვ, ვინაიდან 3.3 ვ არ იყო საკმარისი არჩეული LCD-ისთვის. ძაბვის ეს განსხვავება არანაირად არ მოქმედებს MK-დან მონაცემების მიღებაზე. ავტორმა გადაწყვიტა არ გაეაქტიურებინა WTV020 მოდულის შიდა სტაბილიზატორი.

    CLK და DI ხაზები გამოიყენება WTV020 მოდულზე მონაცემების გადასაცემად. მიხედვით ტექნიკური აღწერა(სურათი 6a), 16 ბიტი მონაცემები უნდა გადაიცეს 200 μs სიხშირით, მაგრამ პრაქტიკაში ეს მნიშვნელობა უნდა გაიზარდოს 2 ms-მდე (სურათი 6b).

    დოკუმენტაციის საფუძველზე, დენის გამოყენების შემდეგ, რეკომენდებულია უარყოფითი პულსის გამოყენება 5 ms ხანგრძლივობის მოდულის "გადატვირთვის" გამოსავალზე და ბრძანებების გაგზავნა 300 ms-ის შემდეგ. მაგრამ ეს აშკარა შეცდომაა, რადგან WTV020 მოდულის ინიციალიზაციის დრო დაახლოებით 600 ms. თუ თქვენ გაგზავნით ბრძანებებს გადატვირთვის შემდეგ 600 ms-ზე ადრე, მოდული უბრალოდ არ იღებს მათ.

    მოდულის მიერ მიღებული ძირითადი ბრძანებების სია წარმოდგენილია ცხრილში 2. ცხრილიდან ჩანს, რომ დაკვრადი აუდიო ფაილების მაქსიმალური რაოდენობაა 512, მაგრამ ავტორი შემოიფარგლა ოცდაათამდე. ხმის რეგულირება შესაძლებელია 7 დიაპაზონში. პრაქტიკაში, ხმის დამახინჯება შეინიშნება FFF0-დან FFF3-მდე მისამართებიდან, როგორც PWM გამომავალიდან, ასევე DAC-დან. FFFE (დაკვრა/პაუზა) და FFFF (Stop/Play) ბრძანებები გამომწვევია.

    ჩართულია LCD ეკრანიდასაკრავი ფაილის რაოდენობა და მოცულობა ნაჩვენებია 7 შევსებული მართკუთხედის მასშტაბის სახით. ფოტო დასრულებული მოწყობილობანაჩვენებია სურათზე 8.

    დემო ვიდეო:

    MK პროგრამული უზრუნველყოფა, ვირტუალური მოდელი Proteus და აუდიო ფაილი .ad4 ფორმატში -

    აუდიო ჩანაწერების .ad4 ფორმატში გადაყვანის პროგრამა -

    გაკვეთილის გაგრძელებას დიდი დრო დასჭირდა, რაც გასაგებია მეხსიერების ბარათებთან და FAT ფაილურ სისტემასთან მუშაობის დაუფლება. მაგრამ მაინც მოხდა, გაკვეთილი მზად არის - ფაქტობრივად, საახალწლო სასწაული.

    იმისათვის, რომ სტატია არ გადატვირთოს ინფორმაცია, მე არ აღვწერ wav ფაილის ფორმატის სტრუქტურას, საძიებო სისტემებში საკმარისზე მეტი ინფორმაციაა. საკმარისია ითქვას, რომ თუ ფაილს ხსნით რაიმე სახის Hex რედაქტორით, მაშინ პირველი 44 ბაიტი შეიცავს ყველა ინფორმაციას ფაილის ტიპის, შერჩევის სიჩქარის, არხების რაოდენობის შესახებ და ა.შ. თუ ფაილის ანალიზი გჭირდებათ, წაიკითხეთ ეს. სათაური და ბედნიერი იქნები.

    დატვირთვის მონაცემები იწყება 44 ბაიტიდან, არსებითად შეიცავს ძაბვის დონეებს, რომლებიც ქმნიან ხმას. ძაბვის დონეებზე უკვე ვისაუბრეთ გაკვეთილის ბოლო ნაწილში. ამრიგად, ყველაფერი მარტივია, თქვენ უნდა მიაწოდოთ ეს ნაბიჯები სპიკერზე ფაილის შერჩევის სიხშირით.

    როგორ უნდა აიძულოთ დინამიკი ფიზიკურად შეირყა? თქვენ უნდა გამოიყვანოთ ეს ძაბვის დონეები PWM გამოყენებით, ან გამოიყენოთ R2R. ნებისმიერ შემთხვევაში, მისი გამოყენება ძალიან მარტივია, წაიკითხეთ ნომერი, ჩადეთ იგი OCR-ში ან PORTx-ში. შემდეგ, გარკვეული დროის შემდეგ, მე შევცვალე შემდეგი მნიშვნელობა და ასე გავაგრძელე ფაილის ბოლომდე.

    მაგალითად, გარკვეული wav ფაილი, მონაცემები მოდის ბაიტიდან 44=0x2C, იქ იწერება რიცხვი 0x80, ვაწარმოებთ ხმას, მაგალითად, პირველი ტაიმერის PWM-ით, ჩაწერეთ OCR1A=0x80; ვთქვათ, ნიმუშის აღების სიხშირე არის 8 kHz, ამიტომ შეფერხება უნდა დაყენდეს იმავე სიხშირეზე. შეფერხებისას, ჩაანაცვლეთ შემდეგი მნიშვნელობა 0x85 1/8000 = 125 μs-ის შემდეგ.

    როგორ დავაყენოთ შეფერხება 8 kHz-ზე? გავიხსენოთ, რომ თუ ტაიმერი მუშაობს 250 კჰც სიხშირეზე, მაშინ შეფერხების შედარების რეგისტრი უნდა შეიცვალოს (250/8)-1=31-1 ან 0x1E. PWM-ით, ყველაფერი ასევე მარტივია, რაც უფრო მაღალია ის, რომლითაც ის მუშაობს, მით უკეთესი.

    იმისთვის, რომ პროგრამული უზრუნველყოფა იმუშაოს, ჩვენ შევთანხმდებით, რომ ფლეშ დრაივი დაფორმატებულია FAT32-ში, PetitFat lib-ის გამოყენებით 23.2 გაკვეთილიდან. ფაილი არის wav ფორმატში, ან 8kHz ან 22.050kHz, მონო. ფაილის სახელი 1.wav. მოდით გავაანალიზოთ firmware.

    #შეიცავს #include "diskio.h" #include "pff.h" unsigned char buffer[512] ; /* ბუფერი, რომელშიც ინფორმაცია კოპირებულია ფლეშ დრაივიდან */ volatile unsigned int count; //დაკოპირებული მონაცემთა მრიცხველიშეწყვეტა [TIM2_COMP] void timer2_comp_isr(void) //შეწყვეტა, რომელშიც ჩანაცვლებულია მნიშვნელობები(OCR1A = ბუფერი[თვლა]; // ხმის გამომავალი დინამიკზეთუ (++ რაოდენობა >= 512) //მრიცხველის გაზრდარაოდენობა = 0; //თუ 512 გადატვირთულია) void main(void) ( unsigned int br; /* ფაილის წაკითხვის/ჩაწერის მრიცხველი */ხელმოუწერელი char buf = 0 ; //ცვლადი, რომელიც განსაზღვრავს ბუფერის რომელი ნაწილის წაკითხვას FATFS fs; /* სამუშაო სივრცე (ფაილის სისტემის ობიექტი) ლოგიკური დისკებისთვის */ PORTB= 0x00 ; DDRB= 0x02 ; //ნახტომი შიმ ocr1a// Timer/Counter 1 ინიციალიზაცია // საათის წყარო: სისტემის საათი // საათის მნიშვნელობა: 8000,000 kHz // რეჟიმი: სწრაფი PWM top=0x00FF // OC1A გამომავალი: Non-Inv. TCCR1A= 0x81 ; TCCR1B= 0x09 ; TCNT1= 0x00 ; OCR1A= 0x00 ;// Timer/Counter 2 ინიციალიზაცია // საათის წყარო: სისტემის საათი // საათის მნიშვნელობა: 250,000 kHz // რეჟიმი: CTC top=OCR2 TCCR2= 0x0B ; TCNT2= 0x00 ; //OCR2=0x1E; //შედარების რეგისტრის დაყენება 8kHz-ზე OCR2= 0xA; //22kHz-სთვის #asm("sei") // ტაიმერი(ები)/მრიცხველ(ებ)ი შეწყვეტის(ებ)ის ინიციალიზაციათუ (disk_initialize() == 0) // ფლეშ დრაივის ინიციალიზაცია(pf_mount(&fs) ; //დამონტაჟებაფაილური სისტემა pf_open("1.wav");//გახსენით თემა pf_lseek(44);//მაჩვენებლის გადატანა 44-ზე< 256 ) pf_read(ბუფერი, 512,& br);//პირველად ვყლაპავთ 512 ბაიტს ერთდროულად< 256 ) { pf_read(& buffer[ 256 ] , 256 ,& br) ; TIMSK= 0x80 ;//ჩართეთ მუსიკა, ხოლო (1) (თუ (! buf && count> 255)< 256 ) break ; } } TIMSK = 0x00 ; //глушим все pf_mount(0x00 ) ; //თუ 255 ბაიტზე მეტი რეპროდუცირებულია,(pf_read(& buffer[0], 256,& br);

    //შემდეგ ვკითხულობთ ინფორმაციას ფლეშ დრაივიდან ბუფერის პირველ ნახევარში #include "diskio.h" #include "pff.h" ხელმოუწერელი char ბუფერი; /* ბუფერი, რომელშიც ინფორმაციის კოპირება ხდება ფლეშ დრაივიდან */ volatile unsigned int count; //კოპირებული მონაცემების მთვლელი შეფერხების void timer2_comp_isr(void) //წყვეტა, რომელშიც ჩანაცვლებულია მნიშვნელობები (OCR1A = ბუფერი; //ხმის გამომავალი დინამიკზე, თუ (++count >= 512) //მრიცხველის რაოდენობის გაზრდა = 0; //if 512 reset ) void main(void) ( unsigned int br; /* ფაილის წაკითხვა/ჩაწერა მრიცხველი */ unsigned char buf = 0; //ცვლადი, რომელიც განსაზღვრავს ბუფერის რომელი ნაწილის წაკითხვას FATFS; /* მუშა ფართობი (ფაილის სისტემის ობიექტი) ლოგიკური დისკებისთვის */ PORTB=0x00; სწრაფი PWM top=0x00FF // OC1A გამომავალი: TCCR1A=0x00 TCNT1=0x00 // საათის წყარო: სისტემის საათი // რეჟიმი: CTC; OCR2 TCCR2=0x00 //OCR2=0x1E //შედარების რეგისტრის დაყენება OCR2=0xA// 22kHz-ისთვის #asm("sei"); (s) ინიციალიზაცია if(disk_initialize()==0) // ფლეშ დრაივის ინიციალიზაცია ( pf_mount(&fs); //დაამონტაჟეთ ფაილური სისტემა pf_open("1.wav"); //გახსენით ფილიალი pf_lseek(44); //მაჩვენებლის გადატანა 44 pf_read(buffer, 512,&br); //პირველად ვყლაპავთ 512 ბაიტს ერთდროულად TIMSK=0x80; //ჩართეთ მუსიკა, ხოლო(1) ( if(!buf && count>255) //თუ 255 ბაიტზე მეტი დაკვრა, ( pf_read(&buffer, 256,&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) { } }

    შესამოწმებლად, ჩვენ ვუერთებთ დინამიკს OCR1A პინს 100uF კონდენსატორის საშუალებით, „+“ მიკროკონტროლერის პინთან, „-“ დინამიკთან. "-" დინამიკი მიწასთან, "+" კონდენსატორთან.

    არ ელოდოთ ხმამაღალ სიგნალს გამომავალზე, თქვენ გჭირდებათ გამაძლიერებელი ხმამაღლა ჟღერადობისთვის. ეს აშკარად ჩანს ვიდეოში. გამოცდისთვის მამლი დავტვირთე 8 კჰც სიხშირით და ტრეკი 22 კჰც.

    მსურველებს შეუძლიათ უსაფრთხოდ გაზარდონ ტაიმერის სიხშირე 44 kHz ფაილების დასაკრავად, ექსპერიმენტები აჩვენებს, რომ საკმაოდ კარგი ხმის ხარისხია შესაძლებელი. ვიდეოში ხმა სუსტია და ხარისხიც ცუდი, მაგრამ სინამდვილეში ეს იმის გამოა, რომ კამერით გადავიღე.

    მე ასევე ვაქვეყნებ მასალებს, რომლებიც მოწოდებულია Apparatchik-ის მიერ - GCC-ის წყაროს კოდი, საიდანაც დაიწერა CAVR-ის firmware.

    და ვიდეო 44kHz დაკვრით.

    ვისარგებლებ შემთხვევით და ყველას გილოცავთ ახალ წელს, ვისურვებ, რომ ყველა firmware და მოწყობილობა მუშაობდეს თქვენთვის :)

    wav player პროექტი Atmega8-ზე

    მეორე დღეს ვიჯექი და ვფიქრობდი, რისი დამატება შემეძლო ჩემს სკუტერს: არის მუსიკა, არის განათება, მაგრამ რაღაც მაკლია და მერე გამახსენდა სიგნალიზაცია, აუცილებლად! ბოლოს და ბოლოს, ეს არის ზუსტად ის, რაც მე არ მაქვს! მე გთავაზობთ, რომ თქვენ ასევე მოაწყოთ სიგნალიზაცია თქვენი ორბორბლისთვის - მაგალითად, ველოსიპედი, ან შესაძლოა ოთხბორბლიანი მეგობარი. განგაშის სისტემა აწყობილია AVR ATmega8 მიკროკონტროლერზე, პროექტი ასევე მეორდება Attiny2313 მიკროკონტროლერზე. Atmega8 მიკროსქემის ვარიანტებისთვის მე დავწერე პროგრამული უზრუნველყოფის სამი ვერსია, ერთი პროგრამული უზრუნველყოფა იმეორებს ხმას, რომელიც მოგვაგონებს მანქანის სიგნალიზაციას, ხოლო მეორე მსგავსია უსაფრთხოების განგაშის სირენის, რომელიც მდებარეობს შენობაში (უფრო სწრაფი და მკვეთრი მელოდია). ყველა ფირმვერი ხელმოწერილია და განთავსებულია ქვემოთ მოცემულ არქივში, ვფიქრობ, მათ გაიგებთ. გარდა ამისა, არქივი შეიცავს პროტეუსში სქემების სიმულაციას, ასე რომ თქვენ შეგიძლიათ მოუსმინოთ ხმებს და აირჩიოთ ის ვარიანტი, რომელიც მოგწონთ საუკეთესოდ.

    სქემა Atmega8-ზე:

    როგორც ხედავთ, არაფერი განსაკუთრებული, მიკროკონტროლერი, სამი რეზისტორი და ორი LED დინამიკით. დიაგრამაში ღილაკის ნაცვლად, შეგიძლიათ გამოიყენოთ, მაგალითად, ლერწმის შეცვლა ან სხვა კონტაქტი. წრე მუშაობს შემდეგნაირად: დენის ჩართვის შემთხვევაში LED D3 ანათებს (ან ციმციმებს, მიკროსქემის ვერსიიდან გამომდინარე), თუ სენსორს არ შეეხება, სირენა ჩუმდება. სენსორის ამოქმედებისთანავე გაისმა განგაში და ამავდროულად ციმციმებს LED D2. პირადად მე ტრანზისტორის გადამრთველის საშუალებით დავაკავშირე პინი 24 PC1 რელეზე, რელე კი სკუტერის წინა ფარასთან სერიით, რომ განგაშის ატეხვისას სკუტერის ფარი მოციმციმეს. სირენის გასაჩერებლად, თქვენ უნდა გამორთოთ და ჩართოთ წრე ან დააჭიროთ ღილაკს ხელახლა. მინდა აღვნიშნო, რომ კონტროლერიდან სიგნალი შეიძლება გაძლიერდეს რამდენიმე ტრანზისტორით მცირე გამაძლიერებლის შეკრებით - რაც ძირითადად გავაკეთე, თუმცა დიაგრამაზე არ გამოვხატე ეს წრე. მიკროკონტროლერი მუშაობს შიდა 8 მეგაჰერციანი ოსცილატორიდან, შესაბამისად ვაყენებთ ფუჟერებს.

    PCB Atmega8-ისთვის ასე გამოიყურება:

    ჩართვა Attiny2313-ზე დიდად არ განსხვავდება პირველი ვარიანტისგან, უბრალოდ აქვს სხვადასხვა გამომავალი პორტები.

    სქემა Attiny2313-ზე:

    მიკროსქემის ამ ვერსიისთვის, მე დავწერე მხოლოდ ერთი პროგრამული უზრუნველყოფა, ერთი სიგნალის ვარიანტით, ყოველი შემთხვევისთვის, ავაწყე წრე დამაგრებული ინსტალაციის გამოყენებით და შევამოწმე მისი ფუნქციონირება. მიკროკონტროლერი მუშაობს შიდა 4 MHz ოსცილატორიდან (შეიძლება ციმციმება 1 MHz-მდე), პროგრამირების დროს საკრავები დაყენებულია შემდეგზე:

    ვინაიდან ხელთ არ მქონდა ცოცხალი Atmega8 კონტროლერი, ავაწყე წრე Attiny2313-ზე, წრე მაშინვე იმუშავა, ჩართვა ავაწყე ზედაპირზე დამონტაჟებული ინსტალაციის გამოყენებით, ქვემოთ მოცემულია ფოტო:

    ისე, აქ არის მიკროსქემის მუშაობის ვიდეო, ვიდეო ნამდვილად არ არის საუკეთესო ხარისხის და თქვენ ვერ ხედავთ მასზე მოციმციმე LED-ს, რადგან კადრების სიხშირე დაბალია.

    ჩამოტვირთვა პროექტები შეგიძლიათ იხილოთ ქვემოთ მოცემულ პროგრამულ უზრუნველყოფაში და PCB ფაილებში

    რადიოელემენტების სია

    აღნიშვნა ტიპი დასახელება რაოდენობა შენიშვნამაღაზიაჩემი ბლოკნოტი
    U1 MK AVR 8 ბიტიანი

    ATmega8-16PU

    1 რვეულში
    R1 რეზისტორი

    47 Ohm

    1 რვეულში
    R2, R3 რეზისტორი

    270 Ohm

    2 რვეულში
    სქემა Attiny2313-ზე
    U1 MK AVR 8 ბიტიანი