TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PICX en 24 de Agosto de 2006, 14:14:41
-
sabios del c espero q me ayuden con este pequeño problemita. :(
por los codigos q pondre a continuacion se daran cuenta de q de comunicacion serial nose mucho; es una comunicacion serial entre dos pic ,el algoritmo tendria que hacer lo siguiente.
uno de los pic hace una conversion analogica de 0 a 5v mostrarla por lcd , en el momento en q se presione un pulsador en el otro pic queriendo ordenar la comunicacion del dato de la conversion se debe madar el dato a este pic y q este tambien muestre la conversion hecha por lcd.
pero q hace los algoritmos q tengo:
la conversion analogo digital la hace perfectamente al igual q la visualizacion en lcd pero cuando ingreso un alto en el segundo pic se hace la comunicacion aparentemente muy lenta y aparece en la lcd q la conversion es 0 .
personalmente se q tengo problemas con los programas porq no domino perfectamente esta comunicacionespero encarecidamente una respuesta
gracias por la atencion prestada
algoritmo primer pic
///////////////////////////// DIRECTIVAS DE PREPROCESADO /////////////////////////////
#include <16F877A.h> // Dispositivo a utilizar
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT // Fusibles
#use delay(clock=4000000)
#use rs232(stream=maestro,baud=9600, xmit=PIN_c6,rcv=PIN_c7,force_sw)
#define use_portb_lcd TRUE
#include "lcd.c"
////////////////////////////////////// GLOBALES //////////////////////////////////////
const int escala = 255; // Escala del conversor ADC (8 bits)
const float v_max = 5; // Voltaje máximo que entrega mi fuente
////////////////////////////////////// RUTINAS ///////////////////////////////////////
void borra_lcd()
{
lcd_putc("\f");
} // Con esta instrucción borramos el lcd
void calcula_voltaje(int val,float &voltaje)
{
voltaje = (val*v_max)/escala;
}
/////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
int valor; // La declaración de variables SIEMPRE debe ir lo primero
float voltaje;
set_tris_B(0b00000000); // Puerto B configurado como salida
port_b_pullups(FALSE); // Desactivamos pull-ups del puerto B
setup_adc_ports(RA0_RA1_RA3_ANALOG); //Configura A0,A1 y A3 como entradas analógicas y Vdd como voltaje de referencia
setup_adc(ADC_CLOCK_INTERNAL); // Reloj para el conversor
set_adc_channel(0); // Seleccionamos el canal 0 (RA0)
lcd_init(); // Antes de usar el lcd,hay que inicializarlo
do // Bucle infinito,que se ejecuta de forma indefinida
{
valor = read_adc();
calcula_voltaje(valor,voltaje); // Le mandamos el parámetro "valor" y nos devuelve "voltaje"
// Llamada a rutina que borra el lcd
printf(lcd_putc,"Conversion ADC");
printf(lcd_putc,"\nTENSION:%f",voltaje);
delay_ms(100);
borra_lcd();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
if (kbhit(maestro)){
printf(lcd_putc,"\fEnviando ~%f!",voltaje);
delay_ms(2000);
fputc(voltaje,maestro);
};
}
WHILE(TRUE);
}
a continuacion el algoritmo q da la orden de comunicacion
#include <16F877A.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#define use_portd_lcd TRUE
//#byte CMCON=0x01F /*Deshabilitamos Comparadores*/
#use rs232(stream=esclavo1,baud=9600, xmit=PIN_c0,rcv=PIN_c1,force_sw)
#include "lcd.c"
#use standard_io(a)
void main()
{
//cmcon=7;
lcd_init();
for(;;){
lcd_putc("\f~Maestro en espera\n Esclavo 1");
delay_ms(2000);
if(input(PIN_A1)) {
delay_ms(400);
printf(lcd_putc,"\fvoltaje recivido\n ~%1.2d",getch(esclavo1));
delay_ms(2000);
};
}
}
:( :( :(