Autor Tema: PROBLEMA COMUNICACION PIC A PIC  (Leído 2011 veces)

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

Desconectado PICX

  • PIC10
  • *
  • Mensajes: 20
PROBLEMA COMUNICACION PIC A PIC
« 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);

            };

}
}

 :( :( :(