UART no 8252 !!!

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

UART no 8252 !!!

Mensagempor B-EAGLE » 08 Out 2007 03:20

Pessoal, não tá funcionando nem com reza braba a UART no AT89S8252, cheguei a colar alguns exemplos direto da atmel, sem modificar NADA e mesmo assim não está funcionando....

estou testando com o hyperterminal, mas nada acontece! :(

estou esquecendo de alguma coisa?!

Código: Selecionar todos
/**
 * @file $RCSfile: uart_int_brg.c,v $
* Copyright (c) 2004 Atmel.
* Please read file license.txt for copyright notice.
* @brief This file is an example to use uart with internal baud rate
*generator.
* UART will echo a received data.
* This file can be parsed by Doxygen for automatic documentation
 * generation.
 * Put here the functional description of this file within the software
 * architecture of your program.
* @version $Revision: 1.0 $ $Name:  $
 */
/* @section  I N C L U D E S */
#include "reg_c51.h"
char uart_data;
/**
 * FUNCTION_PURPOSE: This file set up uart in mode 1 (8 bits uart) with
 * internal baud rate generator.
 * FUNCTION_INPUTS: void
 * FUNCTION_OUTPUTS: void
 */
void main (void){
      CKCON0 = 0x7F;
    SCON = 0x50;  /* uart in mode 1 (8 bit), REN=1 */
      BDRCON &=0xEE;               /* BRR=0; SRC=0; */   
      BDRCON |=0x0E;               /* TBCK=1;RBCK=1; SPD=1 */
      BRL=0xFD;                    /* 9600 Bds at 11.059MHz */
     ES = 1;      /* Enable serial interrupt*/
    EA = 1;     /* Enable global interrupt */
      BDRCON |=0x10;               /* Baud rate generator run*/
   while(1);                    /* endless */
}
/**
 * FUNCTION_PURPOSE: serial interrupt, echo received data.
 * FUNCTION_INPUTS: P3.0(RXD) serial input
 * FUNCTION_OUTPUTS: P3.1(TXD) serial output
 */
void serial_IT(void) interrupt 4 {
   if (RI == 1){                 /* if reception occur */
        RI = 0;            /* clear reception flag for next reception */
        uart_data = SBUF;          /* Read receive data */
        SBUF = uart_data;         /* Send back same data on uart*/
   }
   else TI = 0;                  /* if emission occur */
                         /* clear emission flag for next emission*/
}



muito obrigado!
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor Ander_sil » 08 Out 2007 09:45

Voçe esta usando como interrupção, esta função eu testei e funciona,
testa ai.
Código: Selecionar todos
/*************************************************************************
   FUNCAO: int_serial()  Interrupção
   PARAMETROS: NENHUM
   RETORNO: NENHUM
   DESCRICAO:    Transmitir e receber dados pela serial, a recepção é
            armazenada em buffer.
**************************************************************************/
void int_serial(void) interrupt 4
{
static int ind;

  if (TI)                               // Se tem byte para ser enviado em txbuf
  {   
     TI = 0;                                // Zero o flag TI
   SBUF = txbuf;                          // Movo o byte de txbuf para o SBUF
   ES = 0;                                 // Desabilito a interrupção serial
   while(!TI);                              // Espero o byte ser transmitido
   TI = 0;                                // Zero o flag TI
   ES = 1;                                // Habilito a interrupção serial
  }
  if (RI)                                // Se chegou dado pela serial
  {   
     RI = 0;                                   // Zero o flag RI
     rxbuf = SBUF;                             // Movo o byte de SBUF para rxbuf
   Buffer[ind] =  rxbuf;                  // copio o dado para o buffer
                              
   if(Buffer[ind] == '\r' || ind == MAX_BUF)    // se byte recebido igual a \r ou ind = 15        
   {
      sizebuf = strlen(Buffer)-1;            // Pego o tamanho do Buffer menos 1, o \r         
      memcpy(Buf,Buffer,sizebuf);             // Copio o Buffer para o Buf
      memset(Buffer,0x00,strlen(Buffer));      // Limpo o Buffer todo
      FlagRx = 1;                        // Seto o flag de recepção
      ind = -1;                        // Zero o ind para da próxima vez escrever     
   }                                  // no inicio do Buffer
   ind++;                               // incremento o indice "ind"                  
  }
}


até+
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor B-EAGLE » 08 Out 2007 13:36

Ander, a configuração da uart, como vc fez? qual cristal usou?

valeu!
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor Ander_sil » 08 Out 2007 16:10

foi essa aqui.

chamo a função passando o baudrate como parametro.
Código: Selecionar todos

/*************************************************************************
   FUNCAO: CONFIGURA_SERIAL
   PARAMETROS: Numérico BAUDRATE
   RETORNO: NENHUM
   DESCRICAO: CONFIGURACAO DA PORTA SERIAL (BAUDRATE, 8N1) XTAL = 11.059200 MHz
**************************************************************************/

void configura_serial(int baud)
{
 /* Calculo da Velocidade
      TH1 = 256 - FATOR
      FATOR(BAUDRATE) = 2^SMOD*XTAL/(384*BAUDRATE)
      FATOR(BAUDRATE) = 57600/BAUDRATE
      FATOR(1200) = 48
      FATOR(2400) = 24
      FATOR(4800) = 12
      FATOR(9600) = 6 (PADRAO)
      FATOR(19200)= 3
      FATOR(57600)=1
 */
     int fator;
     switch(baud)
     {
           case 1200:
               fator = 48;
                break;
           case 2400:
               fator = 24;
                break;
           case 4800:
               fator = 12;
                break;
           case 9600:
               fator = 6;
                break;
         case 19200:
               fator = 3;
            break;
         case 57600:
               fator = 1;
            break;
           default:   fator = 6;
                      break;
     }                                                                             
                                                               
  ES    = 0;                   // Desabilita Interrupcao
  TR1    = 0;                      // Desliga timer 1
  TMOD    = (TMOD & 0x20) | 0x20;    // Modo 2 = Auto Reload de 8 bits
  TH1    = 256-fator;          // Carrega BAUDRATE default 9600 bps                            
  TL1   = TH1;                
  PCON    = 0x80;                    // SMOD = 1 -> Dobra baudrate
  SCON    = 0x50;                    // SM0 = 0 SM1 = 1 -> modo 1 de comunicacao
                                 // REN = 1 -> habilita a recepcao
  RI    = 0;                       // Comeca com flag de recepcao resetado
  TR1    = 1;                      // Liga o Timer 1
  ES    = 1;                // Habilita interrupcao da serial
}


até+
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor B-EAGLE » 09 Out 2007 18:54

consegui fazer funcionar, mas fiz diferente e com timer2... pra dar 57600 com 24mhz de cristal... preciso desta velocidade aqui... :(


o meu problema agora tá sendo as interrupções, porque estou utilizando tanto o SPI quanto a UART com interrupções ao mesmo tempo...
aí a UART passa a não funcionar, recebe pelo RX mas não dá nem sinal de vida no TX... :(
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor gabriel_paz » 11 Out 2007 10:01

Tome cuidado que no 89S8252, o endereço de interrupção é o mesmo para a serial e para o SPI, portanto a função de interrupção também é a mesma e nela você precisa verificar qual dos periféricos internos gerou a interrupção, por isso é muito importatne tomar muito cuidado com esses bits (TI, RI e SPFI; talvez algo desse tipo esteja acarretando a falha informada. Fora isso, não sei o que pode ser.

Gabriel
Avatar do usuário
gabriel_paz
Bit
 
Mensagens: 38
Registrado em: 11 Out 2006 21:48
Localização: São Paulo - Brasil

Mensagempor B-EAGLE » 16 Out 2007 00:03

pois é, eu estou verificando corretamente os flags RI, TI e SPIF, mas quando está o SPI e UART ligados, a transmissão do UART não funciona, mas eu recebo normalmente o dado pelo RX! :(
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor B-EAGLE » 22 Out 2007 18:05

pessoal, o problema é o seguinte:

no pino de TX, como ele vai ser saída, eu o colocava em nível baixo (costome oriundo dos PIC :P), antes da configuração da UART, aí não funcionava, os bits da comunicação SPI e da UART tem que estar em nível alto para poderem funcionar.

obrigado!!
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x