travamento na int_rda 628a

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: travamento na int_rda 628a

Mensagempor andre_luis » 14 Mar 2015 22:11

Mas esse erro ocorre apenas na simulação ou rodando gravado na placa também ?
No meu tempo, simulação de interrupção não era algo nada confiável.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: travamento na int_rda 628a

Mensagempor merovirus » 15 Mar 2015 15:23

ele trava se a comunicação for interrompida no meio do recebimento, já estou ficando frustrado com isso tudo que eu preciso é receber 8 bytes alocar eles em uma matriz para o programa principal verificar os dados e executar o código cabível e caso não haja recebimento de dados ou ele sejam interrompidos no meio ele sinalizar isso, saber que a comunicação falhou, puxa vida que zica.ja tentei usar as flag do registrador rcsta bit.2 que indica falha na comunicacao mas sem sucesso to sem ideias.
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor andre_luis » 15 Mar 2015 16:26

Calma, não entra em panico !
Tem um erro na sua função que não detectamos antes...

cpp code
for(z=1; z<8; z++)
{
dado[z]=getc();
}

Repare que dentro do vetor de interrução, voce colocou um loop que tenta ler 8 vezes o buffer da serial, mas a função getc() só irá funcionar na primeira vez, e permanecerá no loop indefinidamente, pois somente receberá uma proxima interrupção se sair do #INT RDA, o que não vai acontecer, por estar no estado de espera dessa função. Diferente da que apresentei antes, voce não usa o switch-case, mas o for.

Mantendo o seu programa original, poderia fazer a seguinte alteração:

cpp code
// no programa principal, declara z como variavel global, e inicializa com valor zero
int z = 0 ;
// na interrupçao, substitui o "for" pelo "if"
if (z<8)
{
dado[z++]=getc();
}
else z = 0 ;
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: travamento na int_rda 628a

Mensagempor merovirus » 15 Mar 2015 16:44

realmente ate esqueci de mencionar isso eu havia deduzido que o for poderia estar causando o problema entao o removi e realmente pus um if porem também travava ae eu desconfiei do compilador achei que ele tava loco ,e deletei tudo e comecei do zero ate agora ta funfando ! nao ficando travado na interrupção, realmente acho que na vida real teria funcionado a simulação nao é 100% para resolver a questão da perda da comunicação, fiz assim, como agora ele nao trava na int eu coloquei um contador caso nenhuma das opções fosse atendida ele a zera, caso ela estoure ele sinaliza a perda da comunicação vou postar o codigo a seguir. mas esse nao é o código real é so o teste que fiz como disse fiquei frustrado e deletei tudo.:twisted: obrigado pela ajuda e paciência amigo vou refazer o código e ver se desta vez funciona tudo ! :D
Código: Selecionar todos
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)
#use rs232(baud=1200,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
#byte porta =0x05
#byte portb =0x06
#byte trisa =0x85
#byte trisb =0x86
#byte pir1  =0x0c
#bit  recebeu = pir1.5
#bit led=porta.1
char dado[9];
int x=1;
int conta=0;
#int_RDA
void  RDA_isr(void)
{
      if(recebeu==1)
      {
         if(dado[0]==0XAA)
         {
            dado[x]=getc();
            x++;
            if(x==8)
            {
             
               x=1;
            }
         }   
      }
}

void limpa (void)
{
   dado[4]=0x00;
}

void main()
{

   port_b_pullups(TRUE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   porta=0x00;
   portb=0x00;
   trisa=0b00000000;
   trisb=0b11111010;
   dado[0]=0XAA;

  while(true)
  {
      if(dado[1]==0x4A && dado[2]==0x4C && dado[3]==0x4B && dado[4]+dado[5]==0x4F)
      {
         led=1;
        conta=0;
         recebeu=0;
       
      }
     if(dado[1]==0x4B && dado[2]==0x4C && dado[3]==0x4A && dado[4]+dado[5]==0x40)
      {
         led=0;
       conta=0;
         recebeu=0;
      }
      else
      {
      conta++;
      delay_ms(100);
         if(conta==100)
         {
            while(true)
            {
         led=~led;
         }
         }
      }


  }

}
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor merovirus » 16 Mar 2015 00:20

merovirus escreveu:realmente ate esqueci de mencionar isso eu havia deduzido que o for poderia estar causando o problema entao o removi e realmente pus um if porem também travava ae eu desconfiei do compilador achei que ele tava loco ,e deletei tudo e comecei do zero ate agora ta funfando ! nao ficando travado na interrupção, realmente acho que na vida real teria funcionado a simulação nao é 100% para resolver a questão da perda da comunicação, fiz assim, como agora ele nao trava na int eu coloquei um contador caso nenhuma das opções fosse atendida ele a zera, caso ela estoure ele sinaliza a perda da comunicação vou postar o codigo a seguir. mas esse nao é o código real é so o teste que fiz como disse fiquei frustrado e deletei tudo.:twisted: obrigado pela ajuda e paciência amigo vou refazer o código e ver se desta vez funciona tudo ! :D
Código: Selecionar todos
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)
#use rs232(baud=1200,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
#byte porta =0x05
#byte portb =0x06
#byte trisa =0x85
#byte trisb =0x86
#byte pir1  =0x0c
#bit  recebeu = pir1.5
#bit led=porta.1
char dado[9];
int x=1;
int conta=0;
#int_RDA
void  RDA_isr(void)
{
      if(recebeu==1)
      {
         if(dado[0]==0XAA)
         {
            dado[x]=getc();
            x++;
            if(x==8)
            {
             
               x=1;
            }
         }   
      }
}

void limpa (void)
{
   dado[4]=0x00;
}

void main()
{

   port_b_pullups(TRUE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   porta=0x00;
   portb=0x00;
   trisa=0b00000000;
   trisb=0b11111010;
   dado[0]=0XAA;

  while(true)
  {
      if(dado[1]==0x4A && dado[2]==0x4C && dado[3]==0x4B && dado[4]+dado[5]==0x4F)
      {
         led=1;
        conta=0;
         recebeu=0;
       
      }
     if(dado[1]==0x4B && dado[2]==0x4C && dado[3]==0x4A && dado[4]+dado[5]==0x40)
      {
         led=0;
       conta=0;
         recebeu=0;
      }
      else
      {
      conta++;
      delay_ms(100);
         if(conta==100)
         {
            while(true)
            {
         led=~led;
         }
         }
      }


  }

}


refiz o código e agora funcionou 100% tive apenas um pequeno problema em uma determinada parte mas o erro era causado pela velocidade de baud rate aonde estava usando 9600 para um clock interno de 4mhz reduzi a velocidade para 1200 e o pic teve o tempo que precisava para ler todo o código. o erro que dava era la no fim do Código hora ele entendia a recepção hora nao acredito que seja devido a velocidade pois como estava muito rápida o pic nao consegui pegar os dados me corrija se eu estiver errado! mais funcionou obrigado mais uma vez pela ajuda e paciência de voces principalmente o Andre, valeu mesmo :wink: e no que eu puder ajudar vou contribuir no fórum! falou.
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Anterior

Voltar para PIC

Quem está online

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

x