Obsluha portu s připojeným reproduktorem

Programování reproduktoru

Při programování zvuku používáme bitovou instrukci (pracuje s jedním bitem).

Příklad P1.0 - nultý bit portu 1:

SETB P1.0

CLR P1.0

CPL P1.0

Princip generování zvuku dané frekvence

Analogový signál nahrazujeme v číslicové technice obdélníkovým signálem, tedy vysíláním jedničky a nuly po dobu půlperiody. Délku půlperiod si vypočítáme ze zadané frekvence.

 

Obr. 1: Perioda

Plynulý tón dané frekvence vytvoříme vysíláním jedničky a nuly po dobu půlperiody.

Reproduktor je ovládán pouze jedním bitem (kromě dvou napájecích vodičů).

Reproduktor je v našem případě připojen na nultý bit portu P1.

Plynulý tón f = 500 Hz (TON500)

Řešení :

Z frekvence vypočítáme periodu T = 1/f,  T = 1/500 = 2 ms.

Z periody vypočítáme půlperiodu T/2 = 1 ms.

Po dobu půlperiody vysíláme 1, po dobu půlperiody vysíláme 0.

Program:

TON500: SETB P1.0               ; vysíláme jedničku na P1.0

              CALL MS1                ; doba půlperiody pro f = 500 Hz

              CLR P1.0                  ; vysíláme nulu na P1.0

              CALL MS1                ; doba půlperiody pro f =500 Hz

              JMP TON500            ; plynulý tón f = 500 Hz

include(CAS.ASM)                  ; podprogram vlastních časů, kde máme ;1ms

END

Časy realizující půlperiody v tónech můžeme includovat přímo z již vytvořených podprogramů, (pokud jsou v nich obsaženy), nebo si časy vytvoříme jako podprogramy pod hlavním programem.

Úpravou vytvoříme program pro plynulý tón 1000 Hz (TON1000)

      TON1000:     SETB P1.0                    ; vysíláme jedničku na P1.0

                           CALL M5S                     ; doba půlperiody pro f = 1000 Hz

                           CLR P1.0                       ; vysíláme nulu na P1.0

                          CALL M5S                      ; doba půlperiody pro f =1000 Hz

                          JMP TON1000                ; plynulý tón f = 1000 Hz

                         Include(CAS.ASM)           ; podprogram vlastních časů

                         END

Princip generování zvuku danou dobu

Pro zadanou dobu určitého tónu je potřeba vypočítat počet period, které budeme za sebou generovat. Jsou dvě možnosti výpočtu počtu period. Buď frekvenci vynásobíme délkou tónu, nebo délku tónu vydělíme délkou periody.

Příklad: Pro délku tónu 0,2 s a frekvenci 500 Hz je počet period 100.

Musíme tedy vyslat za sebou 100 period, aby tón trval 0,2 s.

Princip generování symetrického tónu 0,2 s zvuk a 0,2 s ticho

 

Obr. 2: Příklad signálu pro zvuk

Řešení:

Hlavní program si rozdělíme na dva podprogramy, první řeší tón 0,2 s frekvence 500 Hz, druhý řeší prodlevu – ticho délky 0,2 s.

                  ST:           CALL TON                          ; realizace 100 T tónu 500 Hz

                                  CALL TICHO                       ; realizace ticha 200 ms

                                  JMP ST                              ; opakování dokola

              TON:       MOV R7,#100                     ; počet opakování period 0,2 s x 500 = 100

              HLP:       CALL PER                         ; realizace jedné periody

                                   DJNZ R7,HLP                     ; opakování 100 x

                                   RET

                  PER:         SETB P1.0                       ; vysíláme jedničku na P1.0

                                   CALL MS1                       ; doba půlperiody pro f = 500 Hz

                                   CLR P1.0                         ; vysíláme nulu na P1.0

                                   CALL MS1                       ; doba půlperiody pro f =500 Hz

                                    RET; jen jedna perioda f = 500 Hz

                    TICHO:     CALL MS200

                                    RET

                                  include(CAS:ASM)

                                  END

K realizaci jedné periody jsme využili předešlý program pro plynulý tón, ze kterého jsme vytvořili podprogram pro jednu periodu. K opakování počtu period jsme použili registr R7. Kdybychom použili registr R0 nebo R1, který využívá podprogram CAS.asm, docházelo by k přepisování registrů. Časy, které potřebujeme, si samozřejmě můžeme vytvořit samostatně jako podprogramy - třeba i časovačem.

Princip generování symetrického tónu 0,25 s zvuk a 0,25 s ticho – stále dokola

                     ST:             CALL TON                              ; realizace 125 T tónu 500 Hz

                                      CALL TICHO                            ; realizace ticha 200 ms

                                      JMP ST                                   ; opakování dokola

 TON:           MOV R7,#125                         ; počet opakování period 0,25 s x 500 = 125

                   HP:             CALL PER                               ; realizace jedné periody

                                      DJNZ R7,HP                            ; opakování 125 x

                                      RET

                   PER:           SETB P1.0                              ; vysíláme jedničku na P1.0

                                      CALL MS1                             ; doba půlperiody pro f = 500 Hz

                                      CLR P1.0                               ; vysíláme nulu na P1.0

                                     CALL MS1                              ; doba půlperiody pro f =500 Hz

                                      RET                                       ; jen jedna perioda f = 500 Hz

               TICHO:            CALL MS200                          ; časová smyčka 200 ms

                                     CALL MS50                            ; časová smyčka 50 ms

                                     RET

                     MS50:      MOV R2,#50                           ; časová prodleva 50 ms

             KS:         CALL MS1                              ; nutno použít jiný registr než R0

                                     DJNZ R2,KS

                                     RET

                                      include(CAS.ASM)

                                     END

Princip generování nesymetrického tónu

Generování nesymetrického tónu: 0,25 s tón a 0,25 s ticho, 0,75 s tón a 0,75 s ticho – stále dokola (f = 500 Hz) – princip telefonního oznamovacího tónu.

Obr. 3: Nesymetrický tón

První část tónu (0,25,-0,25) je již vyřešena v předcházejícím programu.

Druhá část tónu (0,75- 0,75) se  v tomto případě dá vytvořit z prvního tónu.

 

          NS:              CALL TON1                    ; první část tónu (0,25 s – 0,25 s)

                             CALL TON2                    ; druhá část tónu (0,75 s – 0,75 s)

                             JMP NS                         ; stále dokola zní dva různě dlouhé tóny

  

       TON1:            CALL TON                       ; realizace 125 T tónu 500 Hz

                            CALL TICHO                    ; realizace ticha 250 ms

                             RET                               ; opakování dokola

         TON:            MOV R7,#125                 ; počet opak. period 0,25 s x 500 = 125

          HOP:           CALL PER                     ; realizace jedné periody

                             DJNZ R7,HOP                ; opakování 125 x

                             RET

             PER:        SETB P1.0                     ; vysíláme jedničku na P1.0

                             CALL MS1                     ; doba půlperiody pro f = 500 Hz

                             CLR P1.0                       ; vysíláme nulu na P1.0

                             CALL MS1                      ; doba půlperiody pro f =500 Hz

                             RET                                ; jen jedna perioda f = 500 Hz

               TICHO:    CALL MS200                   ; časová smyčka 200 ms

                             CALL MS50                     ; časová smyčka 50 ms

                             RET

 

           MS50:        MOV R2,#50                     ; časová prodleva 50 ms

               SK:        CALL MS1

                             DJNZ R2,SK                      ; zajistí opakování

                             RET

 

             TON2:       CALL TON                        ; realizace 125 T tónu 500 Hz

                             CALL TON                        ; realizace 125 T tónu 500 Hz

                             CALL TON                        ; realizace 125 T tónu 500 Hz

                             CALL TICHO; realizace ticha 250 ms

                             CALL TICHO                     ; realizace ticha 250 ms

                             CALL TICHO                     ; realizace ticha 250 ms

                             RET

                             include(CAS:ASM)

                               END

Princip generování nesymetrického tónu dvou frekvencí

 

Obr. 4: Tón 2 frekvencí

Generujte nesymetrický tón dvou frekvencí tón f = 1000 Hz délky 0,4 s a 0,4 s ticho, ihned potom vygenerujte tón f = 2000 Hz délky 0,1 s a 0,1 s ticho. Vše na portu P1.

Doporučuji řešit 2 podprogramy!!!!

Všechna zadaná a vypočítaná data si přehledně zobrazíme v tabulce.

Tabulka 15

frekvence perioda půlperioda délka tónu počet realizovaných period délka prodlevy
1000 Hz 1 ms 0,5 ms 0,4 s 400 = provedu 2x 200 0,4s = 2x 0,2s
2000 Hz 0,5 ms 0,25 ms 0,1 s 200 0,1 s

Pokud byste chtěli kombinovat zvuk s jiným přípravkem, připisujete jenom další podprogramy a hlídáte si porty.

Kdybyste  třeba chtěli k předešlému programu 2 tónu přidat rotaci LED, připíšete do hlavního programu další podprogram, který vyřešíte.

            ST:            CALL FR1            ; f = 1000 Hz délky 0,4 s a ticha 0,4 s

                             CALL FR2            ; f = 2000 Hz délky 0,1 s a ticha 0,1 s

                             CALL ROTACE     ; realizace rotace LED na druhém portu

                             JMP ST

Zdroje
  • VESELÁ, Zuzana. Mikroprocesorová technika. Interní skriptum, VOŠ a SPŠE Olomouc. 2013

Obrázky​:

  • Obr. 1 - Obr. 4: Archiv autora
Doplňující učivo

Vytvoř si program zvuku stupnice C-dur. Frekvence vyhledej na internetu.