Autor Tema: Ayuda interrupciones RB4:7 CCS para pic 16f876  (Leído 6940 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado al9

  • PIC10
  • *
  • Mensajes: 16
Ayuda interrupciones RB4:7 CCS para pic 16f876
« en: 22 de Febrero de 2009, 21:26:00 »
Hola. A ver si me podeis echar una mano.
He empezado hace poco a programar con el CCS y todo ok, pero las interrupciones tengo problemas.

Estoy usando las interrupciones de cambio de puerto RB4:7 para leer un contador up/down (de estos que llevan los mouses de bolita), conectando en los puertos B3 y B4, de tal manera que sólo el 4 genera interrupción (ya lo he probado con el B4 y B5 y es un caos.). De esta manera el contador se incrementará o decrementará según el giro del sensor. La rutina de interrupcion es la siguiente:

Código: [Seleccionar]
#INT_RB        //Port B any change on B4-B7
void intportb(){
disable_interrupts(int_RB);
delay_ms(10);     //Antirebotes
      switch (input_b() & 0x18){    //contador entradas bit 3 y 4 (solo el 4 genera interrupcion)
      case 0x10: rotcounter++;
      delay_ms(100);     //Antirebotes
                  break;
      case 0x18: rotcounter--;
      delay_ms(100);     //Antirebotes
                  break;
      }
output_high(PIN_C0);        //led on (test)
enable_interrupts(int_RB);
}

.. Y esto no va, aparte que vuelve el programa inestable...

Las preguntas son:
1)¿ El CCS no hace nada para guardar los registros una vez entra en la interrupción? ¿que registros se recomienda guardar?
2)¿ Hace falta el enable/disable_interrupts? (no estoy seguro de que la siguiente interrupción "pise" a la anterior y desborde el buffer..)
3) He leido por ahi que es necesario leer el puerto. Bien eso lo hago, pero ¿para que sirve el bit RBIF? ¿por que no hay bits similares en otras interrupciones?

Llevo muchas horas con esta tonteria y no avanzo..
Gracias.

Desconectado al9

  • PIC10
  • *
  • Mensajes: 16
Re: Ayuda interrupciones RB4:7 CCS para pic 16f876
« Respuesta #1 en: 28 de Febrero de 2009, 21:54:36 »
Hola.
Bueno sigo con mis dudas, pero he averiguado algo... cuando salta la interrupción el programa se reinicia..  :shock: :shock: :shock:

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda interrupciones RB4:7 CCS para pic 16f876
« Respuesta #2 en: 28 de Febrero de 2009, 22:29:58 »
Haber...

estas interrupciones son algo especiales de tratar, en especial cuando usas pulsadores para este cato, porque el ruido por rebote es inevitable y difícil de tratar. Lo mejor que puedes hacer es seguir este hilo, ya se que no es tu caso seguramente, porque no utilizas un teclado matricial, pero lo que sirve es la idea del antirrebote y la exploración de las teclas, sean estas en teclado o pulsadores independientes

Respondiendo a tus preguntas:

1. No, el CCS no guarda ningún registro, así que cualquiera qeu sea de tu utilidad lo debes hacer manualmente tu, como la interrupción es por el nibble alto del puerto B, te recomiendo que guardes el valor del puerto para que despes de ver que se pulso hagas lo que corresponda

2. No hace falta.

3. Eso si hace falta, no es solo leerlo, es sobreescribir el valor leído en el puerto, yo lo hago de esta manera, puede ir al final de tu rutina de interrupción, o el mejor lugar que tu veas:

      output_b(input_b());
      clear_interrupt(int_rb); // RBIF = 0 limpia la bandera, quizá ya no haga falta, prueba quitándolo si funciona o no

El RBIF es la bandera de interrupción por variación de RB4-7, que se pone en uno cuando ocurre la interrupción, las otras interrupciones tienen sus banderas respectivas, que son por ejemplo T0IF que es del Timer0.

espero pueda servirte, un saludo
.


 

anything