Mira el programa adjunto.¿Me podrías dar una idea de cómo podría realizar esta operación?
No he verificado su funcionamiento físicamente, pero te puede servir de orientación.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Mira el programa adjunto.¿Me podrías dar una idea de cómo podría realizar esta operación?
Encontre un error en tu esquema, fijate que la señal de ingreso la estas poniendo en el pin A1, pero para que ocurra un interrupcion, debe estar conectado en el pin A2. Adjunto un imagen con la modificacion que debes realizar. Y vuele a verificar el funcionamiento.
Mira el programa adjunto.
No he verificado su funcionamiento físicamente, pero te puede servir de orientación.
#include <16f676.h>
#fuses NOMCLR
#device adc=10
#use delay(crystal = 20MHz)
long fase;
#INT_EXT
void sd_externa_rb0 (void)
{
set_timer0(fase);
enable_interrupts(INT_TIMER0);
}
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
disable_interrupts(INT_TIMER0);
output_high(PIN_A1);
delay_us(250);
output_low(PIN_A1);
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(22);
enable_interrupts(GLOBAL);
setup_timer_0 (T0_INTERNAL|T0_DIV_256);
enable_interrupts(INT_EXT);
while(true)
{
fase = ((((157 * read_adc()) / 1024)) + 93);
}
}
#include <16f676.h>
#device adc=10
#fuses NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, HS, PUT
#use delay (clock=20000000)
#use [COLOR=Red]fast_io(C)[/COLOR]
#define LED PIN_C1
[COLOR=Red]// Definiciones de variables
float Vin;
long Dfase,Dfase2;
[/COLOR]
#INT_EXT
void EXT_isr(void)
{
[COLOR=Red] Vin=(5*[/COLOR][COLOR=Red][COLOR=Red]read_adc()[/COLOR])/1023;[/COLOR]
if (Vin <= 2.5)
{
Dfase=(Vin*3100);
delay_us(Dfase);
delay_us(200);
Output_high(LED);
delay_us(250);
Output_low(LED);
Dfase2=(7730-Dfase);
delay_us(Dfase2);
Output_high(LED);
delay_us(250);
Output_low(LED);
}
else
{
delay_us(200);
Dfase=(Vin*3150);
delay_us(Dfase);
Output_high(LED);
delay_us(250);
Output_low(LED);
}
}
void main()
{
setup_comparator (NC_NC_NC_NC);
Output_low(PIN_C0);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(0);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(true)
{
}
}
#include<16f676.h>
#fuses NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, HS, PUT
#device adc=8
#use delay (clock=20000000)
int8 fase;
#INT_EXT
void sd_externa_rb0 (void)
{
set_timer0(fase);
enable_interrupts(INT_TIMER0);
}
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
disable_interrupts(INT_TIMER0);
output_high(PIN_A1);
delay_us(200);
output_low(PIN_A1);
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(22);
enable_interrupts(GLOBAL);
setup_timer_0 (T0_INTERNAL|T0_DIV_256);
enable_interrupts(INT_EXT);
while(true)
{
fase = 250-((157*read_adc())/255);
delay_us(20);
}
}
#include<16f676.h>
#fuses NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, HS, PUT
#device adc=8
#use delay (clock=20000000)
#INT_EXT
void sd_externa_rb0 (void)
{
int8 fase;
fase = 250-((157*read_adc())/255);
delay_us(20);
set_timer0(fase);
enable_interrupts(INT_TIMER0);
}
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
disable_interrupts(INT_TIMER0);
output_high(PIN_A1);
delay_us(200);
output_low(PIN_A1);
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(22);
enable_interrupts(GLOBAL);
setup_timer_0 (T0_INTERNAL|T0_DIV_256);
enable_interrupts(INT_EXT);
while(true)
{
}
}
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
disable_interrupts(INT_TIMER0);
output_high(PIN_A1);
delay_us(200);
output_low(PIN_A1);
}
while(true)
{
}
#INT_EXT
void sd_externa_rb0 (void)
{
int8 fase;
fase = 250-((157*read_adc())/255);
delay_us(20);
set_timer0(fase);
enable_interrupts(INT_TIMER0);
}
#include<16f676.h>
#fuses NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, XT, PUT
#device adc=8
#use delay (clock=4000000)
int8 fase=0,fase1;
int16 q, q1;
#INT_EXT
void sd_externa_rb0 (void)
{
set_timer0(fase);
enable_interrupts(INT_TIMER0);
}
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
output_high(PIN_A1);
delay_us(200);
output_low(PIN_A1);
disable_interrupts(INT_TIMER0);
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
enable_interrupts(GLOBAL);
setup_timer_0 (T0_INTERNAL|T0_DIV_32);
enable_interrupts(INT_EXT);
while(true)
{
set_adc_channel(0);
delay_us(20);
fase1 = read_adc();
delay_us(20);
q=(157*fase1);
q1=q/255;
fase=250-q;
}
}
int8 fase=0,fase1;
int16 q, q1;
...
while(true)
{
set_adc_channel(0);
delay_us(20);
fase1 = read_adc();
delay_us(20); [B]//Según el datasheet del PIC16F877A, el tiempo typ. de adquisición es de 40uS.[/B]
q=(157*fase1); [B]//Numero de 16 bits, OK.[/B]
q1=q/255 [B]//Haces la operacion, pero a donde aplicas q1?[/B]
fase=250-q; [B]//Restas un numero de 8 bits con uno de 16 bits?[/B]
}
...
delay_us(20); //Según el datasheet del PIC16F877A, el tiempo typ. de adquisición es de 40uS.
q=(157*fase1); //Numero de 16 bits, OK.
fase=250-q; //Restas un numero de 8 bits con uno de 16 bits?
#include <16f688.h>
#include <stdint.h>
#device adc = 8
#use delay (internal = 8000000)
uint8_t flag = 0;
#INT_EXT
void ext_isr ()
{
flag = 1;
}
void main()
{
int16 c;
setup_oscillator(OSC_8MHZ);
output_low (PIN_C1);
setup_adc (ADC_CLOCK_DIV_16);
setup_adc_ports (sAN0, VSS_VDD);
set_adc_channel (0);
ext_int_edge (L_TO_H);
enable_interrupts (INT_EXT);
enable_interrupts (GLOBAL);
setup_timer_0 (T0_DIV_64);
while (TRUE)
{
if (flag)
{
read_adc (ADC_START_ONLY);
delay_us(100);
c = read_adc (ADC_READ_ONLY);
if (c > 240) c = 240;
if (c > 15)
{
set_timer0 (c);
while (get_timer0());
output_high (PIN_C1);
delay_us(200);
output_low (PIN_C1);
}
flag = 0;
}
}
}
Desconozco el porque, no tienes que declarar la librería math.h o stdint.h (para operaciones matemáticas) en este compilador? Como yo utilizo mikroC, no sabría decirte.la operación de q=(157*fase1); es un número de 16 bits, pero igual el resultado de la operación no es correcto dado que fase1 en el momento tiene un valor de 115 lo cual se multiplica por 157 y da 135 como muestra la imagen lo cual no es correcto.
q1 = 135/255 = 0.53 //como es variable entera solo muestra el cero.la variable q1 va es en la siguiente línea pido disculpas por mi error, pero al igual siempre el resultado de esa división me esta dando cero.
Desconozco el porque, no tienes que declarar la librería math.h o stdint.h (para operaciones matemáticas) en este compilador? Como yo utilizo mikroC, no sabría decirte.]
Uso un 16f1827 y al parecer puede funcionar el ADC a 16 bits ... o casi. En Proteus el ADC tiene 65472 niveles de cuantificación (debería ser 65536) pero según entiendo el ADC solo es de 10 bits ¿entonces será de 10 o de 16? Gracias.Mira en la web de microchip a ver.
Cuando un ADC tiene mucha resolución conlleva que el circuito de adaptación es caro y complejo.
Uso un 16f1827 y al parecer puede funcionar el ADC a 16 bits ... o casi.