bem pessoal, resolvi o problema da variação do pwm, faltava uma variavel float e resolvi tambem a questão do pwm se perdendo a 5 volts, mas agora quando ele chega a zera o timer se perde e minha porta onde ta o pwm vai para 5 volts... alguem poderia me dar um help?
- Código: Selecionar todos
#include "ad.h"
unsigned int k;
float x;
void conv(void);
void main()
{
ANSEL = 0b00000001; // configura gp0 como analogica e prescaler em fosc/64
CMCON0 = 7; //configura cin e cout como portas i/o e desabilita comparador
TRISIO = 0b00000001; // gp0 como entrada, todas as outras como saida
// configura ad, GP 0
ADCON0 = 0b10000001; // configura o A/D, utiliza o canal an0, VREF interno, admr a direita
// pino de PWM
GPIO = 0; // gp2 é o pino do pwm
// configurando timer0
OPTION_REG = 0b10000111; //Atribui prescaler de 1:256 ao TMR0
TMR0 = 99; // começa a contagem a partir de 99 ate 256, equivale a 20ms
INTCON = 0b11100000; //Hab. a int. do TMR0, conf. os registros GIE e T0IE
// desabilita os modos de pwm, comparação e captura e habilita gp2 = i/o
CCP1CON = 0;
while(1)
{
if (TMR0==k) // faz o controle de carga do PWM
{
GP2_bit = 1;
}
}
}
void interrupt (void) //rotina de interrupção
{
TMR0 = 99; // determina o periodo do PWM
GP2_bit = 0; // inicializa o PWM em alto
INTCON = 0b11100000; //Configura T0IE e limpa T0IF, em bin 0b00100000
ADCON0 = 0b10000001; // configura ad
Delay_us(5); // 5us necessarios para a leitura do adc
GO_DONE_bit = 1; // seta o bit para se fazer a leitura
while(GO_DONE_bit); // quando o bit retorna para zera é feito a leitura do ad
x = ((ADRESH<<8)+ADRESL); // guarda na variavel x o valor lido no adc
k = 99+(x*156)/1024; // valor de carga ja com a conversão para a comparação com o timer
}
valeu ai
abraço
obs... erros aconttecem nas melhores familias... to quase conseguindo