Ir ao conteúdo
  • Cadastre-se

Pic 12f675, interrupções e PWM,


thiagolimberger

Posts recomendados

boa tarde,

estou fazendo um programa com C css, vi outros tópicos, mas não sei assembly mas estou com as seguintes dificuldades,

o programa tem a função de ler o valor AD, sendo utilizado um potenciometro, e e tendo a sua saida um pwm, na base do transistor, para chavear,

o programa é este, mas tenho dificuldades, não há nenhum erro de compilação,

toda ajuda é bem vinda..

#include "C:\Documents and Settings\Elamp.ELAMP_LAP1\Desktop\RGB_ELAMP_DUOLINE\include_duo.h"

#define duty_limit 65 //quantidade de duty cycles 65*256us=16,6ms

#include <STDLIB.H>

#use delay(clock=4000000)

// variaveis globais

unsigned int univer_counter = duty_limit;

unsigned int pwm_counter;

int nivel_saida;

#int_timer0

void timer0_isr(void)

{

univer_counter--;

if(univer_counter > pwm_counter)

{

output_high(pin_a0);

}

else

{

output_low(pin_a0);

}

if(univer_counter==0)

{

univer_counter = duty_limit;

}

}

void main(void)

{

unsigned int16 valor_ad;

setup_adc_ports(AN3_ANALOG);

setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(3);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

enable_interrupts(INT_TIMER0);

while(true)

{

//programa

valor_ad=read_adc();

nivel_saida=valor_ad;

pwm_counter = (nivel_saida*65)/1023;

}

}

Link para o comentário
Compartilhar em outros sites

é apenas as difinições que ficaram separadas..

#include <12F675.h>

#device adc=10

#FUSES NOWDT //No Watch Dog Timer

#FUSES INTRC_IO //Internal RC Osc, no CLKOUT

//#FUSES NOCPD //No EE protection

//#FUSES NOPROTECT //Code not protected from reading

#FUSES NOMCLR //Master Clear pin used for I/O

#FUSES NOPUT //Power Up Timer

//#FUSES NOBROWNOUT //No brownout reset

#define RED PIN_A0

#define GREEN PIN_A1

#define BLUE PIN_A2

#use delay(clock=4000000)

abrass

Link para o comentário
Compartilhar em outros sites

Como prometido, fiz o exemplo. Consegui ~65Hz. Caso precise de mais, ou você diminui os steps q nesse exemplo vão de 0 a 100 ou aumenta o cristal.

Circuito e teste:

12F675_PWM.png

Código:

#include <12F675.h>

#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Crystal interno = 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOCPD //No EE protection

#use delay(clock = 4000000)

#define fim 100

int8 periodo=0;
int8 ciclo1=0;

#int_timer1
void TIMER1_isr (void)
{
/*=====================
Testes para ciclo = 0:
=======================*/

if (ciclo1 == 0)
{
output_low (PIN_A2);
}
if (ciclo1 == fim)
{
output_high (PIN_A2);
}

/*==============================
Já que o ciclo é diferente de 0:
================================*/

If (periodo < ciclo1)
{
output_high (PIN_A2);
}
else
{
output_low (PIN_A2);
}

if (periodo >= fim-1)
{
periodo=0;
}
periodo++;
set_timer1(65440); //65440
}

void main()
{
SETUP_ADC_PORTS(sAN0);
SETUP_ADC(ADC_CLOCK_DIV_8);

SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_1); //Configurar timer1 para clock iterno/8
enable_interrupts (INT_TIMER1); //Habilitar Interrupções
enable_interrupts (global);
set_timer1(65440); //Preload do timer1

set_adc_channel(0);
delay_us (20);

while (TRUE)
{
ciclo1 = 0.4 * read_adc();
delay_ms (50);
}
}

Falou

Link para o comentário
Compartilhar em outros sites

MatheusLPS

valeu pela ajuda, mas não teve o funcionamento que eu esperava,

talvez eu não tenha explicado o que queria fazer mais detalhado por falta de tempo,

desculpa se fiz perder seu tempo,

como eu não domino muito a programação e estou fazendo esse projeto de PD, em partes, estou desenvolvendo um carregador de bateria, sendo monitorado a tensão de saida, e a corrente, do circuito.

tive alguns problemas para entender a sua lógica, o seu programa esta funcionando certamente igual ao proteus pois testei no hardware no osciloscópio.

pois como falei recentemente não entendo, muito sobre programação comecei fazendo em partes, a primeira parte que seria, o chaveamento com o pwm por software, pois esse pic não possui. sendo conectado a base de um transistor, chaveando ele, para ter o valor de tensão necessária na saída.

estou lendo, bastante mas ainda estou travado nisso.

valeu.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!