A maior rede de estudos do Brasil

Grátis
32 pág.
apostila uc pic- hands on

Pré-visualização | Página 4 de 6

fornece em sua saída 10mV/°C. Uma conversão de 8 bits não é capaz de perceber a diferença entre 0 e 1°C. Porém, pode-se melhorar a resolução, utilizando 10 bits. Isso torna o sistema capaz de perceber uma diferença mínima de 5mV (0,5°C). Não se deve esquecer de utilizar uma variável do tipo “unsigned long int” (16 bits), cuja impressão é feita pela sintaxe “%4lu”. Outra forma de melhorar a resolução é diminuir o range do valor a ser convertido. Para isso, são utilizados sinais externos como VREFH e/ou VREFL, os quais podem ser configurados na próxima função.
setup_adc_ports(ALL_ANALOG); 
Configura todas as portas possíveis como analógicas. Neste caso, nenhuma delas poderá ser utilizada como GPIO. Para ver as possíveis configurações do periférico ADC, no IDE CCS, clique com o botão direito em #include <16F876A.h> -> “Open File at Cursor”, e vá à linha 220. Por omissão (default), serão adotados como VREFH e VREFL os sinais de alimentação, VDD e VSS, respectivamente.
setup_adc(ADC_CLOCK_INTERNAL); 
Configura a frequência de operação (fonte de relógio) do hardware.
setup_adc_channel(0); 
Este PIC tem vários canais analógicos, porém apenas um módulo de conversão. Essa função indica o canal que será ligado ao módulo para o próximo processo. Como este exemplo utiliza apenas um canal, este foi configurado na “inicialização” e não sofrerá alteração. Em uma aplicação que utiliza múltiplos canais, esta função deve estar no “loop infinito”, pois será dinâmica. O compilador recomenda que entre a configuração de um canal e a leitura do mesmo deve haver um intervalo de 10μs. Vá no “Help” do compilador (F1), na aba “Index”, e digite: “setup_adc_channel”. Veja o tópico “Examples”.
digital=read_adc(); 
Realiza a conversão A/D do último canal configurado e atribui o resultado do processo à variável “digital”.
	Note que no programa deste exemplo o backlight do display é ligado após o comando “esp(2000);”. Isso implica que, em algumas vezes, o backlight estará aceso durante a apresentação, e nas outras ele estará apagado. Isso se dá ao fato de que um canal configurado como saída, se não for atualizado, assumirá valores imprevisíveis. Essa é uma comum fonte de erros, pois saídas podem iniciar-se indevidamente acionadas e provocar prejuízos. Recomenda-se que, logo após configurar as entras/saídas, se desative todas as saídas.
	 
Figura 10 – Hardware ADC
6º EXEMPLO: UART
A UART é definida como um periférico de comunicação utilizado para troca de informações entre dispositivos digitais. Este módulo se baseia no protocolo RS-232, o mais popular padrão de comunicação assíncrona, ou seja, entre dispositivos com fontes de relógio distintas. Por isso, a grande maioria dos uCs possuem este hardware integrado. Apesar de seguirem o mesmo protocolo, um uC e uma porta serial de um PC não podem ser diretamente ligados, pois a representação elétrica dos símbolos (bits 0 e 1) não é a mesma. Os uCs utilizam o padrão TTL, ou seja, o bit 0 é representado como 0V e o bit 1 como 5V (ou a alimentação, caso seja diferente). Uma porta serial, bem como aparelhos industriais, reconhecem o sinal lógico 1 um valor entre -25V e -3V, e o sinal lógico 0 um valor entre 3 e 25V (geralmente usa-se ±12V). Essa escolha se dá ao fato de aumentar a relação sinal/ruído, permitindo uma maior taxa de transmissão, maior distância do cabo que conecta os dispositivos, além de diminuir a TEB (taxa de erro de bit). Para que um uC e um PC possam trocar informações existe o MAX232, que é um conversor de padrão elétrico para o RS-232.
Este módulo também pode ser nomeado como USART, que significa “Universal Synchronous and Asynchronous Receiver-Transmitter”. Nessa configuração, além dos sinais RX e TX, é transmitido também um sinal de relógio, fornecido por apenas um dos nós envolvidos. Uma comunicação síncrona permite uma taxa de transmissão mais elevada, pois o instante da leitura do sinal é bem definido devido à referência do relógio. O exemplo demonstrado aqui abordará a comunicação assíncrona.
Em um sistema de comunicação RS-232, todos os elementos envolvidos devem ser configuradados com os mesmos parâmentros, pois só assim o sucesso da transmissão é garantido. Como se os nós da rede “falassem a mesma língua”. Os parâmetros desse protocolo são:
Baud rate: Define a taxa de transmissão e consequentemente o tempo de bit (tbit), que é o inverso desse número. O valor mais comum é 9600 bps, e outros bastante usados são 2400, 4800, 19200 e 115200 bps (bits por segundo).
Start bit: É um parâmetro imutável, unitário, tem valor lógico zero e dura 1 tbit, como todos os outros bits transmitidos.
Payload: També chamado de carga útil, é o dado transmitido. Pode assumir de 5 a 9 bits, e seu valor padrão é 8 bits (1 byte).
Parity bit: Bit de paridade. Tem o papel de identificar erros na transmissão e, se presente, fica entre o payload e o stop bit. Pode ser configurado de três formas: paridade par, paridade ímpar ou ausente. Na paridade par, ele é inserido de forma a tornar o número de ‘1s’ no “payload+parity bit” um valor par. Analogamente funciona a paridade ímpar. Dessa forma, se for enviado o caractere ‘a’ (01100001) e os dispositivos envolvidos foram configurados com paridade par, o bit de paridade assumirá valor ‘1’, totalizando quatro números ‘1s’. Se qualquer um dos bits for lido erroneamente (devido à ruído), o bit de paridade (que no caso é ‘1’) acusará o erro na transmissão, e o dado recebido será descartado. Existe, no entanto, a probabilidade (mesmo que ínfima) de dois bits serem alterados numa mesma transmissão, e assim o mecanismo de paridade não detectará o erro. 
Stop bit: Pode ser unitário ou duplo, e tem valor lógico um.
No PIC, um canal serial pode ser implementado por hardware, ou seja, a UART, ou por software. Nessa última, o programa embarcado é integralmente responsável pela transmissão/recepção dos dados, tornando a CPU indisponível para realizar qualquer outra tarefa durante esse ato. As duas implementações surtem o mesmo efeito (externo) e o receptor segue o mesmo algorítmo para capturar o dado:
Figura 11 – Transmissão de um caractere ‘a’ (0x61 ≡ 0b01100001). Oito bits de payload, sem bit de paridade e um stopbit 
 
A – O canal é constantemente observado. Espera-se o startbit.
B – A transição negativa indica o início do startbit. Aguarda-se então ½ tbit.
C – O startbit é verificado, pois a transição pode ter sido causada por ruído. Se verdadeiro, aguarda-se 1 tbit e o processo continua. Se não, o processo volta ao estado A.
D – Inicia-se o processo de aquisição. O bit menos significativo (LSB) é capturado e aguarda-se 1 tbit para a aquisição do próximo bit. Todos os outros bits do payload são capturados desta mesma forma.
E – É verificado o stopbit, pois existe a chance de ruídos terem validado as etapas B e C. Se verdadeiro, o dado recebido é finalmente entregue ao programa usuário. Se falso, o dado é descartado. Retorna-se ao estado A.
//-------------- TX ---------------
#include <16F628A.h> 
#fuses INTRC_IO, NOMCLR
#use delay(clock=4000000) 
 
#use fast_io(a)
#use fast_io(b)
#use rs232(baud=9600, rcv=pin_b1, xmit=pin_b2, parity=N)
char dado=‘a’;
void main(void){
 set_tris_a(0xff);
 set_tris_b(0b11111011);
 ext_int_edge(L_TO_H);
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 while(true){
 sleep();
 }
}
#INT_EXT
void trata_int_ext(void){
 putc(dado++);
 if(dado==‘f’) dado=‘a’;
 delay_ms(200);
}
//-------------- RX ---------------
#include <16f876A.h>
#fuses XT 
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c) 
#include <lcdt.c>
#use rs232(baud=9600, rcv=pin_c7, xmit=pin_c6, parity=N)
short flag=1;
char dado=‘k’;
#INT_RDA
void trata_int_rx(void){
 dado=getc();
 flag=1;
}
void main(void){
 set_tris_a(0xff);
 set_tris_c(0b10111111);
 
 lcd_init();