Baixe o app para aproveitar ainda mais
Prévia do material em texto
Timer e Reproduc¸a˜o de Sons Prof.MSc.Rodrigo Maximiano Antunes de Almeida Universidade Federal de Itajuba´ rodrigomax@unifei.edu.br ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 1 / 1 Serial, PWM e ADC Revisa˜o ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 2 / 1 Comunicac¸a˜o Serial Para dois dispositivos se comunicarem e´ necessa´rio compatibilizar o sistema f´ısico e o sistema lo´gico. F´ısico (Hardware) Tipo de conector Pinagem do conector N´ıveis de tensa˜o Lo´gico (Software) Codificac¸a˜o utilizada Tamanho da palavra Tamanho do stop/start bits Bit de paridade Taxa de transmissa˜o ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 3 / 1 Serial 1 #include "serial.h" 2 #include "basico.h" 3 v o i d EnviaSerial ( uns igned char c ) { 4 w h i l e ( ! BitTst ( PIR1 , 4 ) ) ; // aguarda o r e g i s t r o f i c a r d i s p o n ı´ v e l 5 TXREG=c ; // c o l o c a o v a l o r para s e r e n v i a d o 6 } 7 uns igned char RecebeSerial ( v o i d ) { 8 i f ( BitTst ( PIR1 , 5 ) ) // V e r i f i c a s e e x i s t e dado d i s p o n ı´ v e l 9 { 10 r e t u r n RCREG ; // r e t o r n a o v a l o r 11 } 12 r e t u r n 0 ; // c o n d i c¸ a˜ o de e r r o 13 } 14 v o i d InicializaSerial ( v o i d ) { 15 TXSTA = 0b00101100 ; // c o n f i g u r a a t r a n s m i s s a˜ o de dados 16 RCSTA = 0b10010000 ; // c o n f i g u r a a r e c e p c¸ a˜ o de dados 17 BAUDCON = 0b00001000 ; // c o n f i g u r a s i s t e m a de v e l o c i d a d e 18 SPBRGH = 0b00000000 ; // c o n f i g u r a para 56 k 19 SPBRG = 0b00100010 ; // c o n f i g u r a para 56 k 20 BitSet ( TRISC , 6 ) ; // p i n o de r e c e p c¸ a˜ o de dados 21 BitClr ( TRISC , 7 ) ; // p i n o de e n v i o de dados 22 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 4 / 1 Serial 1 #include "basico.h" 2 #include "config.h" 3 #include "serial.h" 4 v o i d main ( v o i d ) { 5 uns igned i n t i , j=0; 6 char msg [ ] = "Hello World!" ; 7 uns igned char resp ; 8 TRISD = 0x00 ; // a c e s s o aos l e d s 9 InicializaSerial ( ) ; 10 f o r ( ; ; ) { 11 f o r ( i = 0 ; i < 65000 ; i++) ; // d e l a y 12 EnviaSerial ( msg [ j ] ) ; // e n v i a dados 13 j++; 14 i f ( j > 11) { 15 j=0; 16 EnviaSerial ( 1 3 ) ; // e n v i a quebra de l i n h a 17 } 18 resp = RecebeSerial ( ) ; // r e c e b e dados 19 i f ( resp !=0){ 20 PORTD = resp ; 21 } 22 } 23 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 5 / 1 Conversor AD Toda conversa˜o AD exige um determinado tempo. Para que o microcontrolador realize corretamente a conversa˜o e´ necessa´rio seguir os seguintes passos: 1 Configurar o conversor 2 Iniciar a conversa˜o 3 Monitorar o final da conversa˜o 4 Ler o valor ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 6 / 1 Conversor AD 1 #include "adc.h" 2 #include "basico.h" 3 v o i d InicializaAD ( v o i d ) 4 { 5 BitSet ( TRISA , 0 ) ; // s e t a o b i t 0 como e n t r a d a 6 ADCON0 = 0b00000001 ; // s e l e c i o n a o c a n a l 0 e l i g a o AD 7 ADCON1 = 0b00001110 ; // s o´ AN0 e´ a n a l o´ g i c o , r e f e r eˆ n c i a baseada ←↩ na f o n t e 8 ADCON2 = 0b10101010 ; //FOSC/32 , Al inhamento a` d i r e i t a e ←↩ t c o n v = 12 TAD 9 } 10 11 i n t LeValorAD ( v o i d ) 12 { 13 uns igned i n t ADvalor ; 14 BitSet ( ADCON0 , 1 ) ; // i n i c i a c o n v e r s a˜ o 15 w h i l e ( BitTst ( ADCON0 , 1 ) ) ; // e s p e r a t e r m i n a r a c o n v e r s a˜ o ; 16 ADvalor = ADRESH ; // l eˆ o r e s u l t a d o 17 ADvalor <<= 8 ; 18 ADvalor += ADRESL ; 19 r e t u r n ADvalor ; 20 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 7 / 1 Conversor AD 1 #include "basico.h" 2 #include "config.h" 3 #include "disp7seg.h" 4 #include "adc.h" 5 v o i d main ( v o i d ) { 6 uns igned i n t i ; 7 i n t temp = 0 ; 8 InicializaDisplays ( ) ; 9 InicializaAD ( ) ; 10 f o r ( ; ; ) { 11 temp = LeValorAD ( ) ; 12 MudaDigito ( ( temp / 1000) %10, 3) ; 13 MudaDigito ( ( temp / 100 ) %10, 2) ; 14 MudaDigito ( ( temp / 10 ) %10, 1) ; 15 MudaDigito ( ( temp ) %10, 0) ; 16 AtualizaDisplay ( ) ; 17 f o r ( i = 0 ; i < 1 0 0 0 ; i++) ; 18 } 19 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 8 / 1 PWM Vantagens Mais barato que uma sa´ıda analo´gica Pode ser transformado numa sa´ıda analo´gica atrave´s de um filtro passa baixa Para algumas situac¸o˜es o filtro na˜o e´ necessa´rio1 Desvantagens Na˜o e´ uma sa´ıda analo´gica 1Quando o dispositivo a ser controlado ja´ possui um filtro passa baixa, normalmente por causa da sua construc¸a˜o f´ısica. Ex: aquecimento por resisteˆncias ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 9 / 1 Conversor PWM 1 #include "pwm.h" 2 #include "basico.h" 3 4 v o i d SetaPWM1 ( uns igned char porcento ) { 5 6 // f o r m u l a do duty c y c l e : 7 // DC porcento = V / ( ( PR2+1) *4 ; 8 //V = DC/100 * (PR2+1) * 4 = DC * (PR2+1) /25 9 10 uns igned i n t val = ( ( uns igned i n t ) porcento ) *( PR2+1) ; 11 val = val / 2 5 ; 12 13 // g a r a n t e que tem apenas 10 b i t s 14 val &= 0x03ff ; 15 16 // os 8 p r i m e i r o s b i t s s a˜o c o l o c a d o s no CCPR1L 17 CCPR1L = val >> 2 ; 18 19 // os u´ l t i m o s d o i s s a˜o c o l o c a d o s na p o s i c¸ a˜ o 5 e 4 do CCP1CON 20 CCP1CON |= ( val & 0x0003 ) << 4 ; 21 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 10 / 1 Conversor PWM 1 v o i d SetaPWM2 ( uns igned char porcento ) 2 { 3 uns igned i n t val = porcento * PR2 ; 4 val /= 2 5 ; 5 val &= 0x03ff ; 6 CCPR2L = val >> 2 ; 7 CCP2CON |= ( val & 0x0003 ) << 4 ; 8 } 9 v o i d SetaFreqPWM ( uns igned i n t freq ) 10 { 11 //PR2 = f o s c /( fpwm*4* p r e s c a l e r )−1 = (8000000/( f r e q *4*16) ) − 1 12 PR2 = (125000/( freq ) ) {}− 1 ; 13 } 14 v o i d InicializaPWM ( v o i d ) 15 { 16 BitClr ( TRISC , 2 ) ; // c o n f i g u r a os p i n o s como s a ı´ d a s 17 BitClr ( TRISC , 3 ) ; 18 T2CON |= 0b00000011 ; // c o n f i g u r a o p r e s c a l e do t i m e r 2 para ←↩ 1 : 1 6 19 BitSet ( T2CON , 2 ) ; // L i g a o t i m e r 2 20 CCP1CON |= 0b00001100 ; // c o n f i g u r a CCP1 como um PWM 21 CCP2CON |= 0b00001100 ; // c o n f i g u r a CCP2 como um PWM 22 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 11 / 1 Conversor PWM 1 #include "config.h" 2 #include "basico.h" 3 #include "pwm.h" 4 #include "adc.h" 5 // i n i c i o do programa 6 v o i d main ( v o i d ) 7 { 8 i n t temp ; 9 InicializaPWM ( ) ; 10 InicializaAD ( ) ; 11 f o r ( ; ; ) { 12 temp = LeValorAD ( ) ; 13 // a j u s t a n d o a f r e q u eˆ n c i a de acordo com e n t r a d a a n a l o´ g i c a 14 SetaFreqPWM ( temp ) ; 15 // a j u s t a n d o o duty−c y c l e para 50% 16 SetaPWM1 ( 5 0 ) ; 17 } 18 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 12 / 1 Timers Timers http://www.zontikgames.com/dalnegro-deluxetimer.html ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 13 / 1 Timers Timers Sa˜o circuitos eletroˆnicos que realizam a contagem do tempo, podendo ou na˜o disparar eventos em determinados instantes. ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 14 / 1 Timers Timers sa˜o circuitos/hardwares dedicados a realizar a contagem do tempo Geralmente utilizam o valor do clock ou mu´ltiplos/submu´ltiplos deste valor como frequeˆncia de incremento Cada microcontrolador possui uma certa quantidade de timers dispon´ıveis O PIC18f4550 possui 1 timer configura´vel 8 ou 16 bits (Timer0) 1 timer de 8 bits (Timer2) 2 timers de 16 bits (Timer1 e Timer3) ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 15 / 1 Timers Ao inve´s de contarmos a quantidade de ciclos quequeremos esperar e utilizar um loop for vazio, podemos utilizar os timers Modo de operac¸a˜o Inicializam-se as configurac¸o˜es necessa´rias Prescaler Fonte de clock Quantidade de bits (Timer0 apenas) Configura-se o timer com o valor desejado2 Dispara o hardware Aguarda overflow Reinicia o timer 2O valor deve ser o complemento com base na quantidade de bits dispon´ıveis ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 16 / 1 Timers Circuito esquema´tico ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 17 / 1 Timer 1 #include "basico.h" 2 #include "timer.h" 3 char FimTimer ( v o i d ) { 4 r e t u r n BitTst ( INTCON , 2 ) ; 5 } 6 7 v o i d AguardaTimer ( v o i d ) { 8 w h i l e ( ! BitTst ( INTCON , 2 ) ) ; 9 } 10 11 v o i d ResetaTimer ( uns igned i n t tempo ) { 12 uns igned ciclos = tempo * 2 ; // para 8MHz, 1 ms = 2 c i c l o s 13 ciclos = 65535 − ciclos ; // o v e r f l o w 2ˆ15−1 (16 b i t s ) 14 ciclos −= 1 4 ; // s u b t r a i tempo do o v e r h e a d 15 TMR0H = ( ciclos >> 8) ; // s a l v a a p a r t e a l t a 16 TMR0L = ( ciclos & 0x00FF ) ; // s a l v a a p a r t e b a i x a 17 BitClr ( INTCON , 2 ) ; // l i m p a a f l a g de o v e r f l o w 18 } 19 20 v o i d InicializaTimer ( v o i d ) { 21 T0CON = 0b00001000 ; // c o n f i g u r a sem p r e s c a l e r 22 BitSet ( T0CON , 7 ) ; // l i g a o t i m e r 0 23 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 18 / 1 Timer Tempo de overhead E´ o tempo necessa´rio para executar a chamada de uma func¸a˜o Pode alterar o valor na configurac¸a˜o do timer Depende do compilador Maior impacto na contagem de tempos pequenos ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 19 / 1 Timer 1 #ifndef TIMER_H 2 #define TIMER_H 3 char FimTimer ( v o i d ) ; 4 v o i d AguardaTimer ( v o i d ) ; 5 // tempo em ms 6 char ResetaTimer ( uns igned i n t tempo ) ; 7 v o i d InicializaTimer ( v o i d ) ; 8 #endif //TIMER H ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 20 / 1 Timer 1 // i n i c i o do programa 2 v o i d main ( v o i d ) 3 { 4 uns igned i n t cont ; 5 TRISD=0x00 ; 6 InicializaTimer ( ) ; 7 ResetaTimer (10000) ; 8 cont = 0 ; 9 f o r ( ; ; ) 10 { 11 AguardaTimer ( ) ; 12 ResetaTimer (10000) ; 13 cont ++; 14 i f ( cont >= 50) // 50 * 10ms = 0 ,5 s 15 { 16 PORTD ˆ= 0xFF ; 17 cont = 0 ; 18 } 19 } 20 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 21 / 1 Reproduc¸a˜o de Sons Reproduc¸a˜o de Sons ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 22 / 1 Timers A sa´ıda PWM permite va´rias frequeˆncias de trabalho Para o conjunto PIC/Cristal utilizado conseguimos gerar frequeˆncias a partir de 488,3 Hz A frequeˆncia aud´ıvel e´ de 20 a` 20.000 Hz. Com esses valores optamos por trabalhar com as notas musicais da quinta e sexta oitavas de um piano, comec¸ando em C5 ou Do´ Tenor que equivale a` 523 Hz. Para representar a auseˆncia de som sera´ utilizado o valor de 125.000 Hz A durac¸a˜o da nota sera´ feita em mu´ltiplos de 1ms, utilizando o timer0 como base de tempo ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 23 / 1 Reproduc¸a˜o de Sons 1 #include "config.h" 2 #include "basico.h" 3 #include "pwm.h" 4 #include "timer.h" 5 6 // f r e q u eˆ n c i a das n o t a s m u s i c a i s 7 #define C 523 8 #define CS 554 9 #define D 587 10 #define DS 622 11 #define E 659 12 #define F 698 13 #define FS 740 14 #define G 784 15 #define GS 830 16 #define A 880 17 #define AS 932 18 #define B 987 ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 24 / 1 Reproduc¸a˜o de Sons 1 // segunda o i t a v a 2 #define C2 C*2 3 #define C2S CS*2 4 #define D2 D*2 5 #define D2S DS*2 6 #define E2 E*2 7 #define F2 F*2 8 #define F2S FS*2 9 #define G2 G*2 10 #define G2S GS*2 11 #define A2 A*2 12 #define A2S AS*2 13 #define B2 B*2 14 15 //sem som 16 #define v 125000 ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 25 / 1 Reproduc¸a˜o de Sons 1 v o i d main ( v o i d ) 2 { 3 // i n i c i a l i z a c¸ a˜ o 4 uns igned char cont=0; 5 uns igned char pos=0; 6 // I m p e r i a l March (SW E p i s o d e V) 7 uns igned char tempo [ ] = 8 {50 , 10 , 50 , 10 , 50 , 10 , 50 , 5 , 25 , 5 , 9 50 , 5 , 50 , 5 , 25 , 5 , 50 , 50 , 50 , 10 , 10 50 , 10 , 50 , 10 , 50 , 5 , 25 , 5 , 50 , 5 , 11 50 , 5 , 25 , 5 , 50 , 50 , 100 , 5 , 25 , 5 , 12 25 , 10 , 100 , 5 , 50 , 5 , 25 , 2 , 10 , 2 , 13 10 , 2 , 100 , 2 5 0} ; 14 uns igned i n t notas [ ] = 15 {G , v , G , v , G , v , E , v , B , v , 16 G , v , E , v , B , v , G , v , D2S , v , 17 D2S , v , D2S , v , E2 , v , B , v , FS , v , 18 E , v , B , v , G , v , G2S , v , G , v , 19 G , v , G2S , v , G2 , v , F2S , v , F2 , v , 20 E2 , v , F2S , v } ; 21 InicializaPWM ( ) ; 22 InicializaTimer ( ) ; 23 // cont . ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 26 / 1 Reproduc¸a˜o de Sons 1 SetaFreqPWM ( notas [ 0 ] ) ; 2 SetaPWM1 ( 5 0 ) ; // g a r a n t e duty−c y c l e de 50% 3 // p l a y e r 4 f o r ( ; ; ) 5 { 6 AguardaTimer ( ) ; 7 ResetaTimer (10000) ; 8 cont ++; 9 i f ( cont >= tempo [ pos ] ) 10 { 11 i f ( pos<54){ 12 pos++; 13 } 14 SetaFreqPWM ( notas [ pos ] ) ; 15 SetaPWM1 ( 5 0 ) ; 16 cont=0; 17 } 18 19 } 20 } ELT024 Timer e Reproduc¸a˜o de Sons rodrigomax@unifei.edu.br 27 / 1
Compartilhar