Autor Tema: comunicacion rs232 pic 16f84a y 18f4550  (Leído 2272 veces)

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

Desconectado jaimearmandofc

  • PIC10
  • *
  • Mensajes: 22
comunicacion rs232 pic 16f84a y 18f4550
« en: 06 de Febrero de 2012, 04:22:27 »
hola, tengo un problema con la comunicacion entre dos pics, la cual es por puerto serie.
en el 4550 uso el rs232 que tiene integrado, es decir no lo emulo, pero en el 16f84 si es emulado, no se si tenga al que ver, o sea algo mas, alguna ayuda se agradeceria,

en proteus lo simula perfectamente, a diferentes configuraciones de baudios...  1200...2400...9600 y todo bien, pero en la vida real no...

esta es la configuracion del 18f4550 y como recive por interrupcion los caracteres

Código: [Seleccionar]


#include <18F4550.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PLL1                     //No PLL PreScaler
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES XT                    //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD sin pasar por el pll
#FUSES NOBROWNOUT               //No brownout reset
#FUSES USBDIV
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=4MHZ)
#use rs232(baud=1200, xmit=PIN_C6,rcv=PIN_C7)
--------------------------------

#int_RDA
void RDA_isr() {        // Interrupción recepción serie USART
   disable_interrupts(GLOBAL);
   //lcd_putc('X');
   //putc('x');
  rcvchar=0x00;         // Inicializo carácter recibido
  if(kbhit()){          // Si hay algo pendiente de recibir ...
    rcvchar=getc();     // lo descargo y ...
    addcbuff(rcvchar);  // lo añado al buffer y ...
    echos(rcvchar);     // hago eco (si procede).
    lcd_putc(rcvchar);
  }                     // termina if
  if(flagcommand)procesa_comando();
  ON(LCD_LED);
  output_toggle(RELE_ALIMENTO);  // invierte el led del sistema (para dar un parpadeo cada segundo)
  flush=1;
  enable_interrupts(GLOBAL);
}                       // termina interrupcion por RDA




esto es lo que envia el 18f4550,

Código: [Seleccionar]

#include <16F84A.h>
#FUSES NOWDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#use delay(clock=4000000)

#use rs232(baud=1200,xmit=PIN_A0,rcv=PIN_A3)
//--------------------------------------------------------------------
#define ON output_high
#define OFF output_low
#define BOCINA     PIN_A2//-------------A2
#define LED_rojo   PIN_A1 

#define columna_a  PIN_B0
#define columna_b  PIN_B1
#define columna_c  PIN_B2
#define columna_d  PIN_B3
#define fila_1    PIN_B4
#define fila_2    PIN_B5
#define fila_3    PIN_B6
#define fila_4    PIN_B7

/*#define columna_a  PIN_B4
#define columna_b  PIN_B5
#define columna_c  PIN_B6
#define columna_d  PIN_B7
#define fila_1    PIN_B0
#define fila_2    PIN_B1
#define fila_3    PIN_B2
#define fila_4    PIN_B3*/

#include "sonidos.c"



---------------------------------------
#include <main.h>
char columna;              //Variable contador de columnas 1-4
char boton;                //Variable de alamacenaje de tecla
int1 flag_banderilla=0;    //bandera anti flanco de bajada
// Keypad layout:                               
char const KEYS[4][4] = {{'1','2','3','A'},  //Formato de Teclado
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}};

#int_RB                                      //interrupcion de cambio del
void  RB_isr(void) {                         //estado del puerto B
   char fila;//variable de seleccion de fila
   ON(LED_rojo);
   //delay_ms(100);
   flag_banderilla=0;
   if(input_state(fila_1)==1){fila=0; flag_banderilla=1;}           
   if(input_state(fila_2)==1){fila=1; flag_banderilla=1;}
   if(input_state(fila_3)==1){fila=2; flag_banderilla=1;}
   if(input_state(fila_4)==1){fila=3; flag_banderilla=1;}
   
   boton=KEYS[fila][columna-1];              //asigna a boton, el boton que disparo la interupcion
   
   if(flag_banderilla==1){
      putc('T');
      delay_ms(50);
      putc(boton);
      delay_ms(50);
      putc('\r');
      delay_ms(50);
      beep();
   }
   OFF(LED_rojo);
}

void main(){
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   
   do{
      columna++;
      if(columna==5)columna=1;
      switch(columna){
         case 1: OFF(columna_d); ON(columna_a); break;
         case 2: OFF(columna_a); ON(columna_b); break;
         case 3: OFF(columna_b); ON(columna_c); break;
         case 4: OFF(columna_c); ON(columna_d); break;
      }
      delay_ms(10);
   }while(TRUE);

}

Desconectado fedemn6

  • PIC10
  • *
  • Mensajes: 8
Re: comunicacion rs232 pic 16f84a y 18f4550
« Respuesta #1 en: 25 de Marzo de 2012, 20:12:54 »
Che como lo veo no me parece que halla nada raro en el programa, Aparte si proteus te lo simula bien tiene que andar. Lo que debes fijarte es como hallas conectado la uart. Acordate que tenes que crusar las lineas de transmicion. Es decir Tx --->RX y RX--->TX. es lo unico que me parece que puede ser cualquier cosa avisa