Autor Tema: Interrupción por RB1  (Leído 5590 veces)

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

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Interrupción por RB1
« en: 26 de Diciembre de 2007, 21:02:27 »
Hola compañeros otra vez yo! :-/... Chamos está vez mi problema es con la interrupción en RB1... buscando y leyendo de internet y de ejemplos por ahi logre configurar despues de medio dia de busqueda, la interrupción por RB0, pero ahora la de RB1 no se como declararla!!! Por favor ayudenme, ya mis ojos ni mi cerebro me dan para ´más.... Gracias! Por cierto el lenguaje es C del CCS!!! es que como estoy nueva programando en este, se me hace demás de conflictivo... Aún mi cerebro piensa en asembler!!! :?

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Interrupción por RB1
« Respuesta #1 en: 26 de Diciembre de 2007, 21:14:16 »
Es importante saber de que tipo de PIC se trata ya que la serie 16F solo implementa como Interrupción Externa la de RB0, mientras que la mayoría de la serie 18F hace lo mismo con RB0, RB1 y RB2 y por lo tanto tienen tres interrupciones externas distintas.

En CCS C se tratan todas de la misma forma:

Código: C++
  1. enable_interrupt(int_ext);
  2. enable_interrupt(int_ext1);
  3. enable_interrupt(int_ext2);
  4.  
  5. disable_interrupt(int_ext);
  6. disable_interrupt(int_ext1);
  7. disable_interrupt(int_ext2);
  8.  
  9. ext_int_edge(0,H_TO_L);
  10. ext_int_edge(1,H_TO_L);
  11. ext_int_edge(2,H_TO_L);
  12.  
  13. #int_ext
  14. void interrupt_service_rutine_ext0(void){
  15. }
  16.  
  17. #int_ext1
  18. void interrupt_service_rutine_ext1(void){
  19. }
  20.  
  21. #int_ext2
  22. void interrupt_service_rutine_ext2(void){
  23. }

Pero como te digo esto es solo válido para los PIC 18F.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por RB1
« Respuesta #2 en: 26 de Diciembre de 2007, 23:20:45 »
Hola Redpic, gracias por tu aporte!!! la interrupción funcionó al pelo!!!! jejejeje :D... Aprovecho para preguntar, sabes que con RB0 utilice esto:
#INT_EXT
EXT_isr()
{
   output_d (0x00);                                 // Limpio el puerto d
   output_d(0x06);                                  // Mando el 1 al display
}

y Cuando intente hacerlo igual pero para RB1 no me funciono, porque sucede esto???

Otra pregunta... Nunca desabilito las interrupciones, y el programa funciona... pero cuando coloco la deshabilitación pues no funciona.... Porque?... No se supone que si no la deshabilito, pues el pic estaría interrumpido todo el tiempo???

Atte: Enigma... La llanerita de Guayana  :-/
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Interrupción por RB1
« Respuesta #3 en: 27 de Diciembre de 2007, 13:26:27 »
disculpa por entrometerme, es que me se la respuesta :mrgreen:

1. para RB1 debes usar:

#INT_EXT1
void handle_int_ext1()
{
    ... aca tu rutina
    ...
}

y para RB2: #INT_EXT2

esto de donde lo saque? de la libreria que el ccs trae incorporada para este micro (el 18f4550, creo es el que usas), esta en la carpeta donde instalaste, el programa en la carpeta DEVICES; ahi puedes ver algunas caracteristicas de configuracion del micro, y estan al final las interrpciones que el micro posee

2.
Citar
Nunca desabilito las interrupciones, y el programa funciona...
y eso es lo que deberia pasar, ya que estas diciendole al micro que detecte las interrupciones, cuando ocurran, y se ejecute tu rutina programada; ya que entonces por defecto quedan habilitados, (aunque es algo raro ya que en la hoja de datos dice que por defecto estan deshabilitados), seguramente los habilitaste en algun lado y ya despues no los tocaste

Citar
pero cuando coloco la deshabilitación pues no funciona.... Porque?
si lo deshabilitas, las interrupciones no funcionaran.

Citar
No se supone que si no la deshabilito, pues el pic estaría interrumpido todo el tiempo???
hay que tener esos detalles en ensamblador, pero en ccs, no hace falta deshabilitar el bit que indica que ha ocurrido la interrupcion (ya que cada interrupcion se indica con un bit en un registro, cambian a 1, indicando que ha ocurrido la interrupcion); porque el compilador hace ese trabajo

los enable_interrupts(int_ext1); y disable_interrupts(int_ext1); solo hacen que funcione o no la rutina que programes para una determinada interrupcion (ya que la parte de negrillas puede ser cualquier otra interrupcion, para habilitarla o no)

ademas deberas habilitar las interrupciones globales, esto para habilitar todas las interrupciones qeu usaras, esto se hace con: enable_interrupts(global);

entonces en tu main iria mas o menos asi, para interrupcion por RB1:

void main()
{
     ...
     ext_int_edge(1,H_TO_L);
     enable_interrupts(int_ext1);  // pero tb puedes habilitarla o deshabilitarla donde quieras, cuando sea necesario
     enable_interrupts(global);
     ...
     while(true)     // tu bucle de trabajo
     {
         ...
     }
}
y despues la rutina de interrupcion (tb puede ir antes del main, no hay problemas, ya que yo lo pongo donde sea, jeje :mrgreen:)
#INT_EXT1
void EXT_isr()
{...}

espero me haya dejado entender, y pues sino preguntas lo que no entendiste que te ayudamos :mrgreen:
un saludo.
« Última modificación: 27 de Diciembre de 2007, 13:33:42 por Cryn »
.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por RB1
« Respuesta #4 en: 27 de Diciembre de 2007, 14:11:55 »
Ahhh!! rayos vi la luz jejejeje :D... si todo quedo muy claro... a ver si entendi, el Ccs, se encarga de deshabilitar el bit que indica que hay una interrupción cuando su rutina haya culminado...? No es como en asembler que habia que deshabilitar la bandera de interrupción..?? y el disable_interrupt(int_ext); lo utilizo a mi conveniencia????  Es así??

Atte: Enigma... La llanerita de Guayana :lol:

No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Interrupción por RB1
« Respuesta #5 en: 27 de Diciembre de 2007, 14:36:38 »
exacto :mrgreen: es como tu dices :-)
.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Interrupción por RB1
« Respuesta #6 en: 27 de Diciembre de 2007, 15:01:57 »
Ehhh!!!! wiiiiii!!! :-/.... ahora si todo lindo, todo bello y muy claro también... Gracias Cryn!!!! :mrgreen:

Atte: Enigma... La llanerita de Guayana  :D
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Interrupción por RB1
« Respuesta #7 en: 27 de Diciembre de 2007, 15:32:11 »
 :D de nada, que bueno que lo entendiste muy bien :mrgreen:

siempre que se pueda :mrgreen:

.


 

anything