TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Enigma en 29 de Diciembre de 2007, 14:46:31

Título: Será por las interrupciones?
Publicado por: Enigma en 29 de Diciembre de 2007, 14:46:31
Hola chicos, que tal...? Feliz navidad... tengo un planteamiento - pregunta... Les echo el cuento...

Estoy haciendo un programa el cual me lea y mande a un display las teclas que presione desde un teclado matricial, además los displays deben mostrar la causa del reset cuando este se produzca, ya sea por MCLR, POR, BOR y WDT (es por eso mi insistencia en temas anteriores por los resets)... además de que tiene dos switechs externos que cuando aprete me aparezca o interrpción 1 o interrupción 2 en el display, de acuerdo a cual accione... además un dipswitch que me deshabilite cada interrupción por separado y todas juntas (globales)... La Buena Noticia es que ya lo hice gracias a mis lecturas de tutoriales, datasheet, trasnochos, la colaboración de mucho de ustedes y gracias a las correcciones y orientaciones de mi amigo Henry (micro_cadaver)... pero me encuentro en un dilema con el programa y la simulación en proteus... estuve haciendo mis observaciones y las anote, a continuación se las expongo...

Primera observación:
Cuando via dipswith deshabilito las interrupciones; pues  el MCLR, el WDT y el teclado matricial funcionan correctamente, a que me refiero con esto: Bueno, aprieto el teclado y los números se me ven en el display, el WDT se me desborda a los 2:12 (excelente) y cuando le doy al pulsador del MCLR, se me reinicia el programa apareciendo la C de Clear (todo bello :mrgreen:) todo chevere (Ojo esto con el dipswith puesto en bajo, es decir, sin interrupciones habilitadas)

Segunda Observación:
Cuando habilito las interrupciones, estás funcionan de maravilla(es decir, si aprieto el pulsador RB0(primera interrupción) me aparece el 1 y si aprieto el segundo pulsador (interrupción por RB1) me aparece el 2.... pero el MCLR, el WDT y el teclado no funcionan correctamente, me explico: Habilito via dipswith cada interrupción por separado y funcionan fino, le doy al teclado y funciona también, muestra los números, todo esto sin haber resetado via MCLR, pero cuando ahora le doy al pulsador del MCLR pues este me manda la causa del reset al display, es decir una C, como deberia ser, pero se queda pegado allí, el teclado no reacciona, lo único que funcionan son las interrupciones que cuando apriento el pulsador me aparece correctamente que fue la primera interrupción, y cuando apreto el segundo pulsador pues me aparece el 2, todo fino con ellas... Ahora con respecto al WDT, este se activa despues de 2:31 minutos, (mucho más tarde) y aparece la P de perro(lo que deberia hacer), pero cuando aprieto el pulsador del MCLR, no me aparece la C que deberia aparecer, sino que sigue la P del WDT allí pegada, y cuando le doy al pulsador de las interrupciones cada una sirve por separado (mostrando 1 o 2 dependiendo de cual active), pero cuando reseteo de nuevo por MCLR, pues sigue apareciendo la P del WDT en vez de la C del MCLR.

Este es mi dilema pergunta muchachos-.... que creen que pueda ser... :o

Les voy a anexar el codigo a ver si le quieren echar una ojeada...

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 29 de Diciembre de 2007, 17:04:08
Bru, bru, bru  :(

Atte: Enigma... La llanerita de Guayana :?
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 16:49:45
Rayos, nadie me quiere ayudar!!!!  :(


Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 19:50:22
ya te lei, jejje solo que no te entendi muy bien, le doy unas leidas mas para poder tratar de ayudarte, ok? un saludo, feliz año nuevo! :mrgreen:
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 19:57:49
Jejejeje... O.k... pense que era que nadie me queria ayudar!!! :(... Bueno sino entiendes algo pregunta, y te explico con más claridad!!! feliz Año nuevo para ti también!!!!! :-/

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 21:02:06
parece que voy entendiendo un poco :mrgreen: mira, nose si tendras un esquema de tu circuito para tener las cosas mas claras

que problema tuviste con la simulacion? o con el proteus??
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 21:23:58
O.k, te mando el esquema de proteus, la verdad no creo que sea problema de la simulación... creo que es el programa, no se, un error de teoria o algo que estoy pasando por alto... Porque todo el meollo del asunto se concentra en las interrupciones, es decir, cuando le doy al dpswitch para desactivar las interrupciones todo funciona como deberia funcionar, pero cuando las activo pues todo se vuelve un ocho!!! todo se enreda!!!

(http://img209.imageshack.us/img209/1416/dibujoop3.jpg)

Atte: Enigma... La llanerita de Guayana :?
Título: Re: Será por las interrupciones?
Publicado por: poseidon20 en 01 de Enero de 2008, 21:29:09
Has intentado seguir la simulacion paso a paso? para que veas que es lo que hace tu programa justo cuando ocurre el loquerio  :mrgreen:
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 21:46:44
ok. creo que en tu fuses mejro le cambies INTRC_IO por INTRC, porque en el primero creo que esta involucrado en pin 14 que es OSC2/RA6/CLKO, y ese pin lo estas usando en tu teclado

viendo tu esquema si ABCyD controlan los catodos será mejor que uses transistores en vez de los negadores, ya que por la corriente qeu llega a consumir un display con todos sus segmentos encendidos puede ser muy lamentable para el negador porque puede arruinarse, aunque depende cuanta corriente aguante, pero no creo que sea mucha, fijate por aca: http://www.todopic.com.ar/foros/index.php?topic=19435.0

en cuanto a lo de tu programa me parece que esta bien, que opinas si en vez de usar un dipswitch usas solo pulsadores tb??
seguire dandole la mirada minusiosa de todas maneras, talvez se me ha escapado algo, aunque lo veo muy bien :mrgreen:

un saludo, espero logres pronto acabar este dilema que tienes :mrgreen:


pd... si es muy buena la idea de poseidon, eso lo haces cargando en el micro, en proteus el archivo .cof que te genera el ccs en vez del .hex, son lo mismo solo que el cof te sirve para la depuracion, para ver paso a paso lo que hace tu programa, lo cargas, lo ejecutas normalito, y le das pause, y aparecera una ventana con tu codigo y ya te daras cuenta como es que funciona ese cof, es muy bueno, te ayuda bastante, a mi me hizo ver los errores que algunas cometi, bueno muchos errores :D
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 21:48:27
Correr el programa paso a paso??? donde? en el compilador??? pero me han dicho que en el CCS no se puede hacer eso....

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 21:54:37
 :mrgreen: te deje eso en el pd (postdata, jejeje) de mi anteriro mensaje, que lo edite :mrgreen:
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 22:00:43
Hola.... Bueno lo del INTRC_IO tengo que dejarlo así porque, por eso mismo porque estoy usando el teclado allí... y si coloco INTRC pues me empezará a contar el reloj interno y los números del teclado cambiarán como locos :-)... en cambio con el INTRC_IO lo que hago es hacer que ese pin trabaje como entrada/salida....
igual gracias por esa observación.... jejejeje :-/

Lo de los transistores, pues si tienes mucha razon los voy a colocar.... pero no creo que sea por eso que no funcione el programa verdad correctamente cuando activo las interrupciones?? o si??

Y por último con respecto al Dpswitch bueno yo queria hacerlo con pulsadores, pero es un requisito hacerlo con dpswitch... igual los probe con pulsadores y tampoco funciona....  :(

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 22:15:23
si si, lo de los transistores solo es para resguardar las espaldas a los negadores o al PIC :mrgreen:

segurolas que pasa eso con el INTRC?? porque yo siempre uso ese y no me ha dado problemas.

prueba con el modo depuracion, con el .COF en el proteus y checa donde esta el error para que sea mas facil resolver el problema
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 01 de Enero de 2008, 23:05:43
Hola... si el INTRC es para eso... lo probe, y pues con el INTRC se me cambiaban los números solitos, como si contase... y le coloque el INTRC_IO y pues quedo muy bien...

Probe lo que me dijeron y pues de pana que es bien chevere, puedo los registros del pic, y observe algo... Cuando habilito las interrupciones, y provoco una por RBO, no se supone que el bit INT0F, del registro INTCON1 deberia irse a uno??? o es que lo hace tan rapido que no veo el cambio de 0 a 1 de ese bit.... Estoy observando el comportamiento de ese registro y pues no veo el cambio.

Ahora cuando deshabilito la interrupciones, y le doy al pulsador de RB0, pues se supone que si deshabilite todas las interrupciones pues no deberia cambiar el bit INT0F a 1 y pues si cambia, no entiendo esa reacción....

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 01 de Enero de 2008, 23:29:54
Citar
Cuando habilito las interrupciones, y provoco una por RBO, no se supone que el bit INT0F, del registro INTCON1 deberia irse a uno???
o es que lo hace tan rapido que no veo el cambio de 0 a 1 de ese bit.... Estoy observando el comportamiento de ese registro y pues no veo el cambio.
si te refieres al bit INT0IF, si (porque es el unico parecido con ese nombre que veo en ese registro)

talvez estas presionando algun boton equivocado, aunque no creo porque te das cuenta rapidamente de como funciona jeje :mrgreen:

yo uso:
(http://img201.imageshack.us/img201/7369/cofjv3.jpg)
el que esta marcado como 1º en la imagen, ya que ese va instrucción por instrucción
el que puse como 2do lo utilizo como breakpoint (en realidad es eso, jeje), en cualquier linea me posiciono y le doy click ahi, y se pone una bolita roja que indica que ahi se detendrá la ejecución del programa en modo PLAY, si clikeas otra vez la bolita solo se pone rojo en el borde, y nose para que servira, pues tb hace un breakpoint, y si haces click otra vez en la bolita (icono 2º) la bolita roja se borra
el tercero parece que hace lo mismo que el 1ro, y el 4to no lo uso pues es como darle play

entonces lo que hiciste es colocar un breakpoint en la primera instruccion de la rutina de interrupción?? para que se detenga justo ahi y veas ese bit?? porque si haces con pausas seguro que la ejecucion te gana :D

Citar
Ahora cuando deshabilito la interrupciones, y le doy al pulsador de RB0, pues se supone que si deshabilite todas las interrupciones pues no deberia cambiar el bit INT0F a 1 y pues si cambia, no entiendo esa reacción....
esta no entendi :(

pero como usas esta instruccion:
void deshatodas(void)
   {
      disable_interrupts(global);                     // Deshabilito todas las interrupciones
   }

el bit que deberia cambiar es GIE/GIEH, a cero si deshabilitas

bueno haber como va en la depuracion :mrgreen: suerte

un saludo
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 00:01:03
Cita de: Cryn
pero como usas esta instruccion:
void deshatodas(void)
   {
      disable_interrupts(global);                     // Deshabilito todas las interrupciones
   }

el bit que deberia cambiar es GIE/GIEH, a cero si deshabilitas

bueno haber como va en la depuracion  suerte

un saludo


Exacto, ese bit permanece en cero (GIE/GIEH).... pero aun estando el desactivado, cuando presiono el pulsador de RB0 para la interrución uno, este bit el INT0IF cambia a 1, y no deberia puesto que he desactivado ñlas interrupciones globales.... o si deberia cambiar???? :o

Jejeje gracias por el cursillo de proteus, me ha servido un montón... Eres el mejor!!!!  :mrgreen:

Atte: Enigma... La llanerita de Guayana  :o
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 01:45:36
Cita de: CRYN
el que puse como 2do lo utilizo como breakpoint (en realidad es eso, jeje), en cualquier linea me posiciono y le doy click ahi, y se pone una bolita roja que indica que ahi se detendrá la ejecución del programa en modo PLAY, si clikeas otra vez la bolita solo se pone rojo en el borde, y nose para que servira, pues tb hace un breakpoint, y si haces click otra vez en la bolita (icono 2º) la bolita roja se borra

Como se activa la bolita roja??? a mi no se me coloca.... lo simulo, y le doy pause y solo me aparece el cuadro pero con ese icono que denotas como segundo desactivado mira:

(http://img527.imageshack.us/img527/5739/dibujo1hy5.jpg)


Atte: Enigma... La llanerita de Guayana :D
Título: Re: Será por las interrupciones?
Publicado por: poseidon20 en 02 de Enero de 2008, 02:04:40
Exacto, ese bit permanece en cero (GIE/GIEH).... pero aun estando el desactivado, cuando presiono el pulsador de RB0 para la interrución uno, este bit el INT0IF cambia a 1, y no deberia puesto que he desactivado ñlas interrupciones globales.... o si deberia cambiar???? :o

Jejeje gracias por el cursillo de proteus, me ha servido un montón... Eres el mejor!!!!  :mrgreen:

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

Lo que sucede con las interrupciones es que si activas el habilitador global GIE/GIEH, entonces cuando se produsca una interrupcion el PC saltara al vector de interrupcion y se pondra a 1 el flag de la interrupcion correspondiente, pero si no habilitas el GIE igualmente los flags de las interrupciones se colocaran en 1 pero como tienes deshabilitada el GIE tu PC no saltara al vector de Interrupcion. Una cosa son los habilitadores de las interrupciones y otras los flags de las mismas.Ojala pueda haber contribuido a despejar esa duda  :mrgreen:.
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 02:20:00
Cita de: POSEIDON20
Ojala pueda haber contribuido a despejar esa duda  .


Que si la despejaste!!! más claro no pudo quedar!!! quede clarita como el agua!!! Más fiiiino! :-/.... Gracias Poseidon20, eres es el mejor! Muy convincente y clara tu explicación..

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Será por las interrupciones?
Publicado por: sander en 02 de Enero de 2008, 18:16:24
Primera observación:
Cuando via dipswith deshabilito las interrupciones; pues  el MCLR, el WDT y el teclado matricial funcionan correctamente, a que me refiero con esto: Bueno, aprieto el teclado y los números se me ven en el display, el WDT se me desborda a los 2:12 (excelente) y cuando le doy al pulsador del MCLR, se me reinicia el programa apareciendo la C de Clear (todo bello :mrgreen:) todo chevere (Ojo esto con el dipswith puesto en bajo, es decir, sin interrupciones habilitadas)

Y aqui has probado primero esperar el reset del watchdog y luego apretar el reset del MCLR?


Segunda Observación:
Cuando habilito las interrupciones, estás funcionan de maravilla(es decir, si aprieto el pulsador RB0(primera interrupción) me aparece el 1 y si aprieto el segundo pulsador (interrupción por RB1) me aparece el 2.... pero el MCLR, el WDT y el teclado no funcionan correctamente, me explico: Habilito via dipswith cada interrupción por separado y funcionan fino, le doy al teclado y funciona también, muestra los números, todo esto sin haber resetado via MCLR, pero cuando ahora le doy al pulsador del MCLR pues este me manda la causa del reset al display, es decir una C, como deberia ser, pero se queda pegado allí, el teclado no reacciona, lo único que funcionan son las interrupciones que cuando apriento el pulsador me aparece correctamente que fue la primera interrupción, y cuando apreto el segundo pulsador pues me aparece el 2, todo fino con ellas... Ahora con respecto al WDT, este se activa despues de 2:31 minutos, (mucho más tarde) y aparece la P de perro(lo que deberia hacer), pero cuando aprieto el pulsador del MCLR, no me aparece la C que deberia aparecer, sino que sigue la P del WDT allí pegada, y cuando le doy al pulsador de las interrupciones cada una sirve por separado (mostrando 1 o 2 dependiendo de cual active), pero cuando reseteo de nuevo por MCLR, pues sigue apareciendo la P del WDT en vez de la C del MCLR.

Este es mi dilema pergunta muchachos-.... que creen que pueda ser... :o

Les voy a anexar el codigo a ver si le quieren echar una ojeada...

Atte: Enigma... La llanerita de Guayana :-)

Rarisimo lo que comentas, ya he leido estos tus problemas varias veces y aun no me imagino que podria ser podrias subir el archivo de simulacion que usaste? me gustaria hacer unas pruebas. Ademas que version del Proteus estas usando ? y que version del CCS?

Saludos
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 18:51:01
Cita de: SANDER

Y aqui has probado primero esperar el reset del watchdog y luego apretar el reset del MCLR?

Si ya lo probe, deje que se desbordara el WDT, aparecio la P de perro y pues le di al pulsador del MCLR, y siguio la P pegada allí.... :o

El  programa en C, lo puse en el primer post!!!! y el DSN te lo dejo en el .rar

Atte: Enigma... La llanerita de Guayana :-/
Título: Re: Será por las interrupciones?
Publicado por: sander en 02 de Enero de 2008, 19:31:14
Cita de: SANDER

Y aqui has probado primero esperar el reset del watchdog y luego apretar el reset del MCLR?

Si ya lo probe, deje que se desbordara el WDT, aparecio la P de perro y pues le di al pulsador del MCLR, y siguio la P pegada allí.... :o


Lo sospeche desde un principio... ..  .Cuando lei la primera vez tu post tenia una teoria que recien ahora la pude comprobar, leyendo el datasheet claro. bueno y es que el registro RCON  contiene los bits que indican los diferentes tipos de reset, el bit que controla el reset por watchdog es el TO, del cual se dice lo siguiente

_TO

1 = Set by power up ,CLRWDT instruccion , or SLEEP instruccion
0 = A WDT timeout ocurred

Como veras este bit es activo en bajo y no vuelve a uno a no ser que se encienda el PIC se resetee el watchdog o se lo ponga  a dormir , el reset por MCLR no lo afecta.
 
En tu programa la primera causa de reset que revisas es la del WDT, cuando este se produce _TO = 0  y como no pones en uno este bit despues de reconocer el reset, la resetear por MCLR  el programa  te dice que la causa fue la del WDT, porque despues del MCLR _TO sigue en cero,  entonces la solucion es que cuando detectes esta causa de reset debes de limpiar el WDT para poner este bit en uno y asi poder detecar el reset de MCLR.

La segunda parte de tu problema aun me parece rarisima.
 
y que version del proteus usas?
y del CCS?

Saludos
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 20:33:38
Cita de: SANDER
Lo sospeche desde un principio... ..  .Cuando lei la primera vez tu post tenia una teoria que recien ahora la pude comprobar, leyendo el datasheet claro. bueno y es que el registro RCON  contiene los bits que indican los diferentes tipos de reset, el bit que controla el reset por watchdog es el TO, del cual se dice lo siguiente

_TO

1 = Set by power up ,CLRWDT instruccion , or SLEEP instruccion
0 = A WDT timeout ocurred

Como veras este bit es activo en bajo y no vuelve a uno a no ser que se encienda el PIC se resetee el watchdog o se lo ponga  a dormir , el reset por MCLR no lo afecta.
 
En tu programa la primera causa de reset que revisas es la del WDT, cuando este se produce _TO = 0  y como no pones en uno este bit despues de reconocer el reset, la resetear por MCLR  el programa  te dice que la causa fue la del WDT, porque despues del MCLR _TO sigue en cero,  entonces la solucion es que cuando detectes esta causa de reset debes de limpiar el WDT para poner este bit en uno y asi poder detecar el reset de MCLR.


Coye!!! berro, yo había leido lo del RCON en el datasheet, pero no sabia que había que volver a poner en 1 el flag del perro Guardian... :shock: chanfle ahora si funciona.... Dios como se aprende en este foro gracias a personas como ustedes!!! jejejeje... :mrgreen:

Muchas Gracias de pana!! Sander! :g)

Si lo de la segunda parte es bien rara!!!  es como si se quedará sólo en la rutina de chequeo del dpswitch y de las interrupciones, como sino pasará por la rutina del teclado!!!!! Ya he hecho de todo de pana!,  :(

Atte: Enigma... La llanerita de Guayana :lol:
Título: Re: Será por las interrupciones?
Publicado por: sander en 02 de Enero de 2008, 20:58:35
Y bueno, luego de estar jugando un rato con el proteus 7.2 SP0 , es el que tengo yo descubri el segundo error , pero segun yo es error del proteus. resulta que despues de un reset el valor de PIE2 es B'00100000', esto que quiere decir , que se habilita la interrupcion USBIE, y en el PIR2 casualmente tenemos USBIF = 1   :shock: lo cual segun la hoja de datos no deberia pasar por lo menos en la version que tengo, ya mas rato chequeo la errata,  entonces cuando llegas a habilitar todas las interrupciones (por cierto que tambien se habilitan las interrupciones perifericas ), vas al vector de interrupcion a atender la interrupcion del USB ,la cual obviamente no atiendes y todo el tiempo quedas dando vueltas entre la interrupcion y la instruccion siguiente a habilitar todas las interrupciones por lo cual nunca vuelves a leer el teclado.

Resumiendo despues de un reset el proteus 7.2 SP0 para el PIC18F4550 hace USBIE = 1 y USBIF = 1, solucion, por software yo hice :

definimos los registros que habiltan interrupciones perifericas

#byte    PIE1 = 0xF9D
#byte    PIE2= 0xFA0


y antes de habilitar todas las interrupciones:

            PIE1 = 0x00;
            PIE2= 0x00;
            enable_interrupts(global);                //Habilita máscara global de int.
poniendo los registros que habilitan interrupciones en el valor teorico despues del reset 0x00

Bueno eso es en simulacion, en la practica segun mi teoria eso no deberia pasar , a ver si alguien lo prueba.

Saludos
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 02 de Enero de 2008, 23:00:02
 :shock:

Rayos!!! me has dejado atonita!!!!  :shock:

Jamás en la vida hubiese descubierto eso.... :o... Muchacho Dios te bendiga tu experiencia y sabiduria!!!

Lo único que vi, eso si me di cuenta fue lo de los perifericos, esa si me di cuenta que se habilitaban porque chequee el registro INTCON, pero jamás se me hubiese ocurrido cheear el registro del USB.....

Naguara quien lo diria... Me habían dicho que está versión de poteus daba problemas, pero no hice caso! :?.... Está experiencia me ha hecho reflexionar y me ha hecho llegar a 3 conclusiones:

1) Este foro es increible!, Gracias a ustedes he aprendido demás...
2) Tengo que revisar todos los registros, cuando vaya a simular
3) Sigo prefiriendo el ASM :D jijijiji

berro de pana gracias chamo, eres el mejor oyó!!!, y deja que yo misma soy la que hará el montaje! hago el circuito y les digo!

Ahora una preguntica y disculpa el abuso no, pero podrías explicarme este pedacito, es que me hizo ruido!

Cita de: SANDER

vas al vector de interrupcion a atender la interrupcion del USB ,la cual obviamente no atiendes y todo el tiempo quedas dando vueltas entre la interrupcion y la instruccion siguiente a habilitar todas las interrupciones por lo cual nunca vuelves a leer el teclado.

Sabia que se quedaba pegado por allá en el vector de interrupción pero no entendi las ultimas líneas!!!

Mil Gracias de nuevo!!! Espero la explicación... y disculpa de nuevo!!

Atte: Enigma... La llanerita de Guayana :g)
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 03 de Enero de 2008, 01:09:37
Segun entendi la ultima linea que explica sander quiere decir que cada vez qeu una interrupocion ocurre el micro chequea el vector de interrupciones (veamos al vector como el que contiene los flag bits que le corresponde a cada interrupcion) y el micro esta viendo activo el flag del usb entonces supone que ha ocurrido una int por usb, lo cual en tu programa no sucede, y se queda como trabado ahi y de ahi que se qeuda con la P del perro qeu desborda y desborda, entonces ello lo soluciono con el codigo que te dejo para que no vea mas a ese int del usb. bueno al menos pienso que es eso, sino sander me corrige :mrgreen:

aunque es raro ello ya que nunca habilitas int por usb, lo que con el global deberia mantenerse inactivo, muy raro, pueden ser problemas del compilador, lamentablemente el ccs trae muchos bugs (errores) en varias ocasiones ha sacado canas a muchos muchachos de aca, y pues ni modo, seria bueno cambiar de lenguaje, pero nose, hay tantas cosas, haber pues.... :mrgreen:

Como se activa la bolita roja??? a mi no se me coloca.... lo simulo, y le doy pause y solo me aparece el cuadro pero con ese icono que denotas como segundo desactivado

umm eso esta un poco raro.... talvez sea necesario integrar tu proteus con ccs (http://www.todopic.com.ar/foros/index.php?topic=12184.0)

y aca lo que a mi me aparece con mi 7.1 sp4 de proteus, cuando le pongo el .cof y pause a una simulacion:
(http://img174.imageshack.us/img174/7370/cof1xe1.jpg)

entonces lo que hago es posicionarme con el raton a cualquier linea del codigo, a la que quiera hecharle la mirada a fondo (despues de pausar "0º" :D) click en el icono de breakpoint, y se qeuda marcada la linea, y por ultimo play para continuar, y la simulacion se pausará cuando el codigo llegue a la linea de breakpoint y te mostrara otra vez el codigo pausado en la linea donde pusiste la bolita, jeje, puedes poner varias bolitas donde quieras :mrgreen:
(http://img91.imageshack.us/img91/586/cof2xh9.jpg)

qeudaron feitas las letras, jeje, esque despues del festejo de año nuevo, me quedo medio malo el pulso :D

espero te sirva un saludo, y que bueno que sander haya dado con el problema que pasaba :mrgreen:


Título: Re: Será por las interrupciones?
Publicado por: Enigma en 03 de Enero de 2008, 02:14:29
Hola Cryn, gracias por responder, los manuales están excelentes, mis felicitaciones para el autor--- Pero no se creo que esto no actua sobre Proteus 7.2... ya que sigue los pasos al pie de la letra y pues nada, me sigue apareciendo el cuadro vació....

Si alguien tiene proteus 7.2 y logro hacer está adaptación... Pues aviseme y digame como lo hizo... porque el mio nada de nada... y cuando me voy al cuadro de Source - Define Code Generation tools y reviso los datos,. pues todos se me cambian a como estaban originalmente!!!! no se quedan quietos!!!!

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 03 de Enero de 2008, 02:23:28
umm talvez talvez.... pues como te mencione en el privado no pude probar bien la 7.2 pues no me corria a gusto, se em salia, y de ahi liado con el tiempo no me di para tratar de verle mas a detalle el asunto

haber los que tengan la 7.2 haganse notar :mrgreen:
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 03 de Enero de 2008, 02:26:39
Si vale que mal que esta versión de proteus no acepte eso.... porque creo que es la única que tiene el 18F4550......

Señores que tengan PROTEUS 7.2 diganme, han podido adaptar C con PROTEUS???? :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: sander en 03 de Enero de 2008, 11:28:22
Bueno vamos por partes

Primero en la version  del proteus que tengo la 7.2 SP0 si pude cargar el codigo en C para simularlo y funciono bien, exceptuando la parte del reset claro.

Citar
aunque es raro ello ya que nunca habilitas int por usb, lo que con el global deberia mantenerse inactivo, muy raro, pueden ser problemas del compilador, lamentablemente el ccs trae muchos bugs (errores) en varias ocasiones ha sacado canas a muchos muchachos de aca, y pues ni modo, seria bueno cambiar de lenguaje, pero nose, hay tantas cosas, haber pues.... Mr. Green

Sobre esto que puso cryn  , a mi parecio que es error del proteus porque cuando hize el reset del MCLR el proteus habilito la interrupcion del USB , estoy seguro de esto porque revise el codigo en ensamblador que genera el CCS, al principio tambien pense que era un error del CCS, a mi tambien me dio muchos dolores de cabeza, pero resulto que no.

Sobre la ultima parte que puse en el anterior post , tiene que ver justamente con el vector de interrupcion, me explico , cuando revise el codigo en asm que genera el CCS note lo siguiente

Al momento de habilitar las interrupciones despues de revisar el dipswitch el CCS usa el siguiente codigo en asm

enable_interrupts(global);                //Habilita máscara global de int.
movlw    0xC0
iorwf      INTCON,F
bra        0x26C

la direccion 0x26C corresponde al inicio del ciclo infinito que enigma utiliza, bueno como puede verse el CCS ademas de habilitar la interrupcion global (bit 7), tambien habilita las interrupciones perifericas , esto ultimo en este caso en particular no es necesario, una vez actualizado el registro INTCON se deberia ejecutar el salto al inicio del ciclo infinito, pero como misteriosamente los bits USBIE y USBIF estan en 1 despues de un reset por MCLR o WDT (error del proteus segun yo), el microcontrolador va al vector de interrupciones donde sucede algo como lo siguiente :

en la posicion 0x08

//Primero el CCS guarda las variables de contexto y luego revisa las fuentes de interrupcion


0x04C    btfss     0xFF2.4           ;Revisa si la INT0 esta habilitada
0x04E    goto     0x058
0x052    btfsc     0xFF2,1          ;Revisa si produjo la INT0 (INT0IF = 1)
0x054    goto     0x0AA            ;Si se produjo va a atender esta interrupcion
0x058    btfss     0xFF0.3           ;Revisa si la INT1 esta habilitada
0x05A    goto     0x064
0X05E    btfsc     0xFF0,0          ;Revisa si produjo la INT1 (INT1IF = 1)
0x060    goto     0x0B6            ;Si se produjo va a atender esta interrupcion

//Despues el CCS recupera las variables de contexto y termina con el clasico

           retfie
En las rutinas de interrupcion que genera el CCS, este se encarga de poner en cero los bits INT0IF e INT1IF, para poder volver a la ejecucion normal del programa, el problemas es que al no esperarse la interrupcion por USB ,ya que no deberia pasar,el CCS no genera codigo para atender esta interrupcion entonces USBIE y USBIF estan siempre en 1 por lo que luego del retfie siempre se retorna al vector de interrupcion ya que USBIF y USBIE estan en 1. Entonces la solucion es deshabilitar por software de alguna forma la interrupcion por USB, pero solo para la simulacion, ya que segun la hoja de datos despues de un reset por MCLR o por WDT estas interrupciones estan deshabilitadas. pero esto ultimo aun hay que probarlo.

Saludos



Título: Re: Será por las interrupciones?
Publicado por: Enigma en 03 de Enero de 2008, 13:15:50
Hola Sander, como hiciste para hacer la adaptación a proteus??? Será que versión 7.2.0.4401 (beta) tendrá que ver con ello??? :shock:

Ahhh... Ya entendi, lo de la interrupción.... jejeje todo quedo tan claro como el agua! Gracias Sander! Jajaja darse cuenta de esos errores, requiere muchas canas de experiencia!!! jejejeje

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: sander en 03 de Enero de 2008, 13:28:47
La adaptacion al proteus la hago cargando el archivo  .cof en lugar del .hex al PIC , y en lugar de presionar play presiono pausa al momento de comenzar la simulacion y ahi me aparece el codigo en C. es posible que por tu version del proteus tengas problemas , pero no estoy seguro.


Saludos
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 03 de Enero de 2008, 19:16:39
Mi versión también es 7.2 SP0, rayos, porque mis cosas siempren presentan problemas!!! :(.... Es que yo cambio todo de acuerdo al manual para la adpatación y sin haber hecho nada cuando vuelvo a revisar todo se cambia de nuevo a sus valores originales!!! :o

Atte: Enigma... La llanerita de Guayana :(
Título: Re: Será por las interrupciones?
Publicado por: PalitroqueZ en 04 de Enero de 2008, 15:09:14
yo tengo la versión 7.2 SP2 y me ha funcionado sin problemas, ya he realizado simulaciones con el 18f4550

en cuanto a la integración del compilador ccs, va la misma en cualquier versión, esta (http://www.todopic.com.ar/foros/index.php?topic=4715.msg37372#msg37372) es la que uso




Título: Re: Será por las interrupciones?
Publicado por: Enigma en 04 de Enero de 2008, 15:36:10
Una pregunta.... en la barrita de arriba, de está ventana, te aparecen esas opciones también!!!???
Yo siempre lo cambio al CCSC, y cuando cierro la ventana y la vuelvo a abrir, me aparece sin son ni ton otra vez el ASEM51  :5]

(http://img146.imageshack.us/img146/3323/dibujo2oa3.jpg)



Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: PalitroqueZ en 04 de Enero de 2008, 16:58:51
si me aparece (yo les quito las que nunca uso como los compiladores que no son de uC PIC).

y siempre te aparecerá porque esa es la barra de herramienta donde estan todos, lo que debes hacer es cargar el archivo fuente y decirle al proteus que compilador usaras, en esta misma venta deberas tener configurado al ccs (ver mi post anterior), luego en el primer item del mismo menu donde aparece esta ventana que muestras (no recuerdo como se llama) eliges el compilador y buscas el archivo fuente.


Si todo va bien hasta puede compilar directamente desde el isis (Build F10) sin necesidad de llamar a otros ide´s

PD: te lo explico con letras pues no tengo el proteus en esta maquina  :(

Título: Re: Será por las interrupciones?
Publicado por: Enigma en 04 de Enero de 2008, 17:10:30
Rayos!!! yo creo que es mi proteus el que está malo!!!! :8} porque hago todo lo que dicen y no se configura el muy hijo de su mamá!!! :5]

Voy a reinstalarlo, sino me funciona despues de eso, pues entonces soy yo la del problema!!!!!!! :(

Atte: Enigma... La llanerita de Guayana :8}
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 06 de Enero de 2008, 03:45:59
Ya se porque no se integraba el CCS con el proteus!!!! Era por la versión  del CCS.... jejejeje :D


Ya veo mi codigo, ya veo mi codigo!!!!! wiiiiiiiiiiiii :-/

Atte: Enigma...  La llanerita de Guayana :D
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 06 de Enero de 2008, 15:14:09
 :mrgreen: que bueno qeu ya lograste ver tu codigo en el proteus :mrgreen:

por curiosidad qeu versiond e ccs tenias???
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 06 de Enero de 2008, 16:25:12
La versión que tenia si no me equivoco era la 4.0...

Era más más bonita a la vista,,, muy moderna!!! pero al paracer no era compatible con proteus! :(

Atte: Enigma... La llanerita de Guayana :D
Título: Re: Será por las interrupciones?
Publicado por: poseidon20 en 06 de Enero de 2008, 19:35:01
Ya te estas comenzando a familiarizar con los Bugs del CCS  :D :D :D
Excelente por llegar a enlazar tu CCS con el proteus  :g) Estoy ancioso por saber avanzes de este proyecto :mrgreen:
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 06 de Enero de 2008, 21:04:31
Si ya voy poco a poco conociendo al CCs!!! Para adelante como el elefante, con pasos lentos pero aplastantes!!! jejejeje :D

Pronto doy avances de este proyecto, voy a mejorar unos detalllitos!!! :-/

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 13 de Enero de 2008, 06:51:29
Hola Muchachos.... Tengo Buenisimas nuevas :D.... Por Fin acabe mi proyecto :-/.... Es el siguiente:

Diseño de un circuito el cual permita ver mediante 4 displays, las últimas 4 teclas presionadas desde un teclado telefónico, además se deben visualizar 4 causas del reset en los displsys (POR, BOR, MCLR y WDT), también debe tener dos rutinas de interrupción con dos pulsadores. Si aprieto el pulsador 1, me debe aparecer en los displays: INT1 (Interrupción 1) y si aprieto el pulsador 2, debe aparecer INT2 (Interrupción 2) y tambiénm debe poseer un dpswitch, el cual me hará desactivar cada interrupción por separado, o todas de una sola vez....

Todo esto lo hice posible, gracias a la ayuda de muchos de ustedes y a tres dias seguidos sin dormir :?, de verdad se los agradezco, sin ustedes no lo hubiese hecho!!! Se que para muchos dirán, que no es gran cosa de proyecto, pero para mi si lo es, puesto que es mi primer proyecto trabajado bajo lenguaje C, y bajo el pic 18F4550.... jejeje fue un logro para mi misma!!! :mrgreen:

GRACIAS MUCHACHOS!!!!!!! SON LOS MEJORES TODITOS LOS QUE ME AYUDARON, Y LOS QUE NO TAMBIÉN!!!!

Cualquier cosa, que quieran ver el código de mi humilde proyecto, solo diganme y lo subo!!!! jejejeje :mrgreen:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 13 de Enero de 2008, 12:40:00
 :-/ :-/ que bueno qeu hayas conseguido terminar el proyecto en el que tanto trabajaste :mrgreen:

cuando eso pasa te sientes caminando sobre las nubes con un vientecillo que te sopla en la cara :mrgreen:

asi que a disfrutarlo y estar lista para el siguiente proyecto que tengas, que con ese entusiasmo qeu tienes seguramente lo conseguiras con exitos! :mrgreen:

un saludo y felicidades por este primer gran paso :-/
Título: Re: Será por las interrupciones?
Publicado por: stk500 en 13 de Enero de 2008, 13:12:40
 :-/ :-/ :-/ venga llanerita   :-/ :-/ :-/
ansioso por ver  :lol: :lol: :lol:
Título: Re: Será por las interrupciones?
Publicado por: Enigma en 13 de Enero de 2008, 14:26:18
Si Cryn, sabes que si siento ese fresquito.... fueron dias de trabajo e investigación.... Por un momento me iba a rendir, pero decidi seguir adelante a ver hasta donde llegaba... y m´aquí....

Ahora, mi siguiente paso es trabajr con los Timer, el ADC, la LCD y otras cosas del pic... Ya adentrandome más al micro... Ojala toda salga bien... Espero poder contar con su ayuda!!! :mrgreen:

Aquí subo el codigo, para que los novatos como yo lo vean y los más expertos lo corrijam!!!!! (porque como toda novata, lo hice por el camino largo.... me fuí a pie!!! jejejeje :D)

Atte: Enigma... LA llanerita de Guayana :-)
Título: Re: Será por las interrupciones?
Publicado por: Cryn en 13 de Enero de 2008, 14:41:14
bien mbien por ti

claro qeu tendras la ayuda qeu sea posible, pues este foro es para eso, para ayudar y compartir

un saludo :mrgreen: exitos!!!