thegoodfellas/blogset-br huggingface dataset:
main, comecamos com a configuracao dos modulos. Nao explicarei a configuracao dos modulos: deixarei a cargo de voces buscarem no datasheet cada registrador para entenderem o que cada configuracao fez. Caso surjam duvidas estas serao bem vindas no campo para comentarios la em baixo. O que vou comentar sao apenas tres coisas:1) Comeco ela limpando o registrador do WDT e o desativando, pois como o Timer 1 nao foi ativado ainda, nao quero que ele estoure por acidente. Veja que o ideal e ativa-lo somente apos configurar o Timer 1 e sua interrupcao. 2) O bit IPEN (Interrupt Priority Enable) ativa o modo de prioridades das interrupcoes. Isto nos permite escolher qual interrupcao tera prioridade caso duas ocorram ao mesmo tempo. Juntamente a ativacao deste bit, uma coisa muda na programacao: agora a funcao que tratara as interrupcoes deve ter outro formato! A funcao que for tratar das de alta prioridade devera ser da forma tipo_de_retorno interrupt high_priority nome_da_funcao, e a que tratar as de baixa prioridade, tipo_de_retorno interrupt low_priority nome_da_funcao. E para escolher qual interrupcao tera prioridade alta ou baixa nao basta apenas tratar ela dentro da funcao, mas configurar seus respectivos bits, que serao aqueles terminados em IP, como por exemplo a interrupcao do Timer 1, que tem seu bit de prioridade TMR1IP, sendo atribuido o valor 1 para alta prioridade e 0 para baixa. Veja que neste codigo, coloquei o Timer 1 como prioritario, afinal, se outra funcao segurar o processador, o WDT pode nao ser resetado, vindo a estourar e resetar o PIC. 3) os bits USBEN e SSPEN foram limpos para liberar os respectivos pinos do PORTC ao uso, evitando conflito.Prosseguindo, temos um for simples, responsavel por fazer os displays exibirem os numeros de 0 a 9 (para verificar se todos os segmentos estao bons). Em seguida vem o while(1), que criara o loop responsavel pela execucao do programa em si.O if e responsavel por verificar a variavel atualiza, responsavel por fazer que os valores do display sejam atualizados em ate 5Hz. Isto evita que os valores fiquem trocando muito rapido, e ajuda a exibir menos ruidos, deixando uma leitura mais consistente. Dentro do if temos a leitura dos valores retornados por cada canal do ADC, armazenando o valor em cada variavel do respectivo eixo, sendo este valor convertido para a unidade de gravidades (g) logo em seguida (variaveis Xg, Yg e Zg). A conversao e feita da seguinte forma: o ADC retorna um valor de 0 a 1023 para a tensao presente no canal. Para saber a tensao lida, precisamos multiplicar o valor lido pela tensao de referencia e dividir pelo maior valor que pode ser retornado, ou seja, multiplicamos por 5000 mV e dividimos por 1023. Isto nos da o valor lido em mV. Em seguida convertemos a tensao em g. Sabendo que o MMA7361 tem uma saida de 1650 mV para 0 g, precisamos subtrair isto do valor lido. O datasheet ainda informa que, quando a escala selecionada for de 6g (nosso caso), temos na saida 206 mV para cada g, entao precisamos dividir
o valor lido por 206. Pronto, temos o valor lido de cada canal em g. Para saber o valor resultante dos tres vetores, usamos a formula citada la em cima e armazenamos este valor na variavel Gt. O programa entao verifica se o valor lido e maior do que o maior lido anteriormente e caso seja, atualiza o valor maximo. Ele segue verificando o modo selecionado de exibicao e joga nas variaveis digit1 e 2 os valores numericos das unidades e dos decimos do devido valor, ou seja, nosso circuito nos da valores de 0,0 a 6,0, em intervalos de 0,1. A variavel atualiza e zerada para que a contagem de tempo reinicie. Por ultimo, mas nao menos importante, o programa verifica se a chave ligada no pino RC2 esta pressionada (0 para pressionada e 1 para solta), e caso esteja pressionada, chama a funcao GO_SLEEP.Perceba a quantidade de coisas que foram abordadas neste programa. Pode parecer ate cansativo, mas se estudado com calma sera bastante enriquecedor para seu conhecimento tanto de hardware quanto de software.Power-managed modes Os estados de gerenciamento de energia na familia 18F sao dois: sleep e idle. O modo pode ser escolhido pelo bit IDLEN do registrador OSCCON. Para entrar em qualquer um dos modos basta dar a instrucao assembly SLEEP ou, no compilador XC8, chamar a funcao nativa SLEEP.A diferenca entre os dois e que no modo idle, o clock do processador e cortado, porem os perifericos continuam executando suas funcoes. Em sleep, o processador e todos os perifericos sem clock proprio param, ou seja, apenas o WDT e o Timer 1 (quando sua fonte de clock for o oscilador de baixa potencia) continuam ativos. Ambos os modos visam reduzir o consumo de energia, aumentando a durabilidade das baterias que alimentam o circuito, por exemplo. Para se obter o minimo consumo possivel, todos os pinos devem ser colocados em estado baixo, por isso que na funcao GO_SLEEP desliguei todo o PORTB. "Ue, mas voce deixou o PORTC com o valor 0x03!" Sim, pois os transistores que controlam os displays - que neste caso sao de anodo comum - sao do tipo PNP. Caso eu ponha o PORTC todo em estado baixo, os transistores saturariam e os displays ficariam ligados exibindo "88", que e justamente onde haveria o maior consumo de energia, ja que todos os segmentos estariam acesos. Novamente, para mais informacoes, leiam o datasheet (para este recurso, secao 3.0). La voces terao todas as informacoes, como as formas de sair destes estados, como o clock reage a eles e etc.Vale lembrar que quando o microcontrolador sair de qualquer um dos modos de gerenciamento de energia por meio de uma interrupcao, o programa nao voltara ao inicio, mas continuara de onde parou (agora a funcao GO_SLEEP deve fazer mais sentido, nao?). Caso ele saia por meio de um reset, seja no pino MCLR, seja pela instrucao RESET ou pelo estouro do WDT, o programa voltara ao inicio. Para fechar, fica uma foto do circuito montado na protoboard:Tenho inveja de quem consegue deixar os circuitos organizados e apresentaveis
nas protoboards ;-; E e "so" isso por hoje. Estou aberto a duvidas e sugestoes. Use o campo dos comentarios aqui em baixo para que possamos evoluir juntos. Um abraco e ate a proxima!
Pra galera que acompanha o blog, ate entao eu vinha usando os compiladores da Mikroe (tanto o mikroC quanto o mikroBasic no inicio), mas eles sao pagos e limitam na versao demo os recursos e tamanho do programa que voce pode escrever. Chegando ao limite dele, precisei achar uma saida, e resolvi entao migrar para o compilador e IDE da propria Microchip: o MPLAB e como compilador o XC8. Entao, a partir de agora, meus codigos serao todos para XC8.As diferencas na linguagem nao sao tantas; a maior dificuldade e lidar com a falta de bibliotecas como havia no mikroC. Porem, como sou legal, me encarreguei de fazer o maximo que pude das bibliotecas mais usuais do mikroC e deixei neste link: so baixar e usar.E nesse post ja farei uso dessa nova plataforma. Hoje vou falar sobre um recurso interessante do PIC e que muitas vezes passa despercebido e raramente e usado, seja por nao saber o que e ou por nao achar referencias muito claras, seja em portugues ou em ingles: o WatchDog Timer.WatchDog Timer ou WDTVamos supor que seu PIC de alguma forma executou uma instrucao que gerou uma operacao invalida ou travou em um loop aguardando a resposta de um dispositivo que por algum motivo nao respondeu, ou ainda, que sua fonte de clock primario parou. Para nao deixar seu dispositivo parado/travado, existe esse modulo interno do MCU: o WDT. Vou deixar os maiores detalhes pra que voces leiam na internet ou no datasheet, mas basicamente, o WDT opera com um clock proprio. E um timer que incrementa sozinho, mas a diferenca e que automaticamente ao haver um overflow o PIC ira resetar. Cabe, entao, ao seu programa constantemente limpar o WDT, e para isso temos a instrucao clrwdt em assembly. Ela ira limpar o timer do WatchDog. No XC8 temos a funcao ClrWdt(); que fara o mesmo trabalho.No exemplo de programa, usarei o PIC18F2550. Temos algumas pequenas diferencas, que explicarei. Prescaler e base de tempo Primeiro de tudo, como falei, esse modulo tem seu proprio clock, e com isso, sua base de tempo. E importante se atentar a isso, que fica bem explicito no datasheet. No caso do PIC18F2550, com prescaler 1:1 temos 4 ms como base de tempo, ou seja, se a cada 4 ms o WDT nao for limpo, o PIC ira executar a instrucao de RESET. Fazendo uso do prescaler, podemos chegar a pouco mais de 2 minutos. E bom pensar no tempo escolhido, pois caso o PIC pare, ele ficara assim por esse determinado tempo. E aqui entra uma pequena diferenca: na familia 12F e 16F, o prescaler e selecionado no registrador OPTION_REG, enquanto que na 18F ha um um endereco especial dos bits de configuracao para ele. Controle por SoftwareNo PIC18F2550 ainda temo outro recurso: o controle por Hardware do funcionamento do WDT. Quando este modo e ativado nos bits de configuracao, temos um bit chamado SWDTEN (Software Controlled Watchdog Timer Enable bit) que nos permite, dentro do software, ligar ou desligar o modulo.Limpando o Timer do WatchDogMais uma vez, aqui e
bom uma conferida no datasheet: o WDT pode ser resetado por mais de um caminho. O comum a todos, como ja citado, e a instrucao propria para isso. Mas ainda ha outros dependendo do PIC: mudanca na fonte de clock primario, a instrucao SLEEP, e etc.Mas atentando ao principal: como vou ficar de tempo em tempo passando a instrucao clrwdt? Tenho que ficar escrevendo isso linha a linha no codigo? Nao! Aqui usamos um dos Timers disponiveis para gerar interrupcoes de tempo conhecido e assim passar a instrucao. Sabendo a frequencia do Clock e o tamanho do Timer podemos definir o prescaler e/ou postscaler para chegar a um tempo de interrupcao menor que do WDT, e assim, limpa-lo antes do WDT estourar. Aqui voce pode usar a calculadora que fiz :D (nao deixe de conferir essa postagem).Juntando tudoAqui segue um exemplo em C para o XC8, PIC18F2550: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104105106107108109/* * File: WDT.c * Author: Stephen * * Created on 7 de Julho de 2016, 14:33 */// PIC18F2550 Configuration Bit Settings// 'C' source line config statements// #pragma config statements should precede project file includes.// Use project enums instead of #define for ON and OFF.// CONFIG1L#pragma config PLLDIV = 5 // PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])#pragma config USBDIV = 2 // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)// CONFIG1H#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator (HS))#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)// CONFIG2L#pragma config PWRT = ON // Power-up Timer Enable bit (PWRT enabled)#pragma config BOR = ON // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))#pragma config BORV = 0 // Brown-out Reset Voltage bits (Maximum setting 4.59V)#pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled)// CONFIG2H#pragma config WDT = ON // Watchdog Timer Enable bit (WDT enabled)#pragma config WDTPS = 256 // Watchdog Timer Postscale Select bits (1:256)// CONFIG3H#pragma config CCP2MX = OFF // CCP2 MUX bit (CCP2 input/output is multiplexed with RB3)#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)#pragma config LPT1OSC = OFF // Low-Power Timer
aproximadamente um segundo para o WDT resetar o PIC. Habilitei o bit do WDT com opcao de controle por software.o #include "delays.h" inclui no programa o header delays, que sera usado exatamente como a funcao delay_ms(); do mikroC;Na interrupcao, configurada para alta prioridade pelo modificador high_priority, vemos que a coisa e bem simples: executo a funcao para limpar o WDT, recarrego o Timer0 com seus valores calculados e limpamos a interrupcao. De brinde tem um LED no PORTC6 que pisca para indicar que o WDT esta sendo limpo. Simples assim! Ela esta em modo de alta prioridade pois, se houver outra interrupcao dentro do programa, e preferivel que esta tenha prioridade, para evitar que o PIC reset por acidente.Sobre a main, ja comeco o programa limpando o timer e habilitando via software o WDT. Em seguida, vem a configuracao da interrupcao para o Timer0 em modo de alta prioridade e a configuracao do Timer0 para gerar a interrupcao antes de 1024 ms. Dou um delay de 2 segundos e ligo outro LED, dessa vez no PORTC7, para indicar que desligarei a interrupcao do Timer0, o que faco em seguida e ponho o PIC em loop eterno. Como desliguei a interrupcao, a funcao de interrupcao nao sera chamada, nao limpando o WDT e assim permitindo seu estouro e consequente reset do PIC. O que voce vera mesmo e o LED do PORTC6 ligar (avisando que a interrupcao foi chamada), o outro LED liga e um segundo depois os dois apagam, indicando que o PIC resetou. E e isso! Esta e a base de uso do WDT. Agora e so implementar em seus programas sempre que possivel para garantir que jamais seu projeto pare de funcionar. Proximo post falarei sobre o Fail-Safe Clock Monitor (FSCM). Ate mais!
(ATUALIZADO 10/04/2016 22:09) Apesar da brincadeira no nome, o circuito e serio, afinal, dificil achar quem na eletronica nunca queimou um componente ou circuito por ter invertido a polaridade ou fritou algo porque nao tinha um fusivel ou custou a descobrir que nada funcionava pois o fusivel estava queimado, nao?Este circuito, que pode ser usado na protoboard ou implementado em outro circuito vem pra resolver tudo isso: protege contra inversao de polaridade indicando se esta certo ou nao e indica se o fusivel esta queimado! Tres circuitos em um!o conjunto R2 D2 formam uma fonte de tensao baseada em um zener de 5V1 para o LED indicador , D3 protege contra alimentacao reversa e R3 limita a corrente para o LED. Ao lado temos o mesmo circuito, porem invertido, para acender o LED caso a polaridade esteja errada. A ideia de se usar um zener e ter sempre o mesmo brilho no LED e seguranca para qualquer tensao.O indicador de fusivel rompido e quase o mesmo circuito, porem com Q2 D8 e R8. Com o fusivel bom, a corrente flui por D8, cortando Q2. Se o fusivel abrir, R8 liga a base ao negativo, acendendo o LED3.D9, D10 e D11 impedem que a corrente circule pelos resistores associados de forma desnecessaria. Sobre o protetor contra reversao de polaridade, deixo a explicacao para o video de onde tirei o circuito. Aqui, inclusive, ele explica porque nao usar a obvia solucao do diodo ou da ponte de diodos.O circuito foi projetado para 12V. Para tensoes maiores que 24V sera necessario montar mais uma fonte zener, mas para a base de Q2. Para outras tensoes, recalcular os resistores.Essa e a PCB sugerida, pra vc usar em uma protoboard, por exemplo. Para o MOSFET IRF9530, ate 2,5A pode-se omitir um dissipador. Acima disso, recomendo por um dissipador de calor. Caso ache um MOSFET de RDon menor, como o FQP27P06, sera melhor usar ele para correntes maiores.Entao e isso! Monte o circuito e esteja protegido de noobs (e da sua falta de atencao)!Boa sorte e boas montagens! Fala pessoal, tudo na paz?Resolvi trazer essa postagem depois de ter visto muita gente questionando sobre a forma "correta" de se tracar as trilhas de uma PCB. Tem quem diga que nao pode usar angulos retos (trilha com "quinas"), tem gente que diz que nao pode usar curvas. Enfim, nao parece haver um consenso. Entao resolvi, depois de pesquisar, trazer um compilado simples, com imagens, pra provar quem esta certo ou errado nesta historia.O problemaSuponhamos a situacao da seguinte imagem:Considere que cada circulo seja uma ilha: terminais de resistores, diodo, MOSFET ou seja la o que for, e voce precisa conectar os dois. O caminho mais obvio e ligar os dois em linha reta. Mas e se tem uma terceira ilha no meio do caminho e que nao deve ser ligada com essas outras duas? Ai comeca a duvida.Existem tres caminhos logicos e mais simples:As tres obviamente resolvem o problema. Interligamos os dois pontos sem fazer uma reta ja que hipoteticamente nao podiamos. Mas vamos olhar isso de forma mais
detalhada:Se voce somar os valores de cada trecho, vera que o primeiro desenho da esquerda para a direita possui maior comprimento seguido do com a curva e por fim o com um "chanfro". Aqui reside uma parte do problema: o comprimento da trilha. Em circuitos simples, nao ha o porque se preocupar com o comprimento das trilhas, mas em circuitos sensiveis, como ligacoes do tipo Kevin em sensores de corrente, circuitos que operam a altas frequencias ou onde a resistencia da propria trilha possa interferir, e preferivel ter o menor comprimento o possivel para evitar erros de medida ou interferencias. Entao a solucao mais adequada e a do meio, que possui o menor comprimento.O primeiro desenho da esquerda para a direita e bom quando voce vai desenhar placas de coisas simples, como um pisca-pisca, uma lanterna com LEDs ou coisas que nao tenha a preocupacao de resistencias minimas ou interferencias e que voce fara na mao, usando a caneta, pois fica pratico. E qual a situacao ideal para as curvas? Aqui vejo apenas um caso que tenha uma justificativa na fisica para seu uso: circuitos que trabalhem com altas tensoes (geralmente > 60 ~ 80V). Aqui entra um principio da fisica chamado "Poder das Pontas", que resumidamente, diz que os corpos acumulam cargas de forma mais concentrada nas suas pontas, ou seja, em circuitos de alta tensao onde muitos eletrons estao circulando, quinas e pontas abrem margem para fugas ou ate mesmo geracao de arcos voltaicos (lembrando que tem toda a parte de isolamento, distancia e etc.). Ha quem diga que em circuitos de alta corrente tambem seja melhor usar curvas para "facilitar" o caminho, mas pela fisica (lei de ohm mandando abraco), quanto maior a corrente num resistor, maior a queda de tensao - o resistor aqui e sua trilha que, por mais que a idealizemos como um condutor perfeito (R = 0), ela tem uma resistencia eletrica sim, e sob altas correntes, altas quedas de tensao.Entao, se nao for passar alta tensao em uma trilha, nao se justifica FISICAMENTE (depois explico o porque desta enfase) faze-la curva.Ainda na duvida sobre essas dimensoes acima? Vamos entao observar cada uma de perto.Para isso, colocarei todas as trilhas em ciclos trigonometricos pra facilitar a compreensao.No nosso primeiro caso, notavelmente, o comprimento total da trilha em branco sera 2L (L + L). Creio que aqui nao ha duvidas. Quando adicionamos um angulo (um chanfro) na trilha, a trigonometria entra em acao. "A soma dos catetos e sempre maior que a hipotenusa". Lembra do seu professor falando isso? Entao, aqui esta o exemplo. A trilha em si que e a diagonal do triangulo branco sera L / cos 45, o que da aproximadamente 1,4. Opa, 1,4 e menor que 2, entao antes ter uma trilha que seja 1,4L do que 2L (30% menor). Por fim, o ultimo caso e o da curva. Aqui ja entra a parte de circunferencia. Considere o arco sendo parte de uma circunferencia. O comprimento total desta e 2 x pi x L, mas como temos apenas um quarto da circunferencia
(apenas 90), o comprimento do arco sera de (2 x pi x L) / 4, ou aproximadamente 1,57L. Ainda assim menor que o primeiro exemplo, mas maior que o segundo.Mas e na pratica?Tirando os casos onde o uso de um desses tipos seja imperativo, de fato nao ha regra para o uso! O que normalmente e levado em conta e o espaco disponivel para cada trilha, a estetica da placa e a facilidade de execucao e confeccao, seja na mao, tinta fotossensivel, transferencia de toner ou industrial mesmo.Preferencia para as curvas pela facilidade de desenho e estetica. (Filtro PWM para Peltier)Trilhas chanfradas para reduzir seus comprimentos, devido o trabalho com sinais (placa de desenvolvimento)Veja que mesmo um circuito que trabalha com "altas" correntes (aprox. 6A) eu usei trilhas curvas, pois pra mim as quedas de tensao nao eram importantes. Eu queria o prototipo funcionando para efetuar os ajustes, mas na placa onde trabalho com um microcontrolador, os cuidados com as trilhas ja foi maior.Entao espero ter esclarecido essa duvida de pode ou nao pode cada tipo de trilha. Qualquer duvida use o campo abaixo para comentarios!Valeu pessoal e ate a proxima!
Como prometido, continuo aqui com o ultimo post sobre alguns modulos dos PICs. Lembrando novamente que estamos falando sobre o PIC18F2550/4550 mas isto se aplica a todos que tiverem. Confiram sempre o datasheet do seu microcontrolador para conferir o nome e funcao dos registradores. Fail-Safe Clock MonitorNo ultimo post da serie, falamos sobre o WDT e como ele pode nos ajudar quando o PIC "trava", mas e a causa deste travamento? Um estouro de pilha? Uma operacao ilegal? Uma flutuacao de tensao? Ruido na alimentacao? Bem, em todos estes casos com certeza o WDT ira atuar e se for algo transiente, o PIC retoma a operacao normal. Mas e se ele travou porque houve uma falha no seu Oscilador externo? Se deu defeito no capacitor ou no cristal do circuito de clock? Ai entra o FSCM pra salvar o dia. Segundo o datasheet, "O Fail-Safe Clock Monitor (FSCM) permite ao microcontrolador continuar a operar na eventual falha do oscilador externo ao mudar automaticamente o clock do dispositivo para o bloco oscilador interno". Ao detectar uma falha no oscilador externo, o PIC gera uma interrupcao (OSCFIF), muda o clock para o interno e limpa o WDT. Com a interrupcao voce pode optar por dois caminhos: entrar em um dos estados de gerenciamento de energia do PIC ou escolher a proxima fonte de clock.No programa, tudo que envolver tempo tera que ser ajustado para o novo clock interno, ou voce pode usar um cristal sempre da mesma frequencia do clock interno escolhida (eu trabalharia com 8MHz).Para ativar este recurso, primeiro configure o registrador OSCCON selecionando o clock desejado em caso de falha e as interrupcoes (INTCON). Ative a interrupcao pelo bit OSCFIE e a monitore pelo bit OSCFIF. Lembre-se de ativar o bit de configuracao FCMEN (CONFIG1H).Two-Speed Start-up Este e o mais simples de todo: ative o bit de configuracao IESO (CONFIG1H). Em modos de oscilador que usem um cristal (XT, HS, XTPLL e HSPLL), este recurso permite o microcontrolador rodar no clock interno ate que o clock do cristal esteja estavel. O sugerido e apenas que a primeira coisa que seu programa deve fazer e configurar o clock interno (escolher a velocidade) atraves do OSCCON. Assim que o clock do cristal estiver pronto, automaticamente o PIC muda sua fonte de clock para ele. E uma boa alternativa para o Power-Up Timer.High/Low Voltage Detector Este e o tipo de recurso que voce quer ter ativado caso esteja alimentando seu circuito com bateria ou fontes que estejam sujeitas a flutuacoes de tensao. Este modulo e basicamente um comparador de tensao com sua referencia ajustavel. Quando a tensao no pino RA5 (HLVDIN) ficar acima ou abaixo do nivel configurado, e gerada uma interrupcao (HLVDIF). Este modulo e configurado pelo registrador HLVDCON. Importante ressaltar que cada vez que voce ativa este modulo, ele leva um tempo para estabilizar, e para isto, ha um bit que informa quando ele esta pronto (IRVST). Segundo o datasheet, para usar ele voce deve prosseguir da seguinte forma:1. Desabilite o modulo limpando o bit HLVDEN (HLVDCON<4>).2. Escreva o valor aos bits HLVDL3:HLVDL0