Conectar o pic ao mundo via serial

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Não consigo pensar num título melhor...

Mensagempor KrafT » 29 Jan 2015 23:36

Então, meu querido. Tem que dar uma atenção aos flags de erro do RCSTA.

Código: Selecionar todos
FERR: Framing Error bit
1 = Framing error (can be updated by reading RCREG register and receive next valid byte)
0 = No framing error
OERR: Overrun Error bit
1 = Overrun error (can be cleared by clearing bit CREN)
0 = No overrun error
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Não consigo pensar num título melhor...

Mensagempor ze » 30 Jan 2015 08:50

Agradeço a dica meu jovem. Apesar destes flags não estarem me incomodando, vou dar uma 'olhadinha' neles. Mas ...se puder/quiser me fale mais sobre eles... O que provoca sua aparição e tal. ok ... posso pesquisar mas ... cara .. to me sentindo tão... tão .... abandonado e solitário...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Não consigo pensar num título melhor...

Mensagempor Red Neck Guy » 30 Jan 2015 09:38

Meu, faz assim: Cria um programa que só trata a serial da forma que falei, faz ele funcionar 100% depois constrói o resto em cima.
É a forma mais simples.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Não consigo pensar num título melhor...

Mensagempor xultz » 30 Jan 2015 09:42

cara .. to me sentindo tão... tão .... abandonado e solitário...

Neste caso, o ideal é você entrar no Tinder.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Não consigo pensar num título melhor...

Mensagempor KrafT » 30 Jan 2015 10:39

Vem cá, meu lindo que te dou um abraço. :D

Seguinte... Você já testou a serial do teu PIC usando um PC e um software tipo Docklight? Tira a variável da balança da balança e testa com PC.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Não consigo pensar num título melhor...

Mensagempor andre_luis » 30 Jan 2015 11:21

ze escreveu:andre, concordo discordando. pra um pic com pouca memória, creia-me: if´s ocupam menos espaço. Passei por isso quando num projeto um mc de 1k ocupou 1022 bytes


Entendo, mas é que achei pela descrição do problema no 1º tópico, que a principal questão aí fosse a velocidade.

Não sei bem como o compilador trata os IF e os SWITCH, mas no primeiro caso teria de avaliar todos os IFs anteriores para somente então chegar no último, enquanto que no SWITCH, em princípio cada CASE já poderia ser acionada diretamente sem necessidade de avaliação dos CASE anteriores, praticamente como se usando um comando JUMP em assembly - creio. Tá certo que na velocidade de Clock de uns 20MHz, essa discussão pode parecer tola, mas ainda assim acho que isso pode ser mais um fator para limitar a taxa máxima de Baud Rate da serial do uC, em casos como esse, onde o frame do pacote possui muitos bytes para serem avaliados.

Segue abaixo um trexo de uma função de tratamento da recepção da serial que fiz para o PIC16F:

Código: Selecionar todos
#int_RDA
void RDA_isr( void )
{
output_bit ( PIN_A1 , HIGH )                              ;

if ( kbhit() )
   {
   DadoRecebido = getc()                                      ;
   if ( PodeAvaliar == NAO )
      {
      switch ( ContBytesRec )
         {
         case 0 :
              if( DadoRecebido  == 'S')  ContBytesRec = 1      ;
                 else                    ContBytesRec = 0      ;
         break                                                 ;
         case 1 :
              if( DadoRecebido  == 'T')  ContBytesRec = 2      ;
                 else                    ContBytesRec = 0      ;
         break                                                 ;
         case 2 :
              if( DadoRecebido  == 'X')  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 :
         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                                                    ;

        default : ContBytesRec = 0                            ;
         }
      }
   }
}


Ok, tem coisas que fiz aí que não são uma boa-pratica ao se colocar dentro do vetor de interrupçao, mas o foco é mostrar a estrutura como um todo pro tratamento da recepção usando o SWITCH ao invez dos IFs aninhados.
"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: Não consigo pensar num título melhor...

Mensagempor ze » 02 Fev 2015 15:29

-andré ... agradeço o comentário e a ideia. muitio lôca aquela sequencia de cases...
-kraft ... só um abraço? bá! tenho medo de gostar. Está conectando direitinho (pc<-->balança). Isto é, segundo a pessoa que está com o produto final
-xults ... não conheço e não quero googlar isso ok?
-aquino ... ok. Tive sucesso (ainda continua parcial. Não testado na prática) com a máquina abaixo. mérito ao amigo xuts.

Enfim...
Dei a melhorada visual recomendada. Tive que manter um return estratégico. Fica aí pra quem interessar possa. Provavelmente ninguém, mas fiz a minha parte. Considere como pagamento.
Por gentileza, permaneça na escuta pois a qualquer momento devo pedir vossa orientação em um tema qualquer. p.ex. qual o sentido da vida, qual a origem, destino e definição do universo ou algo assim. Mais uma vez, muito agradecido!
câmbio... desligo

Código: Selecionar todos
if (RCIF)
   {
   if (RCREG==_stx) estado=1; //Quando entrar na ISR da serial, verifica se o recebido é STX. Se sim, muda pra 1
   if (contador==17)    {estado=2;contador=0;return;} //Se contador chegar a 17 bytes - que recebe mas ignora - muda estado pra 2 e zera contador.
   switch (estado)
      {
      case 1: contador++; break;
      case 2: buffer[0]=RCREG;estado=3;break;
      case 3: buffer[1]=RCREG;estado=4;break;
      case 4: buffer[2]=RCREG;estado=5;break;
      case 5: buffer[3]=RCREG;estado=6;break;
      case 6: buffer[4]=RCREG;estado=7;break;
      case 7: if (RCREG==_etx) ////confere se recebeu um ETX no 24º byte. Se sim,
                     {
                     flag_serial=1; //seta uma variável global flag_serial,
                     estado=0;//e muda estado para zero
                     contador=0;
                     }
               contador++;if (contador>2) {estado=contador=0;}//Se não recebeu ETX no 24º byte (25 contando com zero), muda estado pra zero e não seta flag_serial
               break;
      }
   }
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Não consigo pensar num título melhor...

Mensagempor Red Neck Guy » 02 Fev 2015 16:06

Eu já fiz uma plaquinha com 89S8252 que comunciava com uma balança e escrevia o peso em um display gigante.
No meu caso, o único problema que tive foi não lembrar que havia a prioridade da serial - aqueles flags do 8051 que eu nem lembro dos nomes e local.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Anterior

Voltar para PIC

Quem está online

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

x