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

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

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #15 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.
« Última modificación: 31 de Agosto de 2009, 01:52:11 por yopepe »

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #16 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..
« Última modificación: 31 de Agosto de 2009, 19:14:40 por luigi.utn »

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #17 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)
« Última modificación: 31 de Agosto de 2009, 18:11:26 por yopepe »

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #18 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

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #19 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.

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #20 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..

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #21 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:





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:



Saludos, a leer y meter mano que es la mejor forma de aprender  :mrgreen:
« Última modificación: 01 de Septiembre de 2009, 01:19:17 por yopepe »

Desconectado luigi.utn

  • PIC10
  • *
  • Mensajes: 11
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #22 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 ! 
« Última modificación: 01 de Septiembre de 2009, 14:52:34 por luigi.utn »

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #23 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 

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #24 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

Desconectado Ben10

  • PIC10
  • *
  • Mensajes: 2
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #25 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

Desconectado Ben10

  • PIC10
  • *
  • Mensajes: 2
Re: ayuda en codigo,interrupcion INT_RB
« Respuesta #26 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 ...


 

anything