Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/12/2016 #1


Sensor LM35 con PIC18F4550 y Bluetooth
Hola. Intento realizar un pequeño proyecto con un PIC18F4550, en el cual quiero leer por un pin analógico la señal de un LM35, y que muestre los datos obtenidos a través de un módulo Bluetooth hacia un celular u ordenador, y al mismo tiempo que el PIC reciba datos con el Bluetooth y encienda o apague unos leds.

Mi problema es que en la programación del PIC utilizo el comando "getch()" y la señal del sensor la manda hasta que yo envío un dato al getch()

Espero que me puedan ayudar para que me esté enviando los datos del sensor y poder encender o apagar los leds cuando yo le envíe datos. Gracias.

Código PHP:
#include <18f4550.h>
#use delay(crystal =4MHz)
#include <string.h>

#fuses HS
#fuses NOPROTECT
#fuses NOPUT
#fuses NOWDT
#fuses MCLR

#use rs232(UART1, baud= 9600, xmit=pin_c6, rcv=pin_c7, parity=n, bits=8, stop=1)
#use standard_io(b)
#use standard_io(a)

#define led1   pin_b0
#define led2   pin_b1



char dato;
float temperatura;
long valor;




void main()
{  

   
   while(
true)
   {
      
      
            
      
dato=getc();

      
setup_adc(adc_clock_internal);
      
setup_adc_ports(all_analog);
      
delay_us(20);
   
      
set_adc_channel(0);
      
delay_us(50);
      
valor=read_adc();
      
//temperatura=(0.488758*(float)valor);
      
printf("%2.1f\n\r",temperatura);
      
delay_ms(2000);
     
      
      switch (
dato)
      {
         case 
'a'
            
output_high(led1);                   
         break;
         
         case 
'b'
            
output_high(led2);           
         break;         
        
         
      }
 
   }

13/12/2016 #2
Moderador

Avatar de D@rkbytes

Si estás haciendo la recepción por "poleo", (Polling) debes usar kbhit();
kbhit (stream); retorna un 0 cuando se espera un dato y un 1 cuando se tiene un dato.

Por ejemplo:
Código:
if (kbhit())
{
    dato = getc();
    flag_rx = 1; // Bandera que indica que hay un dato listo en el buffer. (Opcional)
}
Como quiera, te recomiendo que uses la interrupción por recepción. (#INT_RDA)
Es mucho mejor y el PIC que estás usando la tiene, así que aprovecha sus recursos.
13/12/2016 #3

Avatar de TRILO-BYTE

sobretodo el delay esta enormemente largo 2 segundos es larguisimo lo que tienes que hacer es quitarlo

y para poder escribir en el display debes refrescar cada 2 segundos ejemplo:

mi interrupcion es de 100 milisegundos

interrupcion
{
if(inc>= 10)
{
inc=0;
segundos++;
}

inc++;
}


en el main es asi:

while(true)
{

if(segundos>=2)
{
// escribe en el display
segundos=0;
}


}
13/12/2016 #4


Ok, muchas gracias a los dos por su ayuda, de verdad me está funcionando
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.