Olá!
Uma vez que a minha experiência prévia era de programação em assembler e já não pogramava em PICs há, pelo menos 3 anos, estou com seguinte dúvida em relação à um algoritmo que estou desenvolvendo em C (usando PCWH).
Estou implementando um protótipo de aquisição de dados para uma máquina de balanceamento dinâmico. Nesta máquina, há uma coroa dentada, na qual faço uma contagem dos pulsos, que representam o ângulo de giro. Estou usando interrupções de CCP1 e CCP2 para isso. O meu objetivo é: para cada pulso, fazer uma leitura de tensão em um sensor indutivo. Assim, tenho a variação da amplitude de tensão do sensor em função da variação do ângulo da coroa (cada pulso equivale a 2 graus).
A idéia da lógica a ser implementada é a seguinte: armazenar a leitura de 360 valores - de tensão e contagem de pulso (um para cada pulso/grau) - em vetores unidimensionais de 360 elementos. Após realizada a aquisição, aperto um botão para fazer a descarga dos dados (360 valores armazenados em uma espécie de buffer fifo de dados) para o computador, via porta serial.
Meu problema com este programa tem sido o seguinte: fiz com que cada pulso fosse representado por um contador, incrementado (de 0 à 360, e resetado em 360) durante a interrupção de CCP1. Durante a execução normal do programa, realizo as leituras do A/D. Assim, uso o contador de pulsos como indexador do meu vetor de leituras do A/D. Infelizmente, porém, não consigo armazenar nestes vetores as leituras corretas do para descarregar para o pc os dados.
Minha dúvida é a seguinte: eu posso usar o contador de pulsos para indexar (ponteiro) um vetor de dados? Esse procedimento está correto? Basicamente, o que estou fazendo em meu programa é o seguinte:
while(true)
{
Se contador_atual != contador_anterior //verifica se o ângulo de giro variou.
{
tensao[contador] = leitura_ad;
angulo[contador] = contador + 2;
}
Se (botão = pressionado)
desabilita_interrupções
{
para (i = 0, i <= 360, i++)
printf(angulo[contador],tensao[contador]) //descarrega todos os valores do vetor na porta serial
delay_ms(50) //tempo para enviar via rs232
}
}
As minhas rotinas de tratamento de interrupções, envio do buffer de dados e demais configurações do microcontrolador estão corretas. Verifiquei cada uma separadamente. A contagem dos pulsos é feita de forma adequada dentro da interrupção. Testei estas rotinas até uma frequencia de, aproximadamente, 8kHz -usando um gerador de funções - e não observei problemas decorrentes de uma má contagem. Isso minimiza a possibilidade de o pic estar se "perdendo". O problema encontra-se no fato de as leituras de ângulo e tensão não serem corretamente armazenadas no "buffer". Assim, os dados não são descarregados como deveriam no computador.
Estou usando um 18f452, xtal 10MHz, PLL4x, ad 10bits, BR 57600 bps e uma estação de desenvolvimento CUSCOPIC.
Agradeço sugestões. Caso necessário, envio o código-fonte.
Obrigado pela atenção de todos.