Controle Remoto - Coisa estranha....

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Controle Remoto - Coisa estranha....

Mensagempor jeanfernandes » 08 Jan 2008 03:26

Gente ou eu desaprendi ou tem um erro de software que eu não estou vendo.

Estou com duas interrupcoes (ext1, timer 0) funcionando, para ler um controle remoto. Ele está funcionando. Só que está acontecendo uma coisa estranha

a) quando eu detecto a borda de descida na ext1, eu desabilito a mesma e passo a ler o sinal do controle remoto com o timer 0.

b) depois que eu leio os 14 pulsos, eu dou um tempinho ( TE = 20 ms) e só ae eu habilito a EX1 de novo. O problema eh que depois desse tempo, mesmo sem borda de descida .....a p* age como se estivesse tido uma interrupção. Oras, se eu ja desabilitei na primeira descida, como é que ela está habilitada de novo antes de chegar novamente o sinal do controle remoto.

Fonte 1:

http://www.ustr.net/infrared/infrared1.shtml

Veja figura 7. Estou lendo a partir de 75% do pulso 1, e depois em intervalos de 1700 ms ....para pegar o bit na parte hachurada. Isso funciona legal.

Veja o que acontece no bagulho

http://br.geocities.com/jeanfernandes_eng/rc5-001.jpg
http://br.geocities.com/jeanfernandes_eng/rc5-002.jpg
http://br.geocities.com/jeanfernandes_eng/rc5-003.jpg

O sinal de cima eh o RC5
O sinal de baixo eh um flag que eu pulso toda vez que vou ler o bit do rc5 dentro do timer....para ilustrar melhor o que está havendo.

Código

Rotina de Interrupcao

Código: Selecionar todos
void int_externa(void) interrupt 2
{
   if (libera_rc5) {
         libera_rc5 = FALSE;
         EX1 = 0;
         ET0 = 0;
         TR0 = OFF;
         TL0 = (256-112); // 70 us off
         TR0 = ON;
         ET0 = 1;
         frame_rc5 = 0;
         tarefa_leitura_rc5 = 14;
         conta_padrao_rc5 = 3; // + 220 us
         tick_ajuste      = 0; // controle do time out
         frame_rc5_ok = FALSE;
         ajuste_relogio = TRUE;
         MCU_LSDAP = ON;
   }
}




Timer

Código: Selecionar todos
void int_timer0(void) interrupt 1
{

  // interrupcao a cada 110 us (aproximado)

   if (ajuste_relogio) {

      if (tarefa_leitura_rc5) {
         if (!--conta_padrao_rc5) {
            MCU_LSDAP = ~MCU_LSDAP;
            time_out_tecla = TEMPO_LIBERA_TECLA;
            conta_padrao_rc5 = TEMPO_RC5;
            tarefa_leitura_rc5--;
            if (!RC5_IN) frame_rc5 |= 0x0001;
            if (tarefa_leitura_rc5) {
               frame_rc5 <<= 1;
               frame_rc5 &= 0xFFFE;
            }
            else {
               frame_rc5_ok = TRUE;
               frame_rc5       &= 0x003f;
               time_out_tecla = TEMPO_LIBERA_TECLA;
            }
         }
      }
      else {
         if (!RC5_IN) {
            time_out_tecla = TEMPO_LIBERA_TECLA;
         }
         else {
            if (time_out_tecla) {
               if (!--time_out_tecla) {
                  libera_rc5 = ON;
                  EX1 = 1;
               }
            }
         }
      }

/*      if (time_out_tecla > 0) {
         time_out_tecla--;
         if (!time_out_tecla) {
            EX1 = ON;
            libera_rc5 = ON;      
         }
      }    */

      if (++tick_ajuste > (word)TEMPO_AJUSTE) {
         ajuste_relogio = FALSE;
         habilita_edicao_relogio = FALSE;
         libera_rc5 = TRUE;
         EX1 = ON;
      }

      if (modo_sdap)
//         MCU_LSDAP = ~MCU_LSDAP;
         app_ponto = 1 - app_ponto;

   }




Inicializacao

Código: Selecionar todos
   /*** TIMER 0 ***/

  ET0 = OFF;   // Desabilita a interrupcao do timer 0
  TR0 = OFF;   // desliga timer 0
  TMOD = (TMOD & 0xf0) | 0x02;  // 11110010
   TH0 = TL0 = (256 - 202); // 110 us

  ET0 = ON; // habilita a interrupcao do timer 0
  TR0 = ON; // liga timer 0

   /*** INTERRUPCAO EXTERNA 0 ***/
   EX1 = ON; // habilita interrupcao externa 1
   IT1 = ON; // interrupcao externa na trans. negativa do sinal   
   PX1 = ON; // prioridade na interrupcao externa




MCU = Atmel = AT89C51ED2, 22.1184 Mhz, bus = xtal/12

Vê se alguem descobre ae a mizera ehehehehhe
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor guest2003 » 08 Jan 2008 09:46

Pergunta rapida... (to sem o manuel na mao)

O flag de EXT-INT nao liga (sem gerar int) mesmo com a INT desabilitada ?

Não teria que limpar o flag antes de habilitar novamente ?

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor brasilma » 08 Jan 2008 12:10

Concordo com o Guest, dá um clear no flag antes de habilitar, se continuar acontecendo dai vc se preocupa.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor jeanfernandes » 08 Jan 2008 14:56

Srs.

O flag de interrupção externa para o atendimento dda mesma eh limpo
por hardware. Nao tentei fazer na marra. Talvez seja inócuo. Mas vou tentar. Mesmo colocando a mizera da int externa como prioridade. O que eu acho estranho é que eu ja desabilito a interrupcao e ela fica em off por pelo menos uns 40 ms. o tempo de leitura do rc5 + o time que eu dou la.

Nunca tinha visto isso.
Vou tentar por software, mas isso vai de encontro a teoria que voce precise limpar na marra. Vai entender eheheeheheh

É so para por uns recursos de brilho a mais e tive que mudar o jeito da coisa ser feita, pois vou precisar portar o codigo para mcus menores.

Com o controle remoto vou salvar o nivel de brilho na RAM do RTC eheheheeh. Coisa de cliente antigo enchendo o meu ja tao judiado saco.
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB


Voltar para 8051

Quem está online

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

cron

x