Autor Tema: Ayuda con programa puerto serie PIC16F874  (Leído 2042 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Tormentor100

  • PIC10
  • *
  • Mensajes: 3
Ayuda con programa puerto serie PIC16F874
« en: 04 de Noviembre de 2010, 17:45:53 »
Hola amigos, estoy trabajando con un programa que mide el voltaje con ayuda de un potenciometro (y tambien muestra la hora) en una pantalla lcd.. quiero pasar la información del voltaje del primer micro al segundo por puerto serie, pero no encuentro el modo, espero alguien me pueda ayudar, saludos!

aqui esta el codigo que tengo

Código: [Seleccionar]
#if defined(__PCM__)
#include <16F874.h>
//#device adc=10 //Resolución del convertidor análogo de 10 bits
#device adc=8 //Resolución del convertidor análogo de 8 bits
#fuses XT,NOWDT,NOPROTECT,NOLVP

#endif
#byte PORTB= 0X06
#byte TRISB= 0X86
#byte PORTC= 0X07
#byte TRISC= 0X87
#byte PORTD= 0X08
#byte TRISD= 0X88
#use Delay(Clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)//Config. del puerto serie

int seg=0,min=0,hor=0,flag=0,minut,hora,   CONTADOR;
unsigned int dato,entero,residuo,decimal;
long longdato,aux;
#include<lcd.c>
// *********************************
//*************** PUERTO SERIE  *******************
#INT_RDA         //Rutina de servicio de Interrupcion por RX
void serial_isr()
{
   dato=getc();      //Se lee el dato recibido por el puerto serie
   output_d(dato);      /Se muestra por el puerto RB
     
}
//*************************************************

void conv_voltaje(void);

#INT_EXT
Void int_isr(void) {
ext_int_edge(H_TO_L); 
    if( flag==0  ){
         flag=1;
        DISABLE_INTERRUPTS(INT_TIMER1);
    }
    else{
         flag=0;
        ENABLE_INTERRUPTS(INT_TIMER1);
    }
       

}

#INT_RB                   //Rutina de servicio  de interrupción
Void intrB_isr(void) {
ext_int_edge(H_TO_L);
delay_ms(250);
   if(input(pin_b4)==0){
 
       min=min+1;
     
        if(min==60)
         min=0;
    }

   if(input(pin_b5)==0){
       hor=hor+1;
       if(hor==24)
         hor=0;                   
   }       
printf(lcd_putc,"\freloj:%d:%d:%d",hor,min,seg);

}


#INT_TIMER1                   //Rutina de servicio  de interrupción
Void clock_isr(void)  {
   
     //Ajuste de 15535 a 15559 para aproximarlo al 1 seg
   
       SET_TIMER1(15556);
      CONTADOR=CONTADOR+1;     //Utilice el StopWatch en el simulador para verificarlo                   
         if(CONTADOR==10){
          CONTADOR=0;
          seg=seg+1;
         printf(lcd_putc,"\freloj:%d:%d:%d",hor,min,seg);
        if(seg==59){       
         seg=0;                     //<-- Ponga aquí el Breakpoint para checar
         
         min=min+1;
         if(min==59){
            min=0;       
            hor=hor+1;
               if(hor==23)
               hor=0;
 
         }
       }
   }
}

void main(void) {                                 
    set_tris_c(0xBF);    //RC= 1011 1111, Tx=0(salida),Rx=1(entrada)
    set_tris_a(0xFF);
    set_tris_d(0x00);
   set_tris_b(0xFF);
    setup_adc_ports(ALL_Analog);
    setup_adc(ADC_CLOCK_DIV_8);
    set_adc_channel(0);
    lcd_init();
    delay_ms(6);

   SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_2);
   SET_TIMER1(15536);        //65536-15536=50000 cuentas para el sobreflujo
                                                         //En teoria 2*50000*10=1,000,000 Microseg
    ENABLE_INTERRUPTS(INT_TIMER1);
   ENABLE_INTERRUPTS(GLOBAL |INT_EXT |INT_RB );
   enable_interrupts(INT_RDA);   //Habilitamos la interrupcion por RX
      enable_interrupts(GLOBAL);   //Habilitamos el bit Global

       

  /* VDD and VSS references */
  while(1){
      delay_ms(250);
      dato=read_adc();
      conv_voltaje();
     lcd_gotoxy(1,2);
     printf(lcd_putc,"\aVolts=%d.%d",entero,decimal);
            delay_ms(1000);             //Retardo de 1 segundo
          if (!input(PIN_C0)){        //Si el bit 0 del Puerto C es 0 se hace trasmisión
           output_high(PIN_B0);   //Prendemos el Led 0
         delay_ms(1000);      //Retardo de 1 segundo
         output_low(PIN_B0);   //Apagamos el Led 0
          printf(" dato:%", dato);
          }


 }
}

void conv_voltaje(void)
{     
aux=longdato=dato;
   longdato=(longdato*5)/255;
   entero=longdato;
   aux=(aux*5)%255;
   aux=aux*10;
   aux=aux/255;
   decimal=aux;
}   

y esto es lo que me muestra el proteus... no copia el voltaje



Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Ayuda con programa puerto serie PIC16F874
« Respuesta #1 en: 06 de Noviembre de 2010, 07:17:15 »
Hola, antes que nada tienes que cruzar los cables, o sea, el TX del PIC1 al RX del PIC2 y RX del PIC1 al TX del PIC2. De lo contrario lo que haces es enviar un dato a la salida del otro PIC.
Después tienes que hacer una especie de protocolo para enviar y recibir los datos para que, cuando el segundo PIC reciba los datos, los presente en el display.

saludos.