Problemas com RS232 + 16F876 + get_string

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor __JEREK__ » 01 Nov 2006 12:07

Jorge_Francisco escreveu:Acho que não resolve,seu problema deve estar em algum ruido,sei lá.Mais tarde escrevo um programa aqui!!!


Jorge, tambem acho que o problema só pode ser de hardware, não é possível uma coisa dessas!! vou ter de comprar um max232 e cristal pois o que estou testando esta em uma placa de programação, ai já viu, tem de vir de Sampa para o interior da Bahia se não for por sedex demora uns 15 dias...

outra coisa, as letras do seu post estão truncadas, tipo a palavra não esta aparecendo pra mim como "nã£o" entre outras, não sei se já percebeu isso.

se puder disponibilizar algo bem simples para rs232 com pic16f876 que vc tenha certeza que funcina seria um bom teste para saber se estou com problema de hardware aqui. Mas vou providenciar novos CI's para teste.

Valeu jorge, grande abraço!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor __JEREK__ » 01 Nov 2006 13:30

Achei no livro de Fábio a referência sobre RESTART_CAUSE, e pelo exemplo do CCS (ex_wdt.c) fiz a seguinte implementação no código.

Código: Selecionar todos
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
//#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

short int conta=0;

void main()
{

char teste='@';


///////////////////////////////////////////// NOVO CÓDIGO DE ERRO IMPLEMENTADO
   switch ( restart_cause() )
   {
      case WDT_TIMEOUT:
      {
         printf("\r\nWDT_TIMEOUT\r\n");
         break;
      }
   
   case WDT_FROM_SLEEP:
   {
         printf("\r\nWDT_FROM_SLEEP!\r\n");
         break;   
   }


      case NORMAL_POWER_UP:
      {
         printf("\r\nNORMAL_POWER_UP\r\n");
         break;
      }

//   case BROWNOUT_RESTART:
   case MCLR_FROM_SLEEP:
   {
         printf("\r\nMCLR_FROM_SLEEP\r\n");
         break;   
   }
   }

///////////////////////////////////////////// FIM DO NOVO CÓDIGO DE ERRO IMPLEMENTADO   

   
   printf("\n\r+------------------------------------------------------------------+");
   printf("\n\rTeste de RS232 N003");

   do {
        printf("\r\nValor atual: %c\r\n",teste);
      delay_ms(5);
          printf("\n\rAperte uma letra: ");
   
      teste = getc();
   
      delay_ms(5);
          printf("\r\nA letra foi %c\r\n",teste);
      delay_ms(5);
   
     } while(1);
}


essa função RESTART_CAUSE retorna o motivo pelo qual o pic foi re-iniciado. Gravei no PIC e o que retornou foi NORMAL_POWER_UP que pelo livro de Fábio significa reset normal apos ligar o chip.

só não consegui colocar BROWNOUT_RESTART no switch case, pois o compilador dá erro. Será que poderia ser um problema de fonte o reset do PIC???
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor otavio luiz » 04 Nov 2006 07:58

Esperai ai, a placa que voce esta usando não é uma daquelas padrão com proto board, o gravador não é nela mesmo? Voce esta desligando o cabo de programação quando vai testar o programa, pode ser sujeira que o micro esta mandando pela porta que voce faz a gravação, tentou fazer isso?
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Mensagempor __JEREK__ » 04 Nov 2006 08:17

Bom dia Otávio, a placa que estou usando é um dessas que ja vem com o programador. Olha a figura:

Imagem

Ela tem uma chave que vc desliga o RX TX para as portas C6 e C7 do PIC mas eu acho que só pode ser a placa mesmo, tanto que já comprei um CI MAX232 + cristal e "otras cositas mas" pra fazer teste fora da placa, em um protoboard.

O problema é o seguinte, quando vem da placa para o micro a informação fica correta, escreve tudo certo.

quando eu tento mandar do teclado para o PIC o pic parece estar resetando, pois aparece a mensagem inicial fora do primeiro loop.

eu acho que só pode ser a placa, não vi ninguem reclamar muito de rs232, eu acho não deveria estar tendo tanto problema.

Valeu Otávio, grande abraço!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor otavio luiz » 04 Nov 2006 08:57

Então vamos ao meu raciocinio, a chave prog. só muda o rx tx, quer dizer voce grava pela propria serial, mas os controles isto é vpp e vcc não são desligados, esperimente fazer um adaptador que quando voce for testar a comunicação fique ligado só os fios 2, 3 e 5 do db9 respectivamente rx tx e terra assim voce vai estar eliminando vpp e vdd que pode estar causando o reset mais precisamente o vpp que vai diretamente no pino MCLR do pic.
Leia a mensagem pvt que te enviei.
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Mensagempor __JEREK__ » 04 Nov 2006 10:32

Acho que com essa placa não vou conseguir fazer isso, dá uma olhada no esquema:

Imagem

ai esta PARTE do esquema da placa, não coloquei o o esquema completo você sabe porque...

bom, ai vc pode ver uma ligação do pino para o max232 e outras ligações, acho que o sinal do max232 chaga no pic depois de CI CD4053, pode ser por isso, não sei se vou conseguir fazer uma ligação direta do max232 para o PIC. Você acha que essa ligação do DB9 esta correta??


Veja se chegou mensagem pra vc em pvt ai, valeu pela idéia!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor __JEREK__ » 05 Nov 2006 10:18

Hei otavio, vc estava certo. era hardware, fiz o que você falou, retirei o MAX232 da placa (ele fica em um soquete) e coloquie em um protoboard, catei uns capacitores de 10uf e fiz um cabo ligando os pinos que vc falou e o programa funcionou corretamente sem resetar!!!

o esquema de ligação que eu usei foi esse:
Imagem

e o resultado foi esse:
Imagem

Fiz o modelo no proteus e coloquei no arquivo para que se alguem quiser fazer o download, o arquivo esta com o fonte em C.

Download:
http://www.4shared.com/file/5465987/3b37320/rs23216f628aget_string.html

Arquivo de teste no proteus:
Imagem

+-----------------------------------------------------------------------------------------+

só mais uma coisa, a função get_string original espera vc apertar <ENTER> para poder mostrar o resultado, fiz uma alteração no código para que se vc chegar ao limite de letras ele mostre o resultado, se vc quizer que ele só mostre se for apertado <ENTER> é só retirar o Break.


Código: Selecionar todos
#include <16F628a.H>
#pragma fuses HS,NOWDT,NOPROTECT,NOLVP
#pragma use delay(clock=4000000)
#pragma use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)
#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP

//#include <input.c>   // a função original get_string esta nesse arquivo

char x[8];   // string de caracteres que pode acumular no máximo 7 digitos
      // para alterar a quantidade é só mudar esse valor

void get_string(char* s, int max)
{
   int len;
   char c;
   --max;
   len=0;

   do {

   c=getc();

     if(c==8)                // Se apertar Backspace volta uma tecla
     {
        if(len>0)
        {
          len--;
          putc(c);
          putc(' ');
          putc(c);
        }
     } else if ((c>=' ')&&(c<='~'))   // não digitar caracteres
       if(len<max)
       {
         s[len++]=c;
         putc(c);
       }

   if(len==max)         // MELHORIA NO CÓDIGO
   {               // Sem esse BREAK o programa espera vc apertar
      Break;         // a tecla ENTER para sair
   }

   } while(c!=13);
   s[len]=0;

}

void main()
{
   printf("\n\r+------------------------------------------------------------------+");
   printf("\n\rTeste de RS232 GET_STRING");
   printf("\n\r+------------------------------------------------------------------+");
   printf("\n\rDigite uma palavra 7 digitos ou aperter <ENTER>: ");
   do {
      get_string(x,8);   // X é a string de caracteres
               // 8 é a quantidade de caracteres definido na string de caracteres

             printf("\r\nA palavra digitada foi %s\r\n",x);
         printf("\n\rDigite outra palavra 7 digitos ou aperter <ENTER>: ");

   } while(1);
}


Valeu galera, muito obrigado Anderson, Andre, Jorge e Otavio Luiz por me ajudaram nesse post!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor otavio luiz » 06 Nov 2006 07:35

Tamos ai né. Pra voce ver que um detalhe pequeno faz a gente perder cabelos e dias fuçando no negócio.
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Anterior

Voltar para PIC

Quem está online

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

x