////////////////////////////////////////////////////////////////////////////////
// Trigger Delay 0.1 us a 5 ms
// Abril 2010
// Realizado: Jose Antonio
// Programa: Delay Trigger 0.1 us a 5 ms
// Proyecto: 201004JMR02
//
// -Versión: 1.0 Abril 2010
//
//
// Dispositivo: PIC 16F876 Compilador: CCS vs4.049
//
// FUNCIONAMIENTO:
// A PARTIR DE UN TRIGGER EXTERNO, POR FLANCO DE SUBIDA (RB0), SE
// GENERA UN TRIGGER EXTERNO (RB1) DE UNA DURACIÓN DE 100 uS. CON UN RETRASO
// COMPRENDIDO ENTRE 100 uS Y 5 mS. ESTE RETRASO SE SELECCIONA A TRAVÉS DE
// UN LCD Y 4 BOTONES, DOS DE SELECCION DE uS O mS, Y OTROS DOS PARA
// AUMENTAR O DISMINUIR EL TIEMPO. LOS TIEMPOS PREFIJADOS SON:
// uS: 100,200,300,400,500,600,700,800 Y 900.
// mS: 1,1.5,2,2.5,3,3.5,4,4.5 Y 5.
// SE GUARDA EN LA EEPROM LA CONFIGURACION DE TIEMPO
// TANTO DE US COMO DE mS
//
//
//
// -Posibles Mejoras: Guardar la última configuración en la memoria
// del PIC.
//
// RB0 --> IN TRIGER EXTERNO (POR FLANCO DE SUBIDA)
// RB1 --> OUT TRIGGER RETRASADO
// RB2 -->
// RB3 --> OUT LED STATUS
// RB7 --> IN INCREMENTAR +
// RB6 --> IN DECREMENTAR -
// RB5 --> IN SELECCION uS
// RB4 --> IN SELECCION mS
//
//
//
// Conexiones del LCD 16x2 4 bits PORTC
// RC0 --> OUT E
// RC1 --> OUT RS
// RC2 --> OUT RW
// RC3 -->
// RC4 --> OUT D4
// RC5 --> OUT D5
// RC6 --> OUT D6
// RC7 --> OUT D7
//
//
////////////////////////////////////////////////////////////////////////////////
#include <16f876A.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay(clock=4000000,RESTART_WDT) //Fosc=4Mhz
#include<lcd_C.c> //libreria manejo LCD 16x2 4 bits PORTC
#use fast_io(A)
#use fast_io(B)
//#use fast_io(C)
#byte port_a = 0x05
#byte port_b = 0x06
#byte port_c = 0x07
//256 x 8 bytes of EEPROM
#DEFINE MEM_uS 0 //Definimos posiciones de memoria de la eeprom interna
#DEFINE MEM_mS 1
#DEFINE MEM_unit 2
//variables globales
long tiempo_us_lcd[9]={100,200,300,400,500,600,700,800,900}; //vector us lcd
long tiempo_us[9]={40,140,240,330,430,520,620,720,810}; //vector us para tiempo
long tiempo_ms_lcd[9]={10,15,20,25,30,35,40,45,50}; //vector ms *10 para lcd
long tiempo_ms[9]={850,1350,1810,2300,2800,3250,3750,4210,4750}; //vector ms
// en us para tiempo
int unidades=0; //0->us 1->ms
int i_us=0; //indice para us
int i_ms=0; //indice para ms
long TIME_DELAY; // tiempo para la func. delay. 100 us
int flag_disp=1; //Flag para actualizar el display
//Subrutina para refrescar el display
void display (void)
{
switch (unidades)
{
case 0: printf(lcd_putc
,"\f"); printf(lcd_putc
,"Time Delay \n"); printf(lcd_putc
,"Delay of %Lu us",tiempo_us_lcd
[i_us
]); flag_disp=1;
break;
case 1: printf(lcd_putc
,"\f"); printf(lcd_putc
,"Time Delay \n"); printf(lcd_putc
,"Delay of %2.1w ms",tiempo_ms_lcd
[i_ms
]); flag_disp=1;
break;
default: break;
}
}
//Subrutina de interrución del TMR1 Cada 0.5 segundos.
//fos/4=frec del TMR1 -> 0-65535
//0,5 seg=(4/Fosc)*8*(65536-valorTMR1)
//TMR 62500 -> 3036
#INT_TIMER1
void control_timer1(void)
{
output_bit(pin_b3,!input(pin_b3));
set_timer1(3036);
}
#INT_RB
void interrup_RB(void)
{
delay_ms(100); //pulsado->>> 1
if(input(pin_b7)==1)//INCREMENTAR +
{
if (unidades==0) //Estamos en us
{
if (i_us>=8)
{
i_us=8;
}
else
{
i_us=i_us+1;
}
TIME_DELAY=tiempo_us[i_us];
write_eeprom(MEM_uS,i_us);
}
else //Estamos en ms
{
if (i_ms>=8)
{
i_ms=8;
}
else
{
i_ms=i_ms+1;
}
TIME_DELAY=tiempo_ms[i_ms];
write_eeprom(MEM_mS,i_ms);
}
flag_disp=1;
}
if(input(pin_b6)==1)//DECREMENTAR -
{
if (unidades==0) //Estamos en us
{
if ((i_us<=0)||(i_us>8))
{
i_us=0;
}
else
{
i_us=i_us-1;
}
TIME_DELAY=tiempo_us[i_us];
write_eeprom(MEM_uS,i_us);
}
else //Estamos en ms
{
if ((i_ms<=0)||(i_ms>8))
{
i_ms=0;
}
else
{
i_ms=i_ms-1;
}
TIME_DELAY=tiempo_ms[i_ms];
write_eeprom(MEM_mS,i_ms);
}
flag_disp=1;
}
//Cambiados el b4 y b5, por hard estan bien, pero por soft no funcionaban
if(input(pin_b4)==1)//SELECCION mS
{
unidades=1;
TIME_DELAY=tiempo_ms[i_ms];
write_eeprom(MEM_unit,unidades);
flag_disp=1;
}
if(input(pin_b5)==1)//SELECCION uS
{
unidades=0;
TIME_DELAY=tiempo_us[i_us];
write_eeprom(MEM_unit,unidades);
flag_disp=1;
}
}
#INT_EXT
void interrupt_EXT()
{
delay_us(TIME_DELAY);
output_bit(pin_b1,1); //Salida trigger
delay_us(100); //duracion del trigger
output_bit(pin_b1,0);
}
///PROGRAMA
void main(void)
{
disable_interrupts(GLOBAL);
set_tris_a(0x00); // RA0 -->
// RA1 -->
// RA2 -->
// RA3 -->
// RA4 -->
// RA5 -->
port_b_pullups(false); // Resistencias de polarización del puerto B
set_tris_b(0xF1); // RB7 --> IN INCREMENTAR +
// RB6 --> IN DECREMENTAR -
// RB5 --> IN SELECCION uS
// RB4 --> IN SELECCION mS
// RB3 --> OUT LED STATUS
// RB2 -->
// RB1 --> OUT TRIGER
// RB0 --> IN TRIGER EXTERNO
//set_tris_c(0x00); // RC0 --> OUT E
// RC1 --> OUT RS
// RC2 --> OUT RW
// RC3 -->
// RC4 --> OUT D4
// RC5 --> OUT D5
// RC6 --> OUT D6
// RC7 --> OUT D7
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
ext_int_edge (L_TO_H);
enable_interrupts(GLOBAL);
lcd_init(); //inicializa lcd
i_us=read_eeprom(MEM_uS);
i_ms=read_eeprom(MEM_mS);
unidades=read_eeprom(MEM_unit);
if (unidades==0)
{
TIME_DELAY=tiempo_us[i_us]; //iniciamos en el valor guardado
}
else
{
TIME_DELAY=tiempo_ms[i_ms]; //iniciamos en el valor guardado
}
while(1)
{
if (flag_disp==1)
{
display(); //Refrescamos el display
flag_disp=0;
}
}
}
[/code=c]
¿alguien saber por qué según el tiempo de delay varia el tiempo que tarda en ejecutarse el retraso del pulso?
{
delay_us(TIME_DELAY);
output_bit(pin_b1,1); //Salida trigger
delay_us(100); //duracion del trigger
output_bit(pin_b1,0);
}
Gracias y un saludo