Moving average filter pic
Como outros já mencionaram, você deve considerar um filtro IIR (resposta ao impulso infinito) em vez do filtro FIR (resposta ao impulso finito) que está usando agora. Há mais, mas à primeira vista, os filtros FIR são implementados como convoluções explícitas e filtros IIR com equações. O filtro IIR particular que eu uso muito em microcontroladores é um filtro passa-baixa de pólo único. Este é o equivalente digital de um filtro analógico R-C simples. Para a maioria das aplicações, elas terão melhores características do que o filtro de caixa que você está usando. A maioria dos usos de um filtro de caixa que eu encontrei é resultado de alguém não prestar atenção na classe de processamento de sinal digital, não como resultado da necessidade de suas características particulares. Se você quer apenas atenuar altas frequências que você sabe que são ruído, um filtro passa-baixa de polo único é melhor. A melhor maneira de implementar um digitalmente em um microcontrolador é geralmente: FILT lt-- FILT FF (NOVO - FILT) FILT é uma parte do estado persistente. Essa é a única variável persistente que você precisa para calcular esse filtro. NEW é o novo valor que o filtro está sendo atualizado com essa iteração. FF é a fração do filtro. que ajusta o peso do filtro. Veja este algoritmo e veja que, para FF 0, o filtro é infinitamente pesado, pois a saída nunca muda. Para FF 1, realmente não há filtro, pois a saída apenas segue a entrada. Valores úteis estão entre. Em sistemas pequenos, você escolhe FF como 1/2N, de modo que a multiplicação por FF pode ser realizada como um desvio à direita por N bits. Por exemplo, FF pode ser 1/16 e multiplicar por FF, portanto, um deslocamento à direita de 4 bits. Caso contrário, este filtro precisa de apenas um subtrato e um acréscimo, embora os números geralmente precisem ser mais largos do que o valor de entrada (mais na precisão numérica em uma seção separada abaixo). Eu costumo tirar as leituras A / D significativamente mais rápido do que o necessário e aplicar dois desses filtros em cascata. Este é o equivalente digital de dois filtros R-C em série e atenua em 12 dB / oitava acima da frequência de rolloff. No entanto, para leituras A / D, é mais relevante observar o filtro no domínio do tempo, considerando sua resposta em etapas. Isso informa a rapidez com que o sistema verá uma alteração quando a coisa que você está medindo mudar. Para facilitar a criação desses filtros (o que significa apenas escolher o FF e decidir quantos deles serão em cascata), eu uso o meu programa FILTBITS. Você especifica o número de bits de deslocamento para cada FF na série de filtros em cascata e calcula a resposta da etapa e outros valores. Na verdade, eu geralmente executo isso através do meu script wrapper PLOTFILT. Isso executa FILTBITS, que cria um arquivo CSV e, em seguida, plota o arquivo CSV. Por exemplo, aqui está o resultado de PLOTFILT 4 4: Os dois parâmetros para PLOTFILT significam que haverá dois filtros em cascata do tipo descrito acima. Os valores de 4 indicam o número de bits de deslocamento para realizar a multiplicação por FF. Os dois valores de FF são, portanto, 1/16 neste caso. O traço vermelho é a resposta do degrau unitário e é a principal coisa a ser observada. Por exemplo, isso informa que, se a entrada for alterada instantaneamente, a saída do filtro combinado será estabelecida em 90 do novo valor em 60 iterações. Se você se preocupa com o tempo de estabilização de 95, então você tem que esperar cerca de 73 iterações e, para 50, apenas 26 iterações. O traço verde mostra a saída de um único pico de amplitude total. Isso dá uma ideia da supressão aleatória de ruído. Parece que nenhuma amostra única causará mais do que uma mudança de 2,5 na saída. O traço azul é para dar uma sensação subjetiva do que este filtro faz com o ruído branco. Este não é um teste rigoroso, uma vez que não há garantia de qual é exatamente o conteúdo dos números aleatórios escolhidos como a entrada de ruído branco para esta execução de PLOTFILT. É só para lhe dar uma sensação aproximada de quanto será esmagado e quão suave é. PLOTFILT, talvez FILTBITS, e muitas outras coisas úteis, especialmente para o desenvolvimento de firmware PIC, estão disponíveis na versão do software PIC Development Tools, na página de downloads do meu software. Adicionado sobre precisão numérica, vejo a partir dos comentários e agora uma nova resposta que há interesse em discutir o número de bits necessários para implementar este filtro. Observe que a multiplicação por FF criará novos bits do Log 2 (FF) abaixo do ponto binário. Em sistemas pequenos, o FF é geralmente escolhido para ser 1/2 N, de modo que essa multiplicação é realmente realizada por um deslocamento à direita de N bits. FILT é, portanto, geralmente um inteiro de ponto fixo. Note que isso não altera a matemática do ponto de vista dos processadores. Por exemplo, se você estiver filtrando leituras A / D de 10 bits e N 4 (FF 1/16), precisará de 4 bits de fração abaixo das leituras inteiras A / D de 10 bits. Um a maioria dos processadores, você estaria fazendo operações de 16 bits inteiros devido às leituras A / D de 10 bits. Neste caso, você ainda pode fazer exatamente as mesmas operações de inteiros de 16 bits, mas começar com as leituras A / D deixadas deslocadas por 4 bits. O processador não sabe a diferença e não precisa. Fazer as contas em inteiros inteiros de 16 bits funciona se você considerar que eles são 12.4 pontos fixos ou verdadeiros 16 bits inteiros (16.0 ponto fixo). Em geral, você precisa adicionar N bits a cada pólo de filtro se não quiser adicionar ruído devido à representação numérica. No exemplo acima, o segundo filtro de dois teria que ter 1044 18 bits para não perder informação. Na prática, em uma máquina de 8 bits, você usa valores de 24 bits. Tecnicamente, apenas o segundo polo de dois precisaria de um valor mais amplo, mas, para a simplicidade do firmware, geralmente uso a mesma representação e, portanto, o mesmo código, para todos os polos de um filtro. Geralmente eu escrevo uma sub-rotina ou macro para executar uma operação de pólo de filtro, depois aplico isso a cada pólo. Se uma sub-rotina ou macro depende se os ciclos ou memória de programa são mais importantes nesse projeto específico. De qualquer maneira, eu uso um pouco de scratch para passar NEW para a sub-rotina / macro, que atualiza FILT, mas também carrega isso no mesmo estado de scratch em que o NEW estava. Isso facilita a aplicação de múltiplos pólos, já que o FILT atualizado de um pólo é o NOVO do próximo. Quando uma sub-rotina, é útil ter um ponteiro apontando para FILT no caminho, que é atualizado para depois de FILT na saída. Dessa forma, a sub-rotina opera automaticamente em filtros consecutivos na memória, se chamada várias vezes. Com uma macro, você não precisa de um ponteiro, pois você passa no endereço para operar em cada iteração. Exemplos de código Aqui está um exemplo de uma macro como descrito acima para um PIC 18: E aqui está uma macro semelhante para um PIC 24 ou dsPIC 30 ou 33: Ambos os exemplos são implementados como macros usando meu pré-processador montador PIC. que é mais capaz do que qualquer uma das instalações macro integradas. clabacchio: Outro problema que eu deveria ter mencionado é a implementação de firmware. Você pode escrever uma sub-rotina de filtro low-pass de pólo único uma vez e depois aplicá-la várias vezes. Na verdade, eu geralmente escrevo essa sub-rotina para levar um ponteiro na memória para o estado do filtro, então ele avança o ponteiro para que ele possa ser chamado em sucessão facilmente para realizar filtros multipolares. ndash Olin Lathrop Apr 20 12 at 15:03 1. muito obrigado pelas suas respostas - todas elas. Eu decidi usar este Filtro IIR, mas este Filtro não é usado como um Filtro Standard LowPass, uma vez que eu preciso mediar os Valores dos Contadores e compará-los para detectar Mudanças em um determinado Range. Uma vez que esses valores têm dimensões muito diferentes, dependendo do hardware, eu queria ter uma média para poder reagir a essas mudanças específicas de hardware automaticamente. ndash sensslen May 21 12 at 12:06 Se você pode viver com a restrição de uma potência de dois números de itens para média (ou seja, 2,4,8,16,32 etc), em seguida, a divisão pode ser feita de forma fácil e eficiente em um micro de baixo desempenho sem divisão dedicada, porque pode ser feito como uma mudança de bit. Cada turno à direita é uma potência de dois, por exemplo: O OP pensou que ele tinha dois problemas, dividindo-se em um PIC16 e memória para seu buffer de anel. Esta resposta mostra que a divisão não é difícil. É certo que não resolve o problema de memória, mas o sistema SE permite respostas parciais, e os usuários podem pegar algo de cada resposta por si mesmos, ou até mesmo editar e combinar as respostas do outro. Uma vez que algumas das outras respostas exigem uma operação de divisão, elas são igualmente incompletas, pois não mostram como alcançar isso com eficiência em um PIC16. ndash Martin Apr 20 12 at 13:01 Há uma resposta para um verdadeiro filtro de média móvel (também conhecido como filtro de vagão) com menos requisitos de memória, se você não se importar com a redução da resolução. É chamado de filtro integrador-comb em cascata (CIC). A ideia é que você tenha um integrador no qual você tira as diferenças ao longo de um período de tempo, e o dispositivo de economia de memória chave é que, ao reduzir a resolução, você não precisa armazenar todos os valores do integrador. Ele pode ser implementado usando o seguinte pseudocódigo: Seu comprimento médio efetivo é decimationFactorstatesize, mas você só precisa manter as amostras de stateize. Obviamente, você pode obter um desempenho melhor se seu Fator de estado e decimação for potências de 2, de forma que os operadores de divisão e remanescentes sejam substituídos por turnos e máscaras. Postscript: Eu concordo com Olin que você deve sempre considerar filtros IIR simples antes de um filtro de média móvel. Se você não precisar dos nulos de frequência de um filtro de vagão, um filtro passa-baixa de 1 ou 2 polos provavelmente funcionará bem. Por outro lado, se você estiver filtrando para fins de dizimação (tomando uma entrada de alta taxa de amostragem e calculando a média para uso por um processo de baixa taxa), então um filtro CIC pode ser exatamente o que você está procurando. (especialmente se você puder usar o statesize1 e evitar o ringbuffer completamente com apenas um único valor do integrador anterior) Há uma análise profunda da matemática por trás do filtro IIR de primeira ordem que Olin Lathrop já descreveu na troca de pilha do Digital Signal Processing (Inclui muitas fotos bonitas.) A equação para este filtro IIR é: Isso pode ser implementado usando apenas inteiros e sem divisão usando o seguinte código (pode precisar de alguma depuração enquanto eu estava digitando da memória.) Esse filtro se aproxima de uma média móvel de as últimas K amostras, definindo o valor de alfa para 1 / K. Faça isso no código anterior, definindo BITS para LOG2 (K), ou seja, para K 16, defina BITS como 4, K 4 defina BITS como 2, etc. (Eu verificarei o código listado aqui assim que obtiver uma alteração e edite esta resposta se necessário.) Respondeu o 23 de junho 12 no 4:04 Heres um filtro low-pass unipolar (média movente, com freqüência de corte CutoffFrequency). Muito simples, muito rápido, funciona muito bem e quase sem sobrecarga de memória. Nota: Todas as variáveis têm escopo além da função de filtro, exceto o passado em newInput Nota: Este é um filtro de um único estágio. Vários estágios podem ser colocados em cascata para aumentar a nitidez do filtro. Se você usar mais de um estágio, você terá que ajustar o DecayFactor (como relacionado à frequência de corte) para compensar. E obviamente tudo que você precisa é dessas duas linhas colocadas em qualquer lugar, elas não precisam de sua própria função. Este filtro tem um tempo de aceleração antes que a média móvel represente aquela do sinal de entrada. Se você precisar ignorar esse tempo de aceleração, basta inicializar o MovingAverage para o primeiro valor de newInput em vez de 0 e esperar que a primeira nova entrada não seja um valor atípico. (CutoffFrequency / SampleRate) tem um intervalo entre 0 e 0,5. DecayFactor é um valor entre 0 e 1, geralmente próximo de 1. Flutuadores de precisão simples são bons o suficiente para a maioria das coisas, eu prefiro o dobro. Se você precisa ficar com números inteiros, você pode converter DecayFactor e Amplitude Factor em inteiros fracionários, nos quais o numerador é armazenado como o inteiro, e o denominador é uma potência inteira de 2 (assim você pode mudar de bit para a direita como o denominador em vez de ter que dividir durante o loop de filtro). Por exemplo, se DecayFactor 0.99, e você quiser usar números inteiros, você pode definir DecayFactor 0,99 65536 64881. E, a qualquer momento, multiplicar por DecayFactor em seu loop de filtro, basta deslocar o resultado 16. Para obter mais informações sobre isso, um excelente livro online, capítulo 19 em filtros recursivos: dspguide / ch19.htm PS Para o paradigma Moving Average, uma abordagem diferente para definir DecayFactor e AmplitudeFactor que pode ser mais relevante para as suas necessidades, digamos que você queira a média anterior, cerca de 6 itens juntos, fazendo discretamente, adicionar 6 itens e dividir por 6, você pode definir o AmplitudeFactor para 1/6 e DecayFactor para (1.0 - AmplitudeFactor). Todas as outras pessoas comentaram completamente sobre a utilidade do IIR vs. FIR, e na divisão de potência de dois. Id apenas gostaria de dar alguns detalhes de implementação. O abaixo funciona bem em pequenos microcontroladores sem FPU. Não há multiplicação, e se você mantiver N uma potência de dois, toda a divisão será em um único ciclo. Buffer de anel FIR básico: mantenha um buffer de execução dos últimos N valores e uma soma de todos os valores no buffer. Cada vez que uma nova amostra entra, subtraia o valor mais antigo no buffer de SUM, substitua-o pela nova amostra, inclua a nova amostra em SUM e a saída SUM / N. Buffer de anel IIR modificado: mantenha uma soma em execução dos últimos N valores. Cada vez que uma nova amostra chega, SUM - SUM / N, adiciona a nova amostra e produz o SUM / N. Se você está lendo bem, você está descrevendo um filtro IIR de primeira ordem, o valor que você está subtraindo não é o valor mais antigo que está caindo, mas sim a média dos valores anteriores. Filtros IIR de primeira ordem certamente podem ser úteis, mas não tenho certeza do que você quer dizer quando sugere que a saída é a mesma para todos os sinais periódicos. A uma taxa de amostragem de 10KHz, alimentar uma onda quadrada de 100Hz em um filtro de caixa de 20 estágios produzirá um sinal que aumenta uniformemente para 20 amostras, fica alto por 30, cai uniformemente para 20 amostras e fica baixo para 30. Uma primeira ordem Filtro IIR. ndash supercat Ago 28 13 às 15:31 produzirá uma onda que começa a subir acentuadamente e gradualmente se estabiliza próximo (mas não a) da entrada máxima, então começa a cair acentuadamente e gradualmente se estabiliza próximo (mas não a) do mínimo de entrada. Comportamento muito diferente. ndash supercat Ago 28 13 at 15:32 Uma questão é que uma simples média móvel pode ou não ser útil. Com um filtro IIR, você pode obter um bom filtro com relativamente poucos cálculos. O FIR que você descreve só pode lhe dar um retângulo no tempo - um sinc em freq - e você não pode gerenciar os lóbulos laterais. Pode valer a pena lançar algumas multiplicações de números inteiros para torná-lo um FIR sintonizável agradável simétrico se você puder poupar os pulsos de clock. ScottSeidman: Não há necessidade de multiplicidade se simplesmente houver cada estágio do FIR, ou a saída da média da entrada para aquele estágio e seu valor armazenado anterior, e então armazenar a entrada (se houver o intervalo numérico, pode-se usar a soma em vez da média). Se isso é melhor do que um filtro de caixa depende do aplicativo (a resposta de etapa de um filtro de caixa com um atraso total de 1 ms, por exemplo, terá um pico d2 / dt desagradável quando a entrada for alterada e novamente 1 ms depois, mas terá o mínimo possível d / dt para um filtro com um atraso total de 1ms). Como disse o mikeselectricstuff, se você realmente precisa reduzir suas necessidades de memória, e você não se importa com a sua resposta de impulso sendo um pulso exponencial (em vez de um pulso retangular), eu iria para um filtro médio móvel exponencial . Eu os uso extensivamente. Com esse tipo de filtro, você não precisa de nenhum buffer. Você não precisa armazenar N amostras anteriores. Apenas um. Portanto, seus requisitos de memória são reduzidos por um fator N. Além disso, você não precisa de nenhuma divisão para isso. Apenas multiplicações. Se você tiver acesso à aritmética de ponto flutuante, use multiplicações de ponto flutuante. Caso contrário, faça multiplicações inteiras e mude para a direita. No entanto, estamos em 2012, e eu recomendo que você use compiladores (e MCUs) que permitem trabalhar com números de ponto flutuante. Além de ser mais eficiente na memória e mais rápida (você não precisa atualizar itens em qualquer buffer circular), eu diria que também é mais natural. porque uma resposta de impulso exponencial corresponde melhor à maneira como a natureza se comporta, na maioria dos casos. Um problema com o filtro IIR quase tocado por olin e supercat mas aparentemente desconsiderado por outros é que o arredondamento para baixo introduz alguma imprecisão (e potencialmente bias / truncamento). assumindo que N é uma potência de dois, e apenas a aritmética inteira é usada, o desvio à direita elimina sistematicamente os LSBs da nova amostra. Isso significa que quanto tempo a série poderia ser, a média nunca levará isso em conta. Por exemplo, suponha uma série lentamente decrescente (8,8,8,8,7,7,7,7,6,6) e assuma que a média é de fato 8 no começo. A primeira amostra 7 levará a média a 7, independentemente da força do filtro. Apenas por uma amostra. Mesma história para 6, etc. Agora pense no oposto. a serie sobe. A média permanecerá em 7 para sempre, até que a amostra seja grande o suficiente para mudar. Claro, você pode corrigir o viés adicionando 1 / 2N / 2, mas isso não vai realmente resolver o problema de precisão. nesse caso, a série decrescente permanecerá para sempre em 8 até a amostra ser 8-1 / 2 (N / 2). Para N4, por exemplo, qualquer amostra acima de zero manterá a média inalterada. Acredito que uma solução para isso implicaria manter um acumulador dos LSBs perdidos. Mas eu não fiz isso o suficiente para ter código pronto, e eu não tenho certeza se isso não prejudicaria o poder IIR em alguns outros casos de séries (por exemplo, se 7,9,7,9 seria em média 8 então). Olin, sua cascata de dois estágios também precisaria de alguma explicação. Você quer dizer manter dois valores médios com o resultado do primeiro alimentado no segundo em cada iteração. Qual é o benefício disso eu preciso para projetar um filtro de média móvel que tem uma freqüência de corte de 7,8 Hz. Eu usei filtros médios móveis antes, mas, tanto quanto eu estou ciente, o único parâmetro que pode ser alimentado é o número de pontos a serem calculados. Como isso pode se relacionar a uma freqüência de corte O inverso de 7,8 Hz é de 130 ms, e estou trabalhando com dados que são amostrados em 1000 Hz. Isso implica que eu deveria estar usando um tamanho de janela de filtro médio móvel de 130 amostras, ou há algo mais que estou faltando aqui perguntou 18 de julho às 9:52 O filtro de média móvel é o filtro usado no domínio do tempo para remover o ruído adicionado e também para fins de suavização, mas se você usar o mesmo filtro de média móvel no domínio de frequência para separação de freqüência, o desempenho será pior. Então, nesse caso, usar filtros de domínio de frequência ndash user19373 3 de fevereiro às 5:53 O filtro de média móvel (às vezes conhecido coloquialmente como um filtro de caixa) tem uma resposta de impulso retangular: Ou, dito de forma diferente: Lembrando que uma resposta de frequência de sistemas discretos é igual à transformada de Fourier em tempo discreto de sua resposta ao impulso, podemos calcular da seguinte maneira: O que mais interessou no seu caso é a resposta de magnitude do filtro, H (ômega). Usando algumas manipulações simples, podemos obter isso de uma forma mais fácil de compreender: isso pode não parecer mais fácil de entender. No entanto, devido à identidade de Eulers. Lembre-se de que: Portanto, podemos escrever o acima como: Como afirmei anteriormente, o que você realmente está preocupado é a magnitude da resposta de freqüência. Assim, podemos aproveitar a magnitude do acima para simplificá-la ainda mais: Nota: Podemos descartar os termos exponenciais porque eles não afetam a magnitude do resultado e 1 para todos os valores de ômega. Como xy xy para quaisquer dois números complexos finitos x e y, podemos concluir que a presença dos termos exponenciais não afeta a resposta geral de magnitude (ao contrário, eles afetam a resposta de fase do sistema). A função resultante dentro dos colchetes de magnitude é uma forma de um kernel de Dirichlet. Às vezes é chamado de função sinc periódica, porque se assemelha à função sinc na aparência, mas é periódica. De qualquer forma, uma vez que a definição de freqüência de corte é um pouco subespecificada (-3 dB ponto -6 dB ponto primeiro sidelobe nulo), você pode usar a equação acima para resolver o que você precisa. Especificamente, você pode fazer o seguinte: Defina H (ômega) como o valor correspondente à resposta do filtro desejada na frequência de corte. Defina omega igual à frequência de corte. Para mapear uma frequência de tempo contínuo para o domínio de tempo discreto, lembre-se de que omega 2pi frac, onde fs é sua taxa de amostragem. Encontre o valor de N que lhe dá a melhor concordância entre os lados esquerdo e direito da equação. Essa deve ser a duração da sua média móvel. Se N é o comprimento da média móvel, então uma freqüência de corte aproximada F (válida para N gt 2) na freqüência normalizada Ff / fs é: O inverso disto é Esta fórmula é assintoticamente correta para N grande, e tem aproximadamente 2 erro para N2 e menor que 0,5 para N4. P. S. Depois de dois anos, aqui finalmente qual foi a abordagem seguida. O resultado foi baseado na aproximação do espectro de amplitude MA em torno de f0 como uma parábola (série de 2ª ordem) de acordo com MA (Omega) aprox 1 (frac - frac) Omega2 que pode ser mais exato próximo ao cruzamento zero de MA (Omega) - frac pela multiplicação de Omega por um coeficiente obtendo MA (Omega) aprox 10.907523 (frac - frac) Omega2 A solução de MA (Omega) - frac 0 dá os resultados acima, onde 2pi F Omega. Todas as alternativas acima referem-se à frequência de corte de -3 dB, o assunto deste post. Às vezes, é interessante obter um perfil de atenuação em stop-band, que é comparável ao de um filtro de baixa passagem IIR de 1ª ordem (LPF de polo único) com uma determinada frequência de corte de -3dB (tal LPF também é chamado de integrador com vazamento, ter um poste não exatamente na DC, mas perto dele). Na verdade, tanto o MA quanto o LPF IIR de primeira ordem têm inclinação de -20dB / década na faixa de parada (um precisa de um N maior que o usado na figura, N32, para ver isso), mas enquanto MA tem nulos espectrais em Fk / N e um envelope de 1 / f, o filtro IIR tem apenas um perfil 1 / f. Se alguém quiser obter um filtro MA com capacidade de filtragem de ruído similar ao filtro IIR, e combinar as freqüências de corte de 3dB como as mesmas, ao comparar os dois espectros, ele perceberá que a ondulação da faixa de parada do filtro MA acaba 3dB abaixo do filtro IIR. Para obter a mesma ondulação stop-band (ou seja, a mesma atenuação de potência de ruído) que o filtro IIR, as fórmulas podem ser modificadas da seguinte maneira: Descobri o script do Mathematica onde calculei o corte para vários filtros, incluindo o MA. O resultado foi baseado na aproximação do espectro MA em torno de f0 como parábola segundo MA (Omega) Sin (OmegaN / 2) / Sin (Omega / 2) Omega 2piF MA (F) aprox. N1 / 6F2 (N-N3) pi2. E derivando o cruzamento com 1 / sqrt de lá. Há muitos tipos diferentes de filtros que você pode escrever, e o boxcar (ou média móvel, como você o chamou) ou filtro retangular é apenas um deles. Aqui está uma comparação de uma variedade de filtros e o tipo de efeito que eles podem ter em seus dados, como uma função da frequência. Para criar um filtro simples de média móvel, basta adicionar os dados e dividir pelo número de elementos de dados. Se você adicionar todos os elementos toda vez que calcular a média, isso vai custar n adições mais uma divisão. Por outro lado, se você acompanhar de onde os dados mais antigos estão localizados, à medida que os dados avançam, basta adicionar os novos dados, subtrair os dados mais antigos e fazer a divisão novamente. Esse método custa apenas uma única adição, uma única subtração e uma divisão. Muito mais rapido. Eu não vou escrever o código para você. Espero que isso ajude, no entanto. Postado por JaguarPaw sex Dez 16 2016, 02:33 PM while (1) 0 i--) / Enviar stop / I2CStop () a variável r armazenaria com sucesso o número retornado de volta do ds1307 como estava originalmente funcionando agora ele irá congelar onde eu disse antes ou retornar nullhere é o código de configuração. as sub-rotinas são as mesmas que neste site. void main (void) // Pino de configuração ANSELB 0 TRISBbits. TRISB4 1 TRISBbits. TRISB6 1 //SSP1STATbits. SMP 0 SSP1STAT 0x80 // SSPEN habilitado WCOL nocollision CKP Ocioso: Baixo, Ativo: Alta SSPM FOSC / 4SSPxADDI2C SSPOV nooverflow SSP1CON1 0 x 28 // ACKTIM ackseq SBCDE desativado BOEN desativado SCIE desativado PCIE desativado DHEN desativado SDAHT 100ns desativado AHEN SSP1CON3 0x00 // Baud Rate Generator Valor: SSPADD 79 SSP1ADD 0x4f Publicado por ajaybhargav ter Dec 13 2016, 08: 55 AM definir LCDEN 0X80LCD permitir pino está no bit 7 de w. Publicado por ajaybhargav Ter Dez 13 2016, 08:52 AM você pode postar seu trecho de código está chamando wi. Postado Por ajaybhargav ter Dez 13 2016, 08:51 AM Hi Centurio, Eu não tenho tempo suficiente para atualizar pl. Postado Por rodrider seg Dez 12 2016, 09:59 por favor o que isso significa no código neste para. Postado Por JaguarPaw Seg Dez 12 2016, 09:43 PM Eu usei a biblioteca I2C e segui o tutor. Postado Por Centurio seg Nov 28 2016, 08:46 AM Olá, há muito tempo. ive uma pequena pergunta para. Postado por kirangowle Wed Nov 16 2016, 03:56 PM Olá membros do Fórum, Depois de um longo tempo eu estou de volta para. Postado Por PratikSuthar qui 13 de outubro de 2016, 12:39 martin o arquivo HEX fornecido no projeto é não. Postado Por ajaybhargav Qui Out 06 2016, 06:15 AM Oi Phil, Você quer adicionar isto ao proje existente.
Comments
Post a Comment