Autor Tema: ¿Como generar un tren de 8 pulsos con pic16f887?  (Leído 5005 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
¿Como generar un tren de 8 pulsos con pic16f887?
« en: 22 de Marzo de 2013, 23:35:07 »
Estoy intentado realizar un sensor ultrasonico, y necesito generar un tren de 8 pulsos a 40kHz, Pero mis conocimientos de programación son muy minimos.

dejo adjunto el circuito y las instrucciones de como debería funcionar y agradecería cualquier ayuda que me puedan brindar.


•   El funcionamiento del circuito es muy sencillo. Primeramente, se debe proporcionar al sistema un pulso de disparo o trigger, el cual inicializara la etapa de emisión. Este pulso debe ser de 10µs como mínimo en nivel lógico TTL.
•   En operación,  el microcontrolador se encuentra esperando por la señal de disparo. Cuando la recibe, genera y envía solamente una señal formada por 8 ciclos de 5V a 40KHz.
El MAX232 recibe la señal, eleva el voltaje a 16V e inicia el transductor para convertir el tren de pulsos  eléctricos en un tren de ondas ultrasónicas. Posterior a ello, se apaga el MAX232 y la señal de eco o respuesta es iniciada en nivel lógico alto (5V), este valor es entregado por el PIC en el pin de salida GP1. Esta señal se mantendrá así durante el tiempo que viaje la onda sónica, encuentre el primer objeto limitante y regrese en forma de eco.
•   El eco viajara en forma perpendicular al objeto limitante y en forma paralela, pero en sentido contrario, a la onda generada por el emisor. Cuando el transductor receptor sense el eco ultrasónico, la señal de respuesta en GP cambiara a nivel lógico bajo (0V). El pin GP se encontrara en nivel alto el tiempo que tarde la onda sónica en viajar, regresar y ser captada por el receptor. Es así como se genera un pulso proporcional a la distancia recorrida por la onda. En este sistema de alcance definido, el pulso no será mayor a 10ms.
•   Si la etapa receptora no detecta la señal de eco, significa que la onda sónica no ha encontrado ningún objeto en su camino y se ha perdido. Por ello; la señal de respuesta entrara automáticamente en time out tras una espera de 30ms, el sistema reiniciara su funcionamiento y volverá a esperar el pulso de inicio para una nueva medición.
•   Debido a que el MAX232 es apagado durante la detección del eco, se  deben esperar cuando menos 10ms entre cada medición de esta manera se enciende nuevamente el MAX232 y también se recargan los voltajes de +/- 10V.


Desconectado oktubre

  • PIC10
  • *
  • Mensajes: 30
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #1 en: 22 de Marzo de 2013, 23:53:20 »
Disculpe la pregunta ... pero va a usar el 16f887 no es lo mismo que el 12 del esquema. Con el 887 le sobra para generar todas las funciones que precise....y ahorra circuiteria....
Creo q le conviene leer la hoja de datos del 887.  Con unas pocas líneas de código revuelve todo....
Un saludo
"La palabra elefante ha matado muchos más animales de esa especie que cualquier otra arma" (alguno lo dijo)

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #2 en: 23 de Marzo de 2013, 00:30:01 »
Si, utilizare el 887, pero la verdad no se ni como empezar

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #3 en: 23 de Marzo de 2013, 16:20:16 »
ok ok,bueno en lo que pueda ayudar mucho o poco lo intentare que para eso es este foro

para empezar dinos si usaras CCS o algun otro compilador,que en este caso le recomendaria usar CCS es mas facil y directo (aunque aveces tiene sus inconvenientes  :x jaja)

bueno,se me ocurre que la primera parte del pulso de unicio no es tan complicada,podriamos utilizar poleo en uno de los pines le que desees para detectar ese pulso o aun mejor la interrupcion externa del pic,ya que es mas segura.

para ello necesitas definir que pines usaras para todo lo demas,la interrupcion externa en caso de que te decidas por esa opcion normalmente se encuantra en el pin 0 del puerto B,tendras que corroborarlo como dice el compañero oktubre en la datasheet del pic,y coincido con el en que le des una leida.

eso seria como comienzo,definir los pines que usaras y hacer que detecte el pin de inicio,una ves que tengas eso avanzamos a lo siguiente.

ahora bien,entiendo que probablemente estes comenzando con la programacion de pics,asi que lo mejor es leer leer y releer muchos de los post que rondan el foro para checar como puedes implementar lo que te comento si despues de buscar no encuentras aun como empezar nos avisas vale jeje
Nunca se deja de aprender

Desconectado oktubre

  • PIC10
  • *
  • Mensajes: 30
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #4 en: 24 de Marzo de 2013, 00:34:18 »
Puedes hacer alguno de los muchos q estan en la red empezando por los de este foro. Fijate la web de RedPic allí se aprende de maravillas. Fijate aquí:

http://picmania.garcia-cuervo.net/picc.php

también en

http://www.aquihayapuntes.com/compilador-pcw-ccs.html

Tienen un curso básico de CCS y muchos ejemplos para implementar.

Un saludo

"La palabra elefante ha matado muchos más animales de esa especie que cualquier otra arma" (alguno lo dijo)

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #5 en: 25 de Marzo de 2013, 14:06:20 »
Dando vueltas por el foro me di cuenta que lo que intentaba hacer era mas complejo de lo que esperaba, por eso me decidi usar el sensor HC-SR04.

Solo necesito enviarle un pulso de minimo 10us por el trig y esperar el eco. Tambien necesito mostrar el dato en un LCD 2X16 pero no lo he logrado.


// PIC16F887 Configuration Bit Settings

#include <xc.h>

// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

#define _XTAL_FREQ 4000000
#define trig RA5
#define eco RC0
#define LCD_RS RD6
#define LCD_EN RD7
#define LCD_DATA PORTB
int centimetros=0;
int aux=0;
char centenas;
char decenas;
char unidades;


void set_lcd(void)
{
    LCD_RS=0;
    LCD_EN=1;
    __delay_ms(2);
    LCD_EN=0;
}
void lcd_init (void){
    LCD_DATA=2;
    set_lcd();
    LCD_DATA=56;
    set_lcd();
    LCD_DATA=15;
    set_lcd();
    LCD_DATA=6;
    set_lcd();
    LCD_DATA=1;
    set_lcd();
}
void lcd_write(unsigned char c){
    LCD_EN=1;
    LCD_DATA=(c);
    __delay_ms(2);
    LCD_EN=0;
}
void lcd_goto(unsigned char pos){
    LCD_RS=0;
    lcd_write(0x80+pos);
}

void lcd_puts(const char*s){
    LCD_RS=1;
    while(*s)
    lcd_write(*s++);

}
void bin_bcd (void){
    aux=centimetros;
    centenas=0;
    decenas=0;
    unidades=0;
    while(aux>=100){
        aux=aux-100;
        centenas=centenas+1;
    }
    while(aux>=10){
        aux=aux-10;
        decenas=decenas+1;
    }
    unidades=aux;
}
void pulso(void){
    trig=1;
    __delay_us(50);
    trig=0;
    __delay_ms(50);
}
void mide_distancia(void) //funcion para medir la distancia 58us tarda el sonido en viajar 2 cm
{
    while(eco=0);
    while(eco=1){
        centimetros++;
        bin_bcd();
        __delay_us(58);

    }
}
void main( void ){
    ANSEL=0;
    ANSELH=0;
    TRISB=0;
    TRISA=0;
    TRISD=0;
    TRISC=0b00000001;

    pulso();
    mide_distancia();

       

    lcd_init();
    while(1){       
        lcd_goto(0);
        lcd_puts (centimetros);
        lcd_goto(0x40);
        lcd_puts("cm");
        while(1)
            continue;





}
}

 

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como generar un tren de 8 pulsos con pic16f887?
« Respuesta #6 en: 25 de Marzo de 2013, 14:17:23 »
Yo pienso medirlo con el modulo CCP del PIC, por interrupción, para no dejar colgado al pic durante la medición...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.