Autor Tema: ayuda en codigo,interrupcion INT_RB  (Leído 5953 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
ayuda en codigo,interrupcion INT_RB
« en: 30 de Agosto de 2009, 15:46:48 »
Hola , bueno la idea del programa , es basicamente que realize 4 rutinas distintas dependiendo de que pin (B4-7) interrumpa, espero este todo bien configurado  :? . El pic es el 16f84.

He leido sobre interrupciones , se programar en c, pero en PIC soy bastante novato.. por eso quiero me digan en que me estoy equivocando en el codigo, porque estoy seguro que ahi esta el problema, y si puede ser un poco de informacion asi sigo aprendiendo gracias!

Aclaro que se que en las interrupciones hay q hacer rutinas rapidas , pero bueno si o si necesito que sean asi (no tan rapidas ja), espero se pueda sino haganmelo saber.

Hay 3 funciones ext(), s_delantero() y s_trasero() que son definidas por mi.. ahora no las adjunto pero si hace falta las subo.

Otra cosa mas, lo intente simular en proteus y me da un error que dice : Internal Exception: acces violation in module '<UNKNOWNN>'

No se si sera error del proteus (version 7.4 SP3) o el error realmente esta en el codigo. Igual me inclino a que sea error del codigo.


Ahi les dejo codigo, sin las funciones (uso CCS compiler):

Código: C
  1. #include <16f84.h>
  2. #FUSES NOWDT,XT,NOPUT,NOPROTECT              
  3.  
  4. #use delay(clock=4000000)
  5.  
  6. #use fixed_io (A_outputs=PIN_A0,PIN_A1,PIN_A4)
  7. #use fixed_io (B_outputs=PIN_B1,PIN_B2,PIN_B3)
  8.  
  9. // Los pines B4-7 estan puestos en 4 pulsadores, ¿ estaria bien que pregunte por el 1 ?
  10. // ¿o deberia saber, si o si, el estado anterior?
  11. // gracias
  12.  
  13. int ctrl=1; // defino variable global de control
  14.  
  15. #int_RB
  16. void RB_isr(){
  17. if(input(PIN_B6))output_high (ret);
  18. if(input(PIN_B7))ext();
  19. if(input(PIN_B4))s_delantero();
  20. if(input(PIN_B5))s_trasero();
  21. }
  22.  
  23. void main(){
  24.  
  25.    enable_interrupts(INT_RB);
  26.    enable_interrupts(GLOBAL);
  27.  
  28.    while(TRUE){
  29.       if(ctrl==1)output_high(PIN_A4); // prendo LED para saber si esta en SLEEP
  30.       if(ctrl==0)output_low(PIN_A4);              
  31.    }
  32.  
  33. }

Desde ya gracias, saludos a todos desde Cordoba, Argentina


EDIT: gracias por las respuestas , probe lo de agregar la instruccion , pero compilar , compila perfecto , pero cuando lo voy a simular no funciona.

Tira ese error el proteus.  En otro mensaje posteo el otro trozo de codigo
« Última modificación: 30 de Agosto de 2009, 16:37:20 por luigi.utn »

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #1 en: 30 de Agosto de 2009, 16:03:53 »
La variable ctrl no esta definida

¿ estaria bien que pregunte por el 1 ?

Si, esta bien, podes incluso dejarlo asi

Código: C
  1. if(input(PIN_B7)) ext();
@fabianjsm is on twitter

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #2 en: 30 de Agosto de 2009, 16:08:10 »
La variable ctrl no esta definida

¿ estaria bien que pregunte por el 1 ?

Si, esta bien, podes incluso dejarlo asi

Código: C
  1. if(input(PIN_B7)) ext();

La variable ctrl si la definí solo q no la puse en el codigo jaja, gracias ahora la agrego asi no hay dudas..

Gracias por el dato que puedo preguntar por el 1, y dejarlo sin el "==1" gracias por responder

Saludos!

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #3 en: 30 de Agosto de 2009, 16:15:59 »
Aparentemente no hay ningún error en esta parte de codigo, no queres adjuntarlo al post asi lo miramos?
@fabianjsm is on twitter

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #4 en: 30 de Agosto de 2009, 16:20:08 »
por datasheet, antes de  salir de la interrupcion por cambio de nibble, se debe realizar una lectura o escritura de PORTB.

saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #5 en: 30 de Agosto de 2009, 16:26:41 »
Exacto, ya no se si las últimas versiones solucionaron este bug, pero como indica aquí porcher CCS no realiza la escritura/lectura del puerto y hay que agregar:
Código: C
  1. #byte port_b=6
  2.  
  3. #int_RB
  4. void RB_isr(){
  5. .
  6. .
  7. .
  8. #asm movf port_b,0 #endasm   //Sin quitamos esta instrucción de relleno no funciona bien la interrupción
  9. }

Otra cosa sería agregar una demora de 20ms al ingresar a la interrupción para esperar que pase el efecto rebote de los pulsadores  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #6 en: 30 de Agosto de 2009, 16:30:49 »
La lectura del puerto ya se esta haciendo con el input!
Otro bug del CCS!
« Última modificación: 30 de Agosto de 2009, 16:38:44 por fabianjm »
@fabianjsm is on twitter

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #7 en: 30 de Agosto de 2009, 16:35:48 »
Yo siempre entro en la interrupción leyendo el estado completo del puerto B

Código: C#
  1. int8   estado_portb_actual;
  2.  
  3. #int_rb
  4. void handle_rb_int(){
  5.  
  6.    estado_portb_actual=input_b();
  7.  
  8.    ...
  9. }
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #8 en: 30 de Agosto de 2009, 16:41:16 »
Cada dia me sorprendo más con la velocidad con la que responden!
Esto parece un chat!
@fabianjsm is on twitter

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #9 en: 30 de Agosto de 2009, 16:42:06 »
Version del compilador de CCS 4.023 (osea anterior a la que habian probado el bug, asi que supongo que esta tambien lo tiene)

Probe haciendo lo que me dijeron pero sigue igual.. le posteo la parte de las funciones para ver si es ahi el problema desde ya gracias por ayudarme.

Código: C
  1. //----
  2. // esto lo agrego ahora porque es usado en las funciones para que se entienda un poco mejor
  3.  
  4. #define DC_izq PIN_A0
  5. #define DC_der PIN_A1
  6. #define fin1 PIN_A2
  7. #define fin2 PIN_A3
  8. #define av PIN_B1
  9. #define ret PIN_B2
  10. #define imanes PIN_B3
  11.  
  12. //---- Se que son bastante grandes las funciones pero necesito que hagan esto, si esto no es posible agradezco que me lo digan  asi pruebo de programarlo de otra manera.. gracias!
  13.  
  14. void ext(){
  15. output_low (av);
  16. output_low(ret);
  17. output_high(imanes);
  18. delay_ms(20);
  19. output_low(imanes);
  20. ctrl=1;
  21. }
  22.  
  23. void s_delantero(){
  24.     output_low(av);
  25.     output_high(DC_izq);
  26.     ctrl=0;
  27.     while (ctrl==0){
  28.       if(input(fin1)==1){
  29.          output_low(DC_izq);
  30.          ctrl=1;
  31.       }
  32.    }    
  33. output_high(ret);
  34. ctrl=0; // previene el sleep
  35. }
  36.  
  37. void s_trasero(){
  38.     output_low(ret);
  39.     output_high(DC_der);
  40.     ctrl=0;
  41.     while (ctrl==0){
  42.       if(input(fin2)==1){
  43.          output_low(DC_der);
  44.          ctrl=1;
  45.       }
  46.    }
  47. output_high(av);
  48. ctrl=0; // previene el sleep
  49. }

PD: Haciendo el debug con proteus, no me salta el error hasta que no llego a la linea donde habilito la interrupcion por RB4-7

Si a esta linea la borro, el programa funciona , pero obviamente mal ya que no tiene habilitadas las interrupciones.
Me parece raro, a alguien le paso algo parecido ?
« Última modificación: 30 de Agosto de 2009, 16:52:06 por luigi.utn »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #10 en: 30 de Agosto de 2009, 16:51:22 »
 :mrgreen: Exactamente cual es el problema? Le di una vista rápida al código y no veo problema  :?
No contesto mensajes privados, las consultas en el foro

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #11 en: 30 de Agosto de 2009, 16:56:42 »
:mrgreen: Exactamente cual es el problema? Le di una vista rápida al código y no veo problema  :?

El problema con la simulacion en proteus, ya que me da un error rarisimo. Me quedo un poco mas tranquilo en que la programacion esta "supuestamente" bien jaja.

Otra cosa yo de electronica se poco, estoy estudiando Ing. Electronica asi que estoy en proceso de aprendizaje pero me falta un poco, a lo mejor el circuito que arme esta mal, tengo compañeros que tienen una base ya que vienen de un tecnico, lo que me queda es que alguno de ellos me arme bien el circuito y se los suba aca para que vean..

Gracias por todo, este foro la verdad que tiene millones de cosas para que novatos como yo y no tan novatos aprendan y mucho. Asi que gracias a todos! (se encuentran pocos foros en los que todos se ayudan por eso agradezco y felicito tanto ;-))


Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #12 en: 30 de Agosto de 2009, 17:01:08 »
entonces sube el circuito y todos los archivos de simulacion ;-)
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #13 en: 30 de Agosto de 2009, 17:06:02 »
entonces sube el circuito y todos los archivos de simulacion ;-)

Aca adjunto el circuito que estoy usando ahora, seguramente tiene algo mal, mañana seguro en la facu se lo paso a algun compañero y lo arreglamos y de ultima lo subo bien.

De electronica pueden retarme todo lo que quieran ya que se poco.. jaja

gracias de nuevo por responder

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #14 en: 30 de Agosto de 2009, 21:24:28 »
bueno a ver si puedo esclarecer un poco jejejej.. debuggeando a fondo el programa note que cuando inicializa la simulacion, abre el *.COF (supuestamente) y no reconoce los #define , osea por ej el PIN_B0 no es reconocido y por lo tanto no sabe supuestamente a donde enviar los 5v, alguien sabe como solucionarlo o le paso???

Sino bueno me quedara ver de poder simularlo con algun otro programa..

Otra cosa que encontre es que llegando a la instruccion de enable_interrupts (INT_RB); la simulacion "muere" con el error que puse al principio del post.. pero debuggeando mas a fondo , encontre que realiza una instruccion en assembler que me parece no es correcta.. yo no se programar en assembler por eso recurro a alguien que pueda decir si esa instruccion es correcta

Todo esto lo adjunto en una imagen  :)

(Ya se que este subforo es para lenguaje C, pero como tiene que ver con el mismo problema lo posteo aca.. ya que los COF no son de assembler )

gracias de nuevo y disculpen si es molesto poner 2 mensajes seguidos
« Última modificación: 30 de Agosto de 2009, 21:26:29 por luigi.utn »


 

anything