Autor Tema: buenas,necesito programa en C para pic 16F876 para una alarma por ultrasonidos con el sensor srf08  (Leído 3842 veces)

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

Desconectado jarjurjirjur

  • PIC10
  • *
  • Mensajes: 1
Angelitotengo el hadware, solo me falta el programa.el sensor SRF08 va unido al pic 16f876 en bus I2C.
del pic 16f876 va a una lcd que visualiza la distancia que mide el sensor SRF08.si metemos una clave para activar la alarma,la distancia queda grabada y si es interrumpida salta la alarma.si algien tiene una idea se lo agradeceria

Desconectado kuauhtemok

  • PIC16
  • ***
  • Mensajes: 116

bueno... debido a que ya quieres todo hecho, por lo menos dinos que lenguaje de programacion deseas   Ardiendo
La felicidad no es mas q la ausencia momentanea del dolor

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
"solo me falta el programa" jejejejejMuchas risas
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado carlyvalente

  • PIC16
  • ***
  • Mensajes: 108
Mira , justo estoy laburando con un generador de ultrasonidos. Recién empiezo. Te paso en asembler (es el único idioma que manejo) una rutina para salida por puerto CCP1 del 876.



;Mira si puedes usar el 876A, ya que el 876 está obsoleto. Si ya lo tienes, sólo quita la "a" final
; tanto en el list como en el #include

   LIST p=16f876a      ;list directive to define processor
      #include <p16f876a.inc>   ;processor specific definitions

;Observa que los parámetros de configuración son los que te sirven a tu proyecto
       __config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF


;Parámetros para eliminar los mensajes de warning cuando lo ensamblas
   ERRORLEVEL -302      ;suppress "not in bank 0" message
   ERRORLEVEL -203      ;suppress  message
   ERRORLEVEL -305      ;suppress  message
   ERRORLEVEL -205      ;suppress  message

#define PWM   PORTC,2      ; pin salida audio RC2/CCP1, pin 13 del micro
                  ; lo suyo sería ingresar esta señal a un transformador pequeño de relación
                  ; 8-200 para aumentar la potencia de salida hacia el transductor
                  ; aunque no es necesario definir el pin de salida lo hago con motivo informativo


;Constantes para la onda de salida. Con estos valores obtienes 40khz medidos con osciloscopio.
; Si necesitas otra frecuencia no tienes mas que subir o bajar ambos valores. Ten en cuenta
; que el duty deberá ser siempre la mitad+1 del valor del período para obtener una onda cuadrada
; Si subes los valores obtendrás una frecuencia más baja.
 
periodo       equ .48      ; PWM periodo, lo que ocupa un flanco de subida y uno de bajada (un 1 y un 0)
duty      equ .25      ; PWM duty del ciclo, el tiempo que está en 1

ORG   0x00            
      goto   init   ;ir al inicio del programa
ORG 0x05
   

;Inicializar  micro

init   clrf PORTA      ;clear port A
      clrf PORTB      ;clear port B
      clrf PORTC      ;clear port C
      bsf STATUS,RP0
      bcf STATUS,RP1   ;bank 1
      movlw 0x06
      movwf ADCON1         ;set puerto analógico como digital
      movlw    b"11111111"      ; He puesto todos los pins
      movwf   TRISA         ; de todos los puertos como entradas (1)
      movlw   b"11111111"      ; salvo el pin RC2 que está como salida (0)
      movwf   TRISB
      movlw   b"11111011"
      movwf   TRISC         
      bcf   STATUS,RP0   ;switch bank 0




      bsf   STATUS,RP0   ;switch bank 1
      movlw periodo   ; cargamos el valor del período en PR2
      movwf PR2
      bcf   STATUS,RP0   ;switch bank 0   
      movlw duty      ; cargamos valor del duty en CCPR1L
      movwf   CCPR1L


Principal

; Ya está listo para emitir. Sólo debes poner estas 3 lineas para activar la salida
pwmon   bsf T2CON,2      ;TMR2 activado
      movlw 0x0c      ;cargamos setup módulo
      movwf CCP1CON   ;PWM

; Esta linea para que quede emitiendo. Puedes reemplazarla por una pausa, una activación por botón, etc etc.
loop nop
   goto loop

; Estas lineas para desactivar la salida
pwmoff   clrf CCP1CON
      bcf T2CON,2      ;Desactivamos TMR2
      bcf PWM         ;esta línea en caso que al finalizar la emisión el pin quede a 1.

;Y ya está.
; Se podría hacer por pin común on/off con pausas para generar la onda,
;sin usar el módulo PWM pero es una pena tener ese módulo y no usarlo.
; Además ya queda como ejemplo para usos futuros de los foristas
               
end


Desconectado xandacona

  • PIC10
  • *
  • Mensajes: 1
Re: buenas,necesito programa en C para pic 16F876 para una alarma por ultrasonid
« Respuesta #4 en: 27 de Julio de 2006, 10:49:14 »
Hola.

Estoy haciendo un robot bastante grande y voy a ponerle un anillo de sónar alrededor. Voy a utilizar el sensor srf10 que es parecido al srf08. Mi lenguaje de programación es ccs 3.241. tengo el montaje hecho pero no me funciona. no sé donde está el error, quizás alguien me pueda ayudar enviándome algo de código que fuicione con mi sensor.

aquí les pongo mi código que está basado en el proyecto picUSB agradecería que alguien me indicase algún error. gracias

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer


/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports


/////////////////////////////////////////////////////////////////////////////
//
// Al conectar el PicUSB al PC encendemos el Led Rojo hasta que el dispositivo
// halla sido configurado por el PC, en ese momento encederemos el Led Verde.
// Esperaremos hasta que se reciba un paquete proveniente del PC. Comprobaremos
// el primer byte del paquete recibido para comprobar si queremos entrar en el
// modo Suma, donde se realizará una suma de dos operandos, que corresponderan
// con los dos bytes restantes del paquete recibido; una vez realizada la suma
// enviaremos el paquete con el resultado de vuelta al PC. Si entramos en el
// modo Led comprobaremos el segundo byte del paquete recibido para comprobar
// si deberemos apagar los leds, encender el verder o el rojo.
//
/////////////////////////////////////////////////////////////////////////////
#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define LED_ON  output_high
#define LED_OFF output_low

#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado envia[0]




#ifndef DAL_SCL
#define DAL_SCL PIN_B0
#define DAL_SDA PIN_B1
#endif
#use i2c(master, sda=DAL_SDA, scl=DAL_SCL)



void disparar_sensor(void){
   i2c_start();
   i2c_write(0xe0);
   i2c_write(0x00);
   i2c_write(0x51);
   i2c_stop();
}

BYTE leer_sensor(void)
{
   BYTE data;

   i2c_start();
   i2c_write(0xe0);
   i2c_write(0x02);
   i2c_start();
   i2c_write(0xe0);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}

void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[1];

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host

   LED_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde

   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe

            if (modo == 0) // Modo_Suma
            {
               resultado = param1 + param2;  //hacemos la suma

               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
            }

            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
               if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
               if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
               if (param1 == 3) {LED_ON(LEDV); LED_ON(LEDR);}  //encendemos los dos leds
            }

       if (modo == 2) // medir
            {
                LED_OFF(LEDV); LED_OFF(LEDR); //apagamos los leds
            disparar_sensor();
            resultado = leer_sensor();
                usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
            }
         }
      }
   }
}


 

anything