TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: luigi.utn en 30 de Agosto de 2009, 15:46:48

Título: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: fabianjsm 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();
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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!
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: fabianjsm 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?
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: jhozate 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
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: Suky en 30 de Agosto de 2009, 16:26:41
Exacto, ya no se si las últimas versiones solucionaron este bug, pero como indica aquí  (http://www.todopic.com.ar/foros/index.php?topic=21226.0)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!
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: fabianjsm en 30 de Agosto de 2009, 16:30:49
La lectura del puerto ya se esta haciendo con el input!
Otro bug del CCS!
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: RedPic 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. }
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: fabianjsm 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!
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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 ?
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: Suky 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  :?
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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 ;-))

Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: jhozate en 30 de Agosto de 2009, 17:01:08
entonces sube el circuito y todos los archivos de simulacion ;-)
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn 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
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: yopepe en 31 de Agosto de 2009, 01:42:45
Hola luigi. Te comento un poco lo que hice, primero que nada, en el archivo del proteus que nos pasaste tenia asociado un archivo main.c que no se para que lo usarias, pero me limite a borrar la referencia para que me dejara continuar la simulación porque no esta entre los archivos que pusiste y sino me tiraba que no lo encontraba. Luego tome tu codigo fuente (bot.c) y lo volvi a compilar comentando las lineas:

Código: [Seleccionar]
#use fixed_io (A_outputs=PIN_A0,PIN_A1,PIN_A4) // agrego A4 como led q simula el sleep
#use fixed_io (B_outputs=PIN_B1,PIN_B2,PIN_B3)

para eliminar un warning del proteus sobre una función obsoleta, de todas formas no modifica nada el funcionamiento del programa, solo define la forma en que el compilador trata los puertos.

Puse el .COF en el circuito del proteus 7.4 sp3 y la simulación corre perfectamente, cero errores. Tocando los pulsadores giran los motores y eso, pero no fui más allá verificando si el comportamiento es el correcto o si el código hace lo que pretendes que haga (la verdad no me fije que es ni que hace, no es de mala gana, es que es la 1:55 AM  :D, solo probé si la simulación andaba o no). En definitiva, creo que tenes un problema con tu proteus. Te dejo los archivos que compilé yo para que los pruebes a ver que pasa. Cualquier duda nos consultas y en caso de ser necesario le pegaré una mirada más profunda al código, pero mañana más descansado  :D

Saludos y suerte.
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn en 31 de Agosto de 2009, 17:11:43
Hola luigi. Te comento un poco lo que hice, primero que nada, en el archivo del proteus que nos pasaste tenia asociado un archivo main.c que no se para que lo usarias, pero me limite a borrar la referencia para que me dejara continuar la simulación porque no esta entre los archivos que pusiste y sino me tiraba que no lo encontraba. Luego tome tu codigo fuente (bot.c) y lo volvi a compilar comentando las lineas:

Código: [Seleccionar]
#use fixed_io (A_outputs=PIN_A0,PIN_A1,PIN_A4) // agrego A4 como led q simula el sleep
#use fixed_io (B_outputs=PIN_B1,PIN_B2,PIN_B3)

para eliminar un warning del proteus sobre una función obsoleta, de todas formas no modifica nada el funcionamiento del programa, solo define la forma en que el compilador trata los puertos.

Puse el .COF en el circuito del proteus 7.4 sp3 y la simulación corre perfectamente, cero errores. Tocando los pulsadores giran los motores y eso, pero no fui más allá verificando si el comportamiento es el correcto o si el código hace lo que pretendes que haga (la verdad no me fije que es ni que hace, no es de mala gana, es que es la 1:55 AM  :D, solo probé si la simulación andaba o no). En definitiva, creo que tenes un problema con tu proteus. Te dejo los archivos que compilé yo para que los pruebes a ver que pasa. Cualquier duda nos consultas y en caso de ser necesario le pegaré una mirada más profunda al código, pero mañana más descansado  :D

Saludos y suerte.

Primero muchas gracias por tomarte la molestia de revisarlo, saque esas sentencias y sigue igual jajaj..

Con tu COF funciona perfecto.. pero no realiza lo que yo quiero que haga.. q compilador usaste ??

Gracias de nuevo por tomarte el laburo..

saludos!

PD: edite porque me habia expresado re mal..
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: yopepe en 31 de Agosto de 2009, 18:06:51
No hay drama, para eso estamos acá, pero bueno, ahora podemos encarar mejor el problema. Lo que si sería útil es que des una descripción de que es lo que debería hacer el programa en cada situación para poder ver porque puede no estar funcionar como vos necesitas. Te comento esto porque por lo que vi en el esquemático y en el programa me parece que tenes un problema con la convención de signos, es decir, fijate que cuando entrás a la rutina de interrupción por cambio en el puerto B preguntas cuales de los pines están en uno supuestamente para saber cual apretaste y en el esquemático están todos los pines de los pulsadores a 1 (tienen las resistencias esas de pull-up a VCC) menos el que apretas, es decir, "activas con cero", por lo que me parece que deberías preguntar por cual es igual a cero en lugar de cual es igual a uno. No se si esto lo hiciste a proposito o no, o si estoy viendo mal algo, por eso te decia lo de más arriba de explicar un poco. Otra cosa, veo además que "aparentemente" estás utilizando la interrupción de RB0, pero la tenés mal implementada, osea, la pusiste dentro de la rutina de atención por cambio en el puerto B junto con las otras y no se hace así, se declara aparte de la siguiente forma:

Código: [Seleccionar]
#int_EXT
EXT_isr()
{
//acá va tu código para la interrupción por RB0
}

y en el main tenés que habilitarla con lo siguiente:

Código: [Seleccionar]
enable_interrupts(INT_EXT);
Pegale una mirada y cualquier cosa consulta nomás, lo que si acordate de la descripción del funcionamiento así te podemos ayudar mejor.

Saludos.

EDITO para no hacer otra respuesta.

El compilador que uso es el PIC C CCS versión 4.088 y el proteus es el 7.4 SP3 (Build 6792)
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn en 31 de Agosto de 2009, 19:26:09
No hay drama, para eso estamos acá, pero bueno, ahora podemos encarar mejor el problema. Lo que si sería útil es que des una descripción de que es lo que debería hacer el programa en cada situación para poder ver porque puede no estar funcionar como vos necesitas. Te comento esto porque por lo que vi en el esquemático y en el programa me parece que tenes un problema con la convención de signos, es decir, fijate que cuando entrás a la rutina de interrupción por cambio en el puerto B preguntas cuales de los pines están en uno supuestamente para saber cual apretaste y en el esquemático están todos los pines de los pulsadores a 1 (tienen las resistencias esas de pull-up a VCC) menos el que apretas, es decir, "activas con cero", por lo que me parece que deberías preguntar por cual es igual a cero en lugar de cual es igual a uno. No se si esto lo hiciste a proposito o no, o si estoy viendo mal algo, por eso te decia lo de más arriba de explicar un poco. Otra cosa, veo además que "aparentemente" estás utilizando la interrupción de RB0, pero la tenés mal implementada, osea, la pusiste dentro de la rutina de atención por cambio en el puerto B junto con las otras y no se hace así, se declara aparte de la siguiente forma:

Código: [Seleccionar]
#int_EXT
EXT_isr()
{
//acá va tu código para la interrupción por RB0
}

y en el main tenés que habilitarla con lo siguiente:

Código: [Seleccionar]
enable_interrupts(INT_EXT);
Pegale una mirada y cualquier cosa consulta nomás, lo que si acordate de la descripción del funcionamiento así te podemos ayudar mejor.

Saludos.

EDITO para no hacer otra respuesta.

El compilador que uso es el PIC C CCS versión 4.088 y el proteus es el 7.4 SP3 (Build 6792)

el compilador mio CCS es el 4.023 creo ahora veo si puedo conseguir uno mas nuevo..

Eeeh lo de la interrupcion por EXT tenes razon que es asi.. sabes lo que paso tengo 20 mains con lo mismo (cada uno con una actualizacion) y el que subi esta mal.. dejame probar con el nuevo compilador.. mas tarde subo todo bien.. Lo de las resistencias no fue a proposito, pense que estaba bien (como les dije antes esas cosas de electronica son las que me faltan) , muchas gracias por el dato..

Saludos
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: yopepe en 31 de Agosto de 2009, 21:26:46
Citar
Lo de las resistencias no fue a proposito, pense que estaba bien (como les dije antes esas cosas de electronica son las que me faltan) , muchas gracias por el dato..

Ojo, no dije que esté mal, de hecho es correcto darle un valor estable a las entradas (ya sea con resitencia de pull-up a VCC como en tu caso, o una resistencia a GND), lo que pasa es que tenés que tener en cuenta que según cual de las dos opciones elijas, la entrada siempre va a estar en '1' y cuando apretes el pulsador va a pasar a '0', o si elegís la otra va a estar siempre en '0' y cuando presiones va a pasar a '1'. El compilador va a compilar, la simulación no te va a tirar ningún error, pero al no mantener la convención en el programa,  este no se va a comportar como vos pretendés. Espero haber sido claro, es importante esto porque es uno de los errores mas difíciles de depurar en un programa, ya que es cuestión de interpretación, asi que si quedó medio confuso decime y trato de explayarme un poco más.

Un saludo y suerte.
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn en 31 de Agosto de 2009, 22:10:05
Citar
Lo de las resistencias no fue a proposito, pense que estaba bien (como les dije antes esas cosas de electronica son las que me faltan) , muchas gracias por el dato..

Ojo, no dije que esté mal, de hecho es correcto darle un valor estable a las entradas (ya sea con resitencia de pull-up a VCC como en tu caso, o una resistencia a GND), lo que pasa es que tenés que tener en cuenta que según cual de las dos opciones elijas, la entrada siempre va a estar en '1' y cuando apretes el pulsador va a pasar a '0', o si elegís la otra va a estar siempre en '0' y cuando presiones va a pasar a '1'. El compilador va a compilar, la simulación no te va a tirar ningún error, pero al no mantener la convención en el programa,  este no se va a comportar como vos pretendés. Espero haber sido claro, es importante esto porque es uno de los errores mas difíciles de depurar en un programa, ya que es cuestión de interpretación, asi que si quedó medio confuso decime y trato de explayarme un poco más.

Un saludo y suerte.

Quedo mas que claro se entendio todo re bien como lo explicaste.. ahora estoy cambiando el programa para que compare con un 0.

Muchas gracias en serio.. estoy aprendiendo bastante ya.. tenes algun libro o informacion que me recomiendes sobre esto? (sobre las resistencias ejeje)

Saludos

PD: apenas termine y funcione lo posteo bien por si a alguien le sirve..
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: yopepe en 01 de Septiembre de 2009, 01:12:34
Mirá, libro en sí para ese tema no recuerdo específicamente, pero en cualquiera que hable de familias lógicas podes encontrar mucha información al respecto. Lo que te puedo recomendar es que leas un poco acerca de los niveles lógicos TTL y CMOS, todo el tema de las resistencias pull-up y pull-down tienen como fin principal el mantener los niveles lógicos fuera de los margenes de indefinición, esto es necesario para asegurar un nivel estable y ademas para evitar, por ejemplo que parte de la circuiteria interna deje de trabajar en modo conmutación y pase a trabajar en modo lineal (principalmente en lo que es la familia TTL). También ayuda a evitar el efecto antena, que puede provocar la entrada de señales que inestabilizen el funcionamiento del circuito, lo cual es algo muy común en ambientes ruidosos (hablando en sentido eléctrico por supuesto). Depende cuan profundamente quieras analizarlo puede ser un tema bastante amplio, aunque como dijiste que estás estudiando electrónica, en la parte de digitales seguramente habrás visto o verás en su momento esto con bastante profundidad (en mi caso creo que fue allá por tercer año de la carrera). Te dejo unos gráficos de los niveles lógicos en las familias TTL estandar y CMOS como para veas la idea:

(http://img15.imageshack.us/img15/7285/ttlb.th.jpg) (http://img15.imageshack.us/i/ttlb.jpg/)

(http://img149.imageshack.us/img149/7653/cmos.th.jpg) (http://img149.imageshack.us/i/cmos.jpg/)

En la entrada de los circuitos TTL, el nivel lógico bajo puede ser representado por cualquier tensión comprendida entre 0V y 0.8V, y el nivel lógico alto por cualquier tensión entre 2V y 5V. El rango de valores entre 0.8V y 2V es la región de funcionamiento impredecible. Para el caso de CMOS los niveles de entrada para un valor lógico bajo van entre 0V y 1.5V, y para un valor lógico alto van entre 3.5V y 5V. La zona entre 1.5V y 3.5V es la de funcionamiento impredecible.
Esto es para las familias "clásicas", existen variaciones en ambos casos con rangos de tensión e indefinición diferentes, pero bueno, como te digo, de a poco de lo amplio a lo específico.

Desde un punto de vista práctico, una resistencia de 10k conectada a VCC o a GND, según sea pull-up o pull-down respectivamente, es un valor normal y podriamos decir en cierta forma, óptimo para la mayoria de los casos.

Ya que estamos en el baile y a riesgo de ser repetitivo, pero para redondear la idea, te dejo también las configuraciones pull-up y pull-down en un ejemplo de un pulsador:

(http://img181.imageshack.us/img181/1153/pupdf.th.jpg) (http://img181.imageshack.us/i/pupdf.jpg/)

Saludos, a leer y meter mano que es la mejor forma de aprender  :mrgreen:
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: luigi.utn en 01 de Septiembre de 2009, 14:39:46
Citar
Saludos, a leer y meter mano que es la mejor forma de aprender  :mrgreen:

Tal cual, muchas gracias por la informacion. Sos profe o algo? porque lo haces re didactico me resulto facil entenderlo. je

Al programa todavia no lo termino tuve que arreglar un par de cosas en el codigo ya que no realiza lo que yo quiero
(hasta ahora ja), apenas este listo como dije antes lo subo aca asi queda por si a alguien le sirve

De nuevo gracias yopepe por tomarte el tiempo

Abrazo ! 
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: yopepe en 01 de Septiembre de 2009, 23:39:47
Citar
Tal cual, muchas gracias por la informacion. Sos profe o algo? porque lo haces re didactico me resulto facil entenderlo. je

Jaja, la verdad que por lo menos por ahora no, apenas estudiante :D, pero bueno, me alegro de que haya servido. Éxitos.

Saludos 
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: erdanieee en 11 de Septiembre de 2009, 06:20:00
Otra cosa mas, lo intente simular en proteus y me da un error que dice : Internal Exception: acces violation in module '<UNKNOWNN>'

Hola luigi.utn,

yo he tenido un problema similar con INTRB y PIC16F84A. He posteado la solución aquí:
http://www.todopic.com.ar/foros/index.php?topic=21200.msg226682#msg226682 (http://www.todopic.com.ar/foros/index.php?topic=21200.msg226682#msg226682)
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: Ben10 en 11 de Octubre de 2009, 19:16:14
Fíjate que en el archivo 16f84a.h al final está el código:

// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL                    0x0B80
#define INT_RTCC                  0x0B20
#define INT_RB                    0xFF0B08
#define INT_EXT                   0x0B10
#define INT_EEPROM                0x0B40
#define INT_TIMER0                0x0B20

Por un error la línea #define INT_RB       0xFF0B08  tiene dos FF de más, hay que borrarlas.

Suerte ...

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
Título: Re: ayuda en codigo,interrupcion INT_RB
Publicado por: Ben10 en 11 de Octubre de 2009, 19:21:51
En el archivo 16f84a.h al final hay un código:

// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL                    0x0B80
#define INT_RTCC                  0x0B20
#define INT_RB                    0xFF0B08
#define INT_EXT                   0x0B10
#define INT_EEPROM                0x0B40
#define INT_TIMER0                0x0B20

Por un error la línea #define INT_RB       0xFF0B08  tiene dos FF de más, hay que borrarlas.

Por las dudas hay que tener un archivo 16f84a.h correcto y si fallas ...

Suerte ...