SYSTEMY MIKROPROCESOROWE stroik do gitary projekt Wojciech Pietkiewicz icek@rab.ict.pwr.wroc.pl
Spis treści 1 Idea działania stroika 3 2 Realizacja stroika 3 2.1 Analogowa część układu............................. 3 2.2 Realizacja stroika w HC11............................ 5 2.2.1 Wybór odpowiedniego taktowania HC11................. 6 2.2.2 Wstępna konfiguracja HC11....................... 6 2.2.3 Algorytm działania stroika zrealizowany dla HC11........... 7 2.2.4 Podłączenia pinów HC11......................... 8 3 Listing programu stroik 9
1 Idea działania stroika Idea działania stroika jest bardzo prosta. Stroik ma analizować sygnał z gitary, porównywać go ze wzorcem i wyświetlić wynik porównania za pomocą trzech diod. Przykładowo jeżeli struna będzie za mało naciągnięta świecić się będzie dioda lewa, gdy za bardzo to prawa. Tabela nr 1 przedstawia dokładnie zachowanie się stoika. Konkretną strunę do strojenia wybieramy poprzez przycisk, który będzie zmieniał struny po kolei od najniższej (struna E1 najcieńsza) do najwyższej (struna E6 najgrubsza) i od nowa, zapalając odpowiednio 6 diod. Dodadkowo stroik zostanie zaopatrzony w diodę kontrolną mówiącą o tym, że odbywa się pomiar czestotliwości (świecąca dioda). Dioda lewa Dioda środkowa Dioda prawa (zielona) (czerwona) (zielona) Częstotliwość zapalona za mała (naciągnąć strunę) zapalona zapalona minimalnie za mała (naciągnąć strunę) zapalona równa zadanej (struna dostrojona) zapalona zapalona minimalnie za duża (poluzować strunę) zapalona za duża (poluzować strunę) Tablica 1: Sygnalizacja częstotliwości dźwięku strojonej struny. 2 Realizacja stroika Do zliczania ilości okresów (czyli częstotliwości) wykorzystany jest mikroprocesor motoroli HC11 (http://www.mcu.mot-sps.com). Przed zliczaniem okresów sygnał z gitary należy najpierw odpowiednio przetworzyć, tak aby jego amplituda była wystarczającą wysoka oraz miał prostokątny kszałt. 2.1 Analogowa część układu Problemem odpowiedniego formowania sygnału zajmuje się układ analogowy przedstawiony na rysunku 1. Układ ten posiada jedno wejście, do którego należy podłączyć gitarę (WE) oraz dwa wyjścia podłączone bezpośrednio do HC11. Na wejściu IC3 HC11 otrzymujemy przetworzony sygnał z gitary odpowiednio wzmocniony oraz o kształcie prostokątnym. Wejście IC2 służy do informowania HC11 o tym czy sygnał na wejściu IC3 jest na tyle stabilny, że można na jego podstaiwe dokonywać pomiaru częstotliwości. Trzy rezystory (R1, R2, R3) mają za zadanie odpowiednio wzmocnić sygnał z gitary, w zależności od tego, którą strunę chcemy stroić (sygnał od różnych strun posiada inną amplitudę). Dzięki podłączeniu tych rezystorów bezpośrednio do dwukierunkowych wejść HC11 (PC5 PC7) możemy każdy z nich albo podłączać do masy albo do bardzo wysokiej impedancji, co w praktyce oznacza podłączenie lub rozłączenie rezystora. 3
Rysunek 1: Schemat części analogowej stroika. 4
Rysunek 2: Zasilanie do stroika. UWAGA 1: Zwrócić należy uwagę na to, że najmniejsza częstotliwość struny wynosi około 80Hz co jest bliskie częstotliwości sieci zasilania, może to wprowadzić zakłócenia w pomiarze, ale niestety nie zostało to sprawdzone. UWAGA 2: Ponieważ projekt nie został uruchomiony nie wiadomo, które rezystory R1 R3 należy włączać, dla której struny. (a) Wzmacniacz operacyjny LM311. (b) Wzmacniacz operacyjny CA3140. 2.2 Realizacja stroika w HC11 Ponieważ HC11 posiada coś w rodzaju stopera (input capture) obliczanie częstotliwości jest dość łatwym zadaniem, właściwie należy dobrać odpowiednio częstotliwość taktowania zegara. Częstotliwość ta powinna zapewnić odpowiednią rozdzielczość pomiarowa, czyli wystarczającą dokładność z jaką dokonujemy pomiarów. Musimy także wiziąć pod uwagę czas trwania mierzonego sygnału. Dobrze byłoby gdyby czas trwania najdłuższego okresu nie powodował przepełnienia licznika timera. 5
2.2.1 Wybór odpowiedniego taktowania HC11 W celu zwiększenia dokładności pomiarów zliczana jest 10-cio krotna wartość okresu. Należy, więc tak dobrać częstotliwość taktowania zegara, aby 10-cio krotność najdłuższego okresu nie powodowała przepełnienia się licznika oraz jednoczeście zapewniała jak największą rozdzielczość. Kryteria te są spełnione gdy HC11 jest taktowany kwarcem 8MHz przy dzielniku 8, daje to rozdzielczość 4µs oraz czas przepełniania 262,1ms. W tabeli 2 przedstawione zostały okresy sygnałów dla poszczególnych strun, dodatkowo przeliczone one zostały na ilość taktów HC11. struna dźwięk okres [ms] ilość tików jednego okresu (4µs) ilość tików dziesięciu okresów E6 E 12,135 3033,75 30338 A5 A 9,091 2272,75 22728 D4 d 6,810 1702,5 17025 G3 g 5,102 1275,5 12755 H2 h 4,050 1012,5 10125 E1 e1 3,034 758,5 7585 Tablica 2: Liczba taktów HC11 o rozdzielczości 4µs dla poszczególnych strun. 2.2.2 Wstępna konfiguracja HC11 Aby uzyskać 4µs tik procesora należy w rejestrze TMSK2 ustawić bit PR1=1 oraz bit PR2=0. Dokonując pomiaru częstotliwości powinnyśmy sprawdzać, czy sygnał jest stabilny. Aby to zrobić musimy reagować na stan wysoki na wejściu IC2, ilustruje to rysunek 3. Rysunek 3: Poglądowa ilustracja sygnałów na wejściach HC11. Początkowo, więc wszystkie wejścia input capture reagują na zbocza narastające. Diody pokazujące wynik, oraz dioda kontrolna podłączone są do dwukierunkowego portu HC11 PORTC, dlatego też bity PC0 PC3 muszą być ustawione jako wyjściowe. 6
2.2.3 Algorytm działania stroika zrealizowany dla HC11 Rysunek 4 przedstawia algorytm działania programu zaimplementowanego na mikroprocesorze HC11 realizujący stroik do gitary. Algorytm ten pracuje w pętli nieskończonej, dlatego też, w momencie gdy któraś gałąź algorytmu zostanie wykonana następuje powrót do bloczka start. Rysunek 4: Algorytm działania stroika zrealizowanego dla HC11. 7
Wyświetlaniem wyników pomiarów zajmuje się algorytm przedstawiony na rysunku 5. Rysunek 5: Algorytm wyświetlania wyników pomiarów na trzech diodach 2.2.4 Podłaczenia pinów HC11 Poniższa tabela przedstawia podłączenia pinów HC11. PA0/IC3 PA1/IC2 PA2/IC1 PB0-PB5 PC0-PC2 PC3 PC5-PC7 pomiar częstotliwości zezwolenie na dokonanie pomiarów przycisk zmieniający struny 6 diod symbolizujących struny wyswietlenie wyniku pomiaru dioda kontrolna (jest pomiar) wyjścia włączające, wyłączające rezystory R1 R3 Tablica 3: Podłączenia pinów HC11. 8
3 Listing programu stroik * plik: stroik.asm * * Stroik do gitary elektrycznej, badz z przetwornikem * * (C) Wojtek Pietkiewicz 2001 ** Ustawienie rejestrow. Beda adresowane poprzez index, X * REGBAS EQU $1000 ;Starting address for register block PORTA EQU $00 ;I/O Port A PORTC EQU $03 ;I/O Port C PORTB EQU $04 ;Output Port B DDRC EQU $07 ;Data Direction for Port C PORTD EQU $08 ;I/O Port D DDRD EQU $09 ;Data Direction for Port D PORTE EQU $0A ;Input Port E DDRA EQU $26 ;Data Direction for Port A (DDRA3, DDRA7) TCNT EQU $0E ;Timer Counter Register (HB,LB, 2 bytes) TIC1 EQU $10 ;Input Capture 1 Register TIC2 EQU $12 ;Input Capture 2 Register TIC3 EQU $14 ;Input Capture 3 Register TCTL1 EQU $20 ;Timer Control Register 1 TCTL2 EQU $21 ;Timer Control Register 2 TMSK1 EQU $22 ;Timer Interrupt Mask Register 1 TFLG1 EQU $23 ;Timer Interrupt Flag Register 1 TMSK2 EQU $24 ;Timer Interrupt Mask Register 2 TFLG2 EQU $25 ;Timer Interrupt Flag Register 2 OPTION EQU $39 ;System Configuration Options COPRST EQU $3A ;Arm/Reset COP Timer Circuity PPROG EQU $3B ;EEPROM Program Control Register HPIRO EQU $3C ;Highest Priority I-Bit Int and Misc INIT EQU $3D ;RAM and I/O Mapping Register TEST1 EQU $3E ;Factory TEST Countrol Register CONFIG EQU $3F ;COP,ROM and EEPROM Enables 9
* Zmienne pomocnicze ORG 0 OKRES RMB 2 ;ile wynosi 1 okres OKRES_C RMB 2 ;Okres zmierzony w cyklach LICZNIK RMB 1 ;Licznik np. pomiarow STRUNA RMB 1 ;pierwsze 6 bitow to struny * 6 5 4 3 2 1, 1 - najciensza struna * progi do sprawdzania wynikow pomiaru PRD1 RMB 2 ;prog 1 dolny PRG1 RMB 2 ;prog 1 gorny PRD2 RMB 2 ;prog 2 dolny PRG2 RMB 2 ;prog 2 gorny XDEF START * Program glowny - STROIK * inicjalizacja START: LDX #REGBAS ;wskazanie na blok rejestrow $1000 BSET TMSK2,X,#$02 ;PR1=1 PR2=0 (4us/262.1ms) LDAA #%00010101 ;IC1, IC2, IC3 bedzie reagowac STAA TCTL2,X ;na zbocza narastajace LDAA #$FF STAA TFLG1,X ;IC1F, IC2F, IC3F wyczyszczone ;(OC tez) BSET TMSK1,X,#$06 ;IC1I,IC2I maja zezwolenie na ;przerwanie * konfigurowanie portow BSET DDRC,X,#$0F ;PC0-PC3 sa ustawione jako wyjsciowe * inicjalizacja zmiennych LDD #$00 STD OKRES STD OKRES_C STD PRD1 STD PRG1 STD PRD2 STD PRG2 LDAA #10 STAA LICZNIK LDAA #$01 STAA STRUNA 10
* IC1SR - Obsluga przerwania IC1 * obsluga przycisku IC1SR: LDAB #10 STAA LICZNIK BSR CZEKAJ10 * odczytanie pinu PA2 czy ma stan wysoki LDAA PORTA ANDA #$04 BEQ KONIEC_IC1 ;gdy PA2 = 0 to koniec BCLR TMSK1,X,#$07 ;IC1I,IC2I,IC3I zablokowanie JESZCZE_RAZ:BRA CZEKAJ10 LDAA PORTA ANDA #$04 BEQ USTAW_S ;gdy PA2 = 0 (przycisk puszczony) to ;ustaw odpowiednia strune LDAA LICZNIK ;w petli uzyty LICZNIK bo AccB jest ;wykorzystany w CZEKAJ10 DECA STAA LICZNIK BNE JESZCZE_RAZ ;sprawdzam 10 raz? BRA KONIEC_IC1 ;jak tak to koniec przerwania USTAW_S: BRA ZMIEN_S ;ustawiamy odpowiednia strune * ustawiam odpowiednie wzmocnienia wejsciowe * ale jeszcze nie wiem ktore rezystory LDAA STRUNA NEGA STAA PORTB ;zapalam odpowiednia diode (nr struny) KONIEC_IC1: BSET TMSK1,X,#$06 ;odblokowane tylko IC1I,IC2I LDAA #$05 ;wyczysczenie IC1F,IC3F STAA TFLG1,X RTI 11
* IC2SR - Obsluga przerwania IC2 * przerwanie ktore zezwala, albo nie zezwala na * zliczanie okresow IC2SR: BRCLR TCTL2,X,#$04,ZMIEN_ZB ;zbocze jest opadajace wiec ;zmien * zbocze jest narastajace, wiec mozna dokonywac pomiaru LDAA #%00011001 ;IC1,IC3 na zbocze narastajace, ;natomiast STAA TCTL2,X ;IC2 na zbocze opadajace * zapal diode kontrolna LDAA #$07 ;zapelenie diody kontrolnej 0 111 STAA PORTC ;i zgaszenie innych diod BSET BRA TMSK1,X,#$01 ;IC3I ma zezwolenie na przerwanie ;(mozna zliczac) IC2SR_K * koniec pomiaru - sygnal jest za slaby ZMIEN_ZB: LDAA #%00010101 ;IC1, IC2, IC3 bedzie reagowac STAA TCTL2,X ;na zbocza narastajace BCLR TMSK1,X,#$01 ;IC3I zablokowanie LDAA #$01 ;wyczyszczenie IC3F poprzez wpisanie ;do rejestru STAA TFLG1,X ;TFLG1 jedynki pod bitem ICF3 * zgas diode kontrolna LDAA #$0F ;zgaszenie diody kontrolnej STAA PORTD ;oraz pozostalych diod IC2SR_K: LDAA #$02 ;wyczyszczenie IC2F poprzez wpisanie do ;rejestru STAA TFLG1,X ;TFLG1 jedynki pod bitem ICF2 RTI 12
* IC3SR - Obsluga przerwania IC3 * zliczanie okresow * mozna lapac pierwsze zbocze IC3SR: LDAB #10 POMIAR: BRCLR TFLG1,X,#$01,POMIAR ;czekaj na zbocze * jest zbocze LDD TIC3,X ;czas pierwszego zbocza STD OKRES LDAA #$01 STAA TFLG1,X ;wyczyszczenie IC3F przed nastepnym ;zboczem * mozna lapac drugie zbocze zbocze BRCLR TFLG1,X,#$01,* ;czekaj na zbocze * jest zbocze LDD TIC3,X ;czas drugiego zbocza SUBD OKRES ;2-gie - 1-wsze -> okres ADDD OKRES_C STD OKRES_C ;OKRES_C = OKRES_C + OKRES * kolejny pomiar DECB BNE POMIAR ;moze juz jest 10 pomiarow? * jest juz 10 pomiarow BSR USTAW_P ;ustaw odpowiednie progi w zaleznosci od ;struny JSR WYSWIETL LDAA #$01 STAA TFLG1,X ;wyczyszczenie IC3F przed nastepnym ;zboczem RTI * UNUSED - Obsluga przerwania nieuzywanego UNUSED: RTI 13
* Funkcje *** OPOZNIENIE dokladnie 10ms CZEKAJ10: LDAA #9 ;2*4us = 0.008ms CZEK_TMP1: LDAB #54 ;2*4us = 0.008ms \ CZEK_TMP2: DECB ;2*4us = 0.008ms \ \ BNE CZEK_TMP2 ;3*4us = 0.012ms /=1.08ms >=9.972ms DECA ;2*4us = 0.008ms / BNE CZEK_TMP1 ;3*4us = 0.012ms / RTS ;5*4us = 0.02ms *** ZMIEN_Strune 1->2->3->4->5->6->1 ZMIEN_S: BRSET STRUNA,#$20,NA_1 ;gdy struna 6 to ustaw na 1 ASL STRUNA ;przestawienie nr stuny na kolejny NA_1: LDAA $01 STAA STRUNA RTS *** USTAWienie_Progow w zaleznosci od wybranej struny USTAW_P: BRSET STRUNA,#$01,ST1 ;struna 1 BRSET STRUNA,#$02,ST2 ;struna 2 BRSET STRUNA,#$04,ST3 ;struna 3 BRSET STRUNA,#$08,ST4 ;struna 4 BRSET STRUNA,#$10,ST5 ;struna 5 * struna 6 LDD #30038 STD PRD1 LDD #30638 STD PRG1 LDD #29338 STD PRD2 LDD #31338 STD PRG2 ST5: LDD #22428 STD PRD1 LDD #23028 STD PRG1 LDD #21728 STD PRD2 LDD #23728 STD PRG2 14
ST4: LDD #16725 STD PRD1 LDD #17325 STD PRG1 LDD #16025 STD PRD2 LDD #18025 STD PRG2 ST3: LDD #12455 STD PRD1 LDD #13055 STD PRG1 LDD #11755 STD PRD2 LDD #13755 STD PRG2 ST2: LDD #9825 STD PRD1 LDD #10425 STD PRG1 LDD #9125 STD PRD2 LDD #11125 STD PRG2 ST1: LDD #7285 STD PRD1 LDD #7885 STD PRG1 LDD #6585 STD PRD2 LDD #8585 STD PRG2 RTS 15
*** WYSWIETLenie wynikow pomiaru na 3 diodach WYSWIETL: LDD OKRES_C SUBD PRD1 BMI ZA_DUZO ;skocz gdy OKRES_C-PRD1 < 0 LDD OKRES_C SUBD PRG1 BMI NASTROJONA ;skocz gdy OKRES_C-PRG1 < 0 LDD OKRES_C SUBD PRG2 BMI MALO ;skocz gdy OKRES_C-PRG2 < 0 * duzo za mala czestotliwosc, trzeba naciagnac strune * zapalamy diody -> * LDAA #$03 ;0 011 STAA PORTC MALO: ;za mala czestotliwosc ale juz prawie jest dobrze ;zapalamy diody -> * * LDAA #$01 ;0 001 STAA PORTC NASTROJONA: ; jest dobrze ta struna jest nastrojona ; zapalamy diody -> * LDAA #$05 ;0 101 STAA PORTC ZA_DUZO: ;* za bardzo naciagnieta struna, pytanie jak bardzo LDD OKRES_C SUBD PRD2 BMI POLUZUJ ;skocz gdy OKRES_C-PRD2 < 0 * za duza czestotliwosc, trzeba troszke poluzowac strune * zapalamy diody -> * * LDAA #$04 ;0 100 STAA PORTC POLUZUJ: ; duzo za duza czestotliwosc, trzeba bardzo poluzowac ; strune ; zapalamy diody -> * LDAA #$06 ;0 110 STAA PORTC RTS 16
* Przerwania i reset vectors ORG $FFD6 FDB UNUSED ;SCI serial system FDB UNUSED ;SPI serial transfer complete FDB UNUSED ;Pulse accumulator input edge FDB UNUSED ;Pulse accumulator overflow FDB UNUSED ;Timer overflow FDB UNUSED ;Timer IC4/OC5 FDB UNUSED ;Timer OC4 FDB UNUSED ;Timer OC3 FDB UNUSED ;Timer OC2 FDB UNUSED ;Timer OC1 FDB IC3SR ;Timer IC3 FDB IC2SR ;Timer IC2 FDB IC1SR ;Timer IC1 FDB UNUSED ;Real-time interrupt FDB UNUSED ;notirq (external pin) FDB UNUSED ;notxirq pin FDB UNUSED ;Software interrupt FDB UNUSED ;Illegal opcode trap FDB UNUSED ;COP failure FDB UNUSED ;Clock monitor fail FDB START ;notreset 17
Bibliografia [1] HC11 Technical data. [2] HC11 Reference manual. [3] Praktyczny Elektronik, nr 6/99, str. 19. 18