travamento na int_rda 628a

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

travamento na int_rda 628a

Mensagempor merovirus » 08 Mar 2015 14:30

ola estou com um problema no meu código estou usando 2 pic16f628a um deles manda 8 caracteres o segundo captura estes caracteres e apos receber os 8 vai para a rotina principal aonde le os 8 carácteres verifica os dados e faz o que tem que fazer, o problema é que quando ele recebe os 8 dados eu desligo a int_rda na própria interrupcao para o programa poder tratar os dados no final quando mando ligar novamente nao consigo mais receber dados trava o pic. porque ?

cpp code
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)

#int_RDA
void RDA_isr(void)
{
if (dado[0]==getc()) // sincroniza //
{
for(z=1; z<8; z++)
{
dado[z]=getc(); // captura os 7 dados o primeiro é fixo //
if(z==8)
{
clear_interrupt(int_rda); // limpa int//
disable_interrupts(int_rda); // desliga int//
}
}
}
}

void main(void)
{

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);
trisa=0b00000000; // seta os tris do porte a //
trisb=0b00000010; // seta os tris do porte b //
porta=0x00; // seta os port do porte a //
portb=0x00; // seta os port do porte b //
dado[0]=0xAA;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*rotina principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(true)
{
if(dado[1]==0x4A && dado[2]==0x4C && dado[3]==0x4B && dado[4]+dado[5]==0x4F)
{
led=~led;
delay(40); // rotina que faz delay_cycles para dar 1seg //
enable_interrupts(int_rda); // apos isso o programa trava nao entrando novamente na interrupcao int_rda //
}
}
}


se eu nao desligo a interrupcao o programa nao trava recebendo e entrando no if em questao porem no codigo que eu vou fazer quero desligar para poder ter tempo de tratar corretamente os dados. agradeço qualquer ajuda uso o ccs
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor andre_luis » 08 Mar 2015 19:39

O problema é que voce está desabilitando a interrução de RDA após o bytes recebidos, mas a está reabilitando somente se uma determinada sequencia de caracteres for recebida. Ou seja, a interrução de serial será sempre desabilitada, mas só seria reabilitada se voce tivesse a sorte do pacote ter sido corretamente recebido.

A propósito, eu pessoalmente não faria assim; não gosto de ficar instanciando essas API´s do compilador, que deveriam ser usadaas apenas na inicialização, mas não sistematicamente na operação normal do programa; sugiro voce pensar em utilizar apenas um flag pra isso.
"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 » 08 Mar 2015 20:20

andre_teprom escreveu:O problema é que voce está desabilitando a interrução de RDA após o bytes recebidos, mas a está reabilitando somente se uma determinada sequencia de caracteres for recebida. Ou seja, a interrução de serial será sempre desabilitada, mas só seria reabilitada se voce tivesse a sorte do pacote ter sido corretamente recebido.

A propósito, eu pessoalmente não faria assim; não gosto de ficar instanciando essas API´s do compilador, que deveriam ser usadaas apenas na inicialização, mas não sistematicamente na operação normal do programa; sugiro voce pensar em utilizar apenas um flag pra isso.


ola Andre obrigado pela resposta, entendi oque você quis dizer realmente vai depender do recebimento correto, o que nem sempre acontece, resolvi isso desabilitando durante o tratamento, no caso quando é recebido um pacote valido e ligando apos a execução do codigo para nova captura de dados, mas voce poderia me dar um exemplo de uma flag para realizar o controle ? ou como você trataria os dados recebidos, não tenho experiencia com comunicação e não conheço os melhores métodos para o seu tratamento nem sei se o modo pelo qual estou capturando os dados é o apropriado, to apanhando na parte de comunicação. dês de ja agradeço.
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor andre_luis » 08 Mar 2015 22:07

merovirus escreveu:mas voce poderia me dar um exemplo de uma flag para realizar o controle ? ou como você trataria os dados recebidos, não tenho experiencia com comunicação e não conheço os melhores métodos para o seu tratamento nem sei se o modo pelo qual estou capturando os dados é o apropriado, to apanhando na parte de comunicação. dês de ja agradeço.


Voce mesmo pode criar essa flag, não é nenhum registrador do PIC.
Poderia ser uma variavel num formato charmesmo, já que seu programa tá bem enxuto.

Olha, não tenho nenhum exemplo mais simples que possa te ofereçer, mas dá uma olhada no código do PIC postado aqui, e limpa o excesso pra entender melhor: blog.php?action=view&article_id=17
"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 ze » 09 Mar 2015 08:58

algum preconceito contra o próprio forum ou contra MEUS artigos? Então sugiro não clicar aqui:
viewtopic.php?f=10&t=16492
Assumo parte da falha... devia estar no forum correto e título apropriado... Senti-vos a vontade em mover caso valha a pena
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: travamento na int_rda 628a

Mensagempor merovirus » 09 Mar 2015 12:32

andre_teprom escreveu:
merovirus escreveu:mas voce poderia me dar um exemplo de uma flag para realizar o controle ? ou como você trataria os dados recebidos, não tenho experiencia com comunicação e não conheço os melhores métodos para o seu tratamento nem sei se o modo pelo qual estou capturando os dados é o apropriado, to apanhando na parte de comunicação. dês de ja agradeço.


Voce mesmo pode criar essa flag, não é nenhum registrador do PIC.
Poderia ser uma variavel num formato charmesmo, já que seu programa tá bem enxuto.

Olha, não tenho nenhum exemplo mais simples que possa te ofereçer, mas dá uma olhada no código do PIC postado aqui, e limpa o excesso pra entender melhor: http://www.mcu.net.br/phpbb/blog.php?ac ... icle_id=17



obrigado novamente pela resposta, mas nao entendi o link que voce me mandou.
sera que alguem no forum nao teria um exemplo de recebimento e tratamento de dados via serial?
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor merovirus » 09 Mar 2015 12:33

ze escreveu:algum preconceito contra o próprio forum ou contra MEUS artigos? Então sugiro não clicar aqui:
http://www.asm51.eng.br/phpbb/viewtopic ... 10&t=16492
Assumo parte da falha... devia estar no forum correto e título apropriado... Senti-vos a vontade em mover caso valha a pena
abç



ola amigo nao entendi o que voce quis dizer com preconceito ?
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor ze » 09 Mar 2015 14:09

é.. acho que nem eu. Talvez algo como moderador preferir linkar algo externo ao invés do próprio forum.. ou algo assim. kk. E claro, não foi direcionado a VOCÊ. Mas num skenta não amigo. Não sigo padrões normais de comportamento mesmo. Mas me diz, tirou proveito daquilo? é que calou com "sera que alguem no forum nao teria um exemplo de recebimento e tratamento de dados via serial?"
Se precisar de algo + conte comigo 1...2...3...4....
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: travamento na int_rda 628a

Mensagempor merovirus » 09 Mar 2015 19:44

ze escreveu:é.. acho que nem eu. Talvez algo como moderador preferir linkar algo externo ao invés do próprio forum.. ou algo assim. kk. E claro, não foi direcionado a VOCÊ. Mas num skenta não amigo. Não sigo padrões normais de comportamento mesmo. Mas me diz, tirou proveito daquilo? é que calou com "sera que alguem no forum nao teria um exemplo de recebimento e tratamento de dados via serial?"
Se precisar de algo + conte comigo 1...2...3...4....


blz! entao li as materias mas nao consegui entender o funcionamento do mesmo, se voce ou alguem tivesse um exemplo de como recebe os dados e depois trata eles para usar no codigo principal eu agradeco, ou se puder me dizer a logica usada ex: criar um laço na int_rda para capturar os dados e na propria int tratalos enfim o diagrama da recepcao. para eu entender o conceito do procedimento de recepcao, embora eu consiga capturar os dados que eu estou mandando e ate de certa forma tratalos sei que nao é o melhor metodo ou mais eficiente gostaria de desenvolver um comunicacao confiavel, sabe. um problema que estou tendo é que apos a int_rda receber todos os dados e ir para o programa principal e comparar ele para ver se é valido e caso seja dentro do if da condicao na primeira linha eu mando desligar a int_rda depois segue meu comandos que para teste simplismente mando imprimir os dados recebidos e no fim mando religar a int_rda depois sai do if e segue o codigo e teoricamente com a int_rda ligada deveria entrar novamente no if porem isso nao acontece ele recebe os dados apenas uma vez e nao religa a interrupcao. e nao entendo o porque afinal eu mandei ligar, o colega acima disse que nao é uma boa ideia usar esses comandos para ligar e desligar a interrupcao que o melhor é criar uma flag mas eu nao sei como ela iria controlar o recebimento serial.

Código: Selecionar todos
 while(true)
      {
            if(dado[1]==0x4A && dado[2]==0x4C && dado[3]==0x4B && dado[4]+dado[5]==0x4F)
            {
               disable_interrupts(int_rda);
               led=~led;
               putc(dado[0]);
               putc(dado[1]);
               putc(dado[2]);
               putc(dado[3]);
               putc(dado[4]);
               putc(dado[5]);
               putc(dado[6]);
               putc(dado[7]);
              enable_interrupts(int_rda); 
            }
      }


e eu quero "desligar" a interrupção porque na primeira vez que eu fiz o codigo e fui testar como ha perdas de pacotes o codigo executava a rotina porem como ficava sem um pacote executava outra que seria em caso de ausência ou perda então o programa alternava entre essas duas condições se u desliga-se daria tempo para ele executar o código depois receber outro pacote pra ver se continua ou nao pelo que eu entendia a perda do pacote ocorre justamente por ele estar executando uma rotina se a rotina acaba com o recebimento na matade da esse bug
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor andre_luis » 09 Mar 2015 22:52

merovirus escreveu:entao li as materias mas nao consegui entender o funcionamento do mesmo, se voce ou alguem tivesse um exemplo de como recebe os dados e depois trata eles para usar no codigo principal


No arquivo que te indiquei, tem um programa em C feito no PIC16F e compilado no CCS.
A rotina de interrupção da serial está abaixo, e faz exatamente o que voce quer.

Repare que a cada byte recebido, os valores da serial é colocado em variaveis especificas.
No caso, o formado do pacote foi bem simples, sem sequer verificação de erro: Tinha de receber 3 caracteres '*' consecutivos para entender que se tratava de um inicio de pacote, e caso um deles fosse diferente disso, o contador "ContBytesRec " ressetava (=0), só retornando a receber após a proxima sequencia de '***'.

Quanto á desabilitar a interrupção, acho completamente desnecessário, basta apenas não fazer nada a cada novo recebimento.
Tomando como exemplo abaixo, poderia forçar a variável PodeAvaliar para FALSE que nenhum dado recebido seria carregado.

Código: Selecionar todos
#int_RDA
void RDA_isr( void )
{
if ( kbhit() )
   {
   DadoRecebido = getc()                                      ;
   if ( PodeAvaliar == NAO )
      {
      switch ( ContBytesRec )
         {
         case 0 :
              if( DadoRecebido  == '*')  ContBytesRec = 1      ;
                 else                    ContBytesRec = 0      ;
         break                                                 ;
         case 1 :
              if( DadoRecebido  == '*')  ContBytesRec = 2      ;
                 else                    ContBytesRec = 0      ;
         break                                                 ;
         case 2 :
              if( DadoRecebido  == '*')  ContBytesRec = 3      ;
                 else                    ContBytesRec = 0      ;
         break                                                 ;
         case 3 :
              ContBytesRec = 4                                 ;
              VerificaSeEhNumeroASCII()                        ;
              TamanhoString_RX  = ( DadoRecebido-'0' )*10      ;
         break                                                 ;
         case 4 :
              TamanhoString_RX +=   DadoRecebido-'0'           ;
              if ( TamanhoString_RX == 0 ) ContBytesRec = 0    ;
                 else                      ContBytesRec = 5    ;
              VerificaSeEhNumeroASCII()                        ;
              if ( TamanhoString_RX > TAMANHO_MAXIMO_TEXTO )
                 TamanhoString_RX = TAMANHO_MAXIMO_TEXTO       ;
         break                                                 ;
         case 5 :
              switch ( DadoRecebido )
                     {
                     case '0' : TemEfeito = NAO ; ContBytesRec = 6   ; break ;
                     case '1' : TemEfeito = SIM ; ContBytesRec = 6   ; break ;
                     case '2' :                   ContBytesRec = 100 ; break ;
                     default  : TemEfeito = NAO ; ContBytesRec = 0   ; break ;
                     }
         break                                                 ;
         case 6  :
         case 7  :
         case 8  :
         case 9  :
         case 10 :
         case 11 :
         case 12 :
         case 13 :
         case 14 :
         case 15 :
         case 16 :
         case 17 :
         case 18 :
         case 19 :
         case 20 :
         case 21 :
         case 22 :
         case 23 :
         case 24 :
         case 25 :
         case 26 :
         case 27 :
         case 28 :
         case 29 :
         case 30 :
         case 31 :
         case 32 :
         case 33 :
         case 34 :
         case 35 :
         case 36 :
         case 37 :
         case 38 :
         case 39 :
         case 40 :
         case 41 :
         case 42 :
         case 43 :
         case 44 :
         case 45 :
         case 46 :
         case 47 :
         case 48 :
         case 49 :
         case 50 :
         case 51 :
         case 52 :
         case 53 :
         case 54 :
         case 55 :
         case 56 :
         case 57 :
         case 58 :
         case 59 :
         case 60 :
         case 61 :
         case 62 :
         case 63 :
         case 64 :
         case 65 :
         case 66 :
         case 67 :
         case 68 :
         case 69 :
         case 70 :
         case 71 :
         case 72 :
         case 73 :
         case 74 :
         case 75 :
         case 76 :
         case 77 :
            if ( TemEfeito )
               {
               switch ( DadoRecebido )
                  {
                  case '0' : Efeitos1[ContBytesRec-6]  = 0    ; break ;
                  case '1' : Efeitos1[ContBytesRec-6] |= BIT0 ; break ;
                  }
               }
               else
               {
               StringToDisplay_RX[ContBytesRec-6] = DadoRecebido      ;
               }
            ContBytesRec++                                            ;
            if ( ContBytesRec > ( TamanhoString_RX + 5 ) )
               ContBytesRec = 78 ;
            VerificaSeEstaNoMapa()                                   ;
         break                                                        ;



         case 78 :
              ContBytesRec = 79                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_0   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_0   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 79 :
              ContBytesRec = 80                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_1   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_1   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 80 :
              ContBytesRec = 81                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_2   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_2   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 81 :
              ContBytesRec = 82                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_3   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_3   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 82 :
              ContBytesRec = 83                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if     ( DadoRecebido == '1' ) TextosValidos |= BIT_4   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_4   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 83 :
              ContBytesRec = 84                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_5   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_5   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 84 :
              ContBytesRec = 85                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_6   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_6   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 85 :
              ContBytesRec = 86                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_7   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_7   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 86 :
              ContBytesRec = 87                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_8   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_8   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 87 :
              ContBytesRec = 88                                   ;
              VerificaSeEhNumeroASCII()                           ;
              if      ( DadoRecebido == '1' ) TextosValidos |= BIT_9   ;
              else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_9   ;
              else ContBytesRec = 0                                   ;
         break                                                    ;
         case 88 :
              ContBytesRec = 89                                   ;
              VerificaSeEhNumeroASCII()                           ;
              IndiceTextoRecebido = DadoRecebido - '0'            ;
         break                                                    ;

         case 89 :
              if( DadoRecebido  == '*') ContBytesRec = 90     ;
                 else                   ContBytesRec = 0      ;
         break                                                ;
         case 90 :
              if( DadoRecebido  == '*') ContBytesRec = 91     ;
                 else                   ContBytesRec = 0      ;
         break                                                ;
         case 91 :
              ContBytesRec = 0                                ;
              PodeAvaliar =  SIM                              ;
         break                                                ;
         ////---------------------------------------------////
         case 100 :
              Hora_ds1307_digitos  = ( DadoRecebido-'0' )<<4   ;
              ContBytesRec = 101                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 101 :
              Hora_ds1307_digitos +=   DadoRecebido-'0'        ;
              ContBytesRec = 102                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 102 :
              Minuto_ds1307_digitos  = ( DadoRecebido-'0' )<<4 ;
              ContBytesRec = 103                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 103 :
              Minuto_ds1307_digitos +=   DadoRecebido-'0'      ;
              ContBytesRec = 104                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 104 :
              Dia_ds1307_digitos  = ( DadoRecebido-'0' )<<4    ;
              ContBytesRec = 105                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 105 :
              Dia_ds1307_digitos +=   DadoRecebido-'0'         ;
              ContBytesRec = 106                               ;
              VerificaSeEhNumeroASCII()                        ;
         break                                                 ;
         case 106 :
              Mes_ds1307_digitos  = ( DadoRecebido-'0' )<<4    ;
              ContBytesRec = 107                               ;
              VerificaSeEhNumeroASCII()                        ; 
         break                                                 ;
         case 107 :
              Mes_ds1307_digitos +=   DadoRecebido-'0'         ;
              ContBytesRec = 108                               ;
              VerificaSeEhNumeroASCII()                        ; 
         break                                                 ;
         case 108 :
              Ano_ds1307_digitos  = ( DadoRecebido-'0' )<<4    ;
              ContBytesRec = 109                               ;
              VerificaSeEhNumeroASCII()                        ; 
         break                                                 ;
         case 109 :
              Ano_ds1307_digitos +=   DadoRecebido-'0'         ;
              ContBytesRec = 110                               ;
              VerificaSeEhNumeroASCII()                        ; 
         break                                                 ;
         case 110 :
              Semana_ds1307_digitos  = DadoRecebido-'0'        ;
              ContBytesRec = 89                                ;
              VerificaSeEhNumeroASCII()                        ; 
              AlterouCronometro = SIM                          ;
         break                                                 ;

         default : ContBytesRec = 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 ze » 10 Mar 2015 09:35

olá amigo. acho que a explicação do bom amigo André,ficou bem claro. Pra vc ter uma idéia até EU entendi. No entanto como percebeste no meu tópico, não uso ccs portanto teremos dificuldade em nos alinhar. Mas a essência é simples: como mencionou o amigo teprom: [bytes "começadores"] + [dados propriamente ditos] + [(opcional: bytes terminadores)] Dúvidas? Duvido.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: travamento na int_rda 628a

Mensagempor merovirus » 10 Mar 2015 18:12

ze escreveu:olá amigo. acho que a explicação do bom amigo André,ficou bem claro. Pra vc ter uma idéia até EU entendi. No entanto como percebeste no meu tópico, não uso ccs portanto teremos dificuldade em nos alinhar. Mas a essência é simples: como mencionou o amigo teprom: [bytes "começadores"] + [dados propriamente ditos] + [(opcional: bytes terminadores)] Dúvidas? Duvido.
abç



blz foi fazer um teste usando o codigo acima e postarei os resultados obrigado pela ajuda de voces :D
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor merovirus » 14 Mar 2015 15:57

merovirus escreveu:
ze escreveu:olá amigo. acho que a explicação do bom amigo André,ficou bem claro. Pra vc ter uma idéia até EU entendi. No entanto como percebeste no meu tópico, não uso ccs portanto teremos dificuldade em nos alinhar. Mas a essência é simples: como mencionou o amigo teprom: [bytes "começadores"] + [dados propriamente ditos] + [(opcional: bytes terminadores)] Dúvidas? Duvido.
abç



blz foi fazer um teste usando o codigo acima e postarei os resultados obrigado pela ajuda de voces :D




funcionou em partes realmente nao desabilitar a interrupção é a melhor opção com base nisso fiz um novo código que desliga a interrupção por uma variável porem o único erro que deu no debug é que em caso de perda da comunicação o programa fica travado na interrupção por causa do comando dado[x]=getc(); que fica na espera de um dado serial tem como evitar isso ? porque a comunicação que eu vou realizar nao terá comunicação 100% do tempo. ele tem que detectar a falta de comunicacao.
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Re: travamento na int_rda 628a

Mensagempor andre_luis » 14 Mar 2015 18:02

Tem certeza que é no getc() e não no kbhit() ?
Em princípio, o compilador só deveria entrar no #int_RDA ao receber uma interrupção serial, ou seja, como mencionado anteriormente o kbhit() creio que pode estar redundante com o #int_RDA. Nesse caso, só como palpite, remove o if ( if ( kbhit() ) ) e vê se resolve.
"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 » 14 Mar 2015 22:09

merovirus escreveu:
andre_teprom escreveu:Tem certeza que é no getc() e não no kbhit() ?
Em princípio, o compilador só deveria entrar no #int_RDA ao receber uma interrupção serial, ou seja, como mencionado anteriormente o kbhit() creio que pode estar redundante com o #int_RDA. Nesse caso, só como palpite, remove o if ( if ( kbhit() ) ) e vê se resolve.



pior que é pelo getc(); ja havia removido o kbihit, veja o codigo da int.

Código: Selecionar todos
#int_RDA
void RDA_isr(void)
{
   if (dado[0]== 0xaa) // sincroniza //
   {
      if(rx==1)
      {
         for(z=1; z<8; z++)
         {
            dado[z]=getc();
         }
      }
     } 
}


ele trava se a comunicação for interrompida no meio do recebimento
merovirus
Bit
 
Mensagens: 11
Registrado em: 08 Mar 2015 14:05

Próximo

Voltar para PIC

Quem está online

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

x