Programación Específica > Microcontroladores

 Activar Interrupción Pic16f84

<< < (2/3) > >>

xernovil:

--- Citar ---Me mareo un poco tu programa... programas en asembler o en C?

--- Fin de la cita ---

Esque utilizo el PicANT IDE, y tengo que programar en C2C, pero en alguna ocasión tengo que intercalar ASM, como en el caso del sleep, ya que no conozco su equivalente en C.

La interrupción es para que salga del estado sleep y reactive el programa desde el inicio, es decir, es como hacer un reset, la verdad es que no importaría mantener los estados anteriores ya que vuelve a empezar de 0. La idea solo es practicar, ya que los leds serán los indicadores de teclas, y tendré que hacer otro algoritmo para detectar qué tecla se ha activado después (la tecla que esté "iluminada"). Ahora solo quería practicar el poner el pic en reposo y sacarlo de él volviendo a iniciar el programa.



--- Citar ---
ademas es mejor activar los permisos para las diferente interrupciones y despues activar el permiso global o sea poner la sentencia BSF INTCON,INTE primero y despues la del GIE.


--- Fin de la cita ---

No daría igual hacer una antes que otra sin importar el orden?
Al fin y al cabo sólo se activarán las interrupciones después de haber en el estado sleep, no?



Mi avance

Buscando por ahí he logrado lo siguiente:


--- Código: Text --- #include &#60;system.h&#62; asm {list p=16F84A__config H'3FF1'include        &#34;p16F84A.inc&#34;} void interrupt(void){disable_interrupt(GIE);clear_bit(INTCON,INTF);      //esto en realidad es lo mismo que disable_interrupt, no?asm reset;                         //no se si hago bien con este reset} main(){ int j,k,i,m; set_bit( STATUS, RP0 );            OPTION_REG= 01010000b;set_tris_b(0);clear_bit( STATUS, RP0 ); j=0;PORTB=1; while(1){while(j&#60;3){for(k=0;k&#60;8;k++)  {  for(i=0;i&#60;255;i++)    {    for(m=0;m&#60;55;m++);    }  PORTB = PORTB * 2;  }j++;PORTB=1;} enable_interrupt(INTE);enable_interrupt(GIE); asm{sleep}} }  

De esta manera no me sale ningún error, lo que pasa es que hago el flanco para activar la interrupción y no se si realmente funciona, ya que no vuelve a iniciar el programa... y no he podido hacer modificaciones porque el pic se me ha estropeado ya que llevaba ya muchas grabaciones ... mañana iré a comprar más.


Decidme qué os parece y si tenéis alguna idea. Gracias

xernovil:
Tu y yo también estábamos escribiendo al mismo tiempo Huguen_aus_Tirol jejeje



--- Citar ---Mi consejo:

ORG 0x0
GOTO main

ORG 0x4
ISR
;salvo STATUS y W (atención!! salvar registros sin modificar STATUS!! solución en microchip.com)
;veo que interrupción es y salto según cual sea con un CALL...
;retorno a la linea que sigue:
ISR_END
;repongo los valores de STATUS y W (sin modificar STATUS!! solución en...)
RETFIE

;y sin poner otro ORG...
main
;programa principal....

--- Fin de la cita ---

Te has explicado bien, he probado lo que dices y de todas formas me da el mismo error de overwriting, no se qué hacer  :blink:

Toph:

--- Cita de: "Huguen_aus_Tirol" ---Hola Tania! Estabamos escribiendo al mismo tiempo!! :D
Un detalle: usas ORG 0x0 para el inicio del programa (vector de reset), luego usas un ORG 0x4 para las interrupciones, con un GOTO a algún lado... luego ORG 0x5.
La instrucción GOTO ocupa más de una posición de memoria, por lo tanto el error de sobreescritura al compilar (overwriting...)

--- Fin de la cita ---
:huh: pues no se porque decis esto, esta estructura la he tomado de un libro de microcontroladores y la he  ocupado siempre sin problemas ni errores, aqui dejo un link de uno de tantos programas en lo que he hallado la estructura de org 0, org 4 y org 5  http://pantuflo.escet.urjc.es/~rocapal/pro...a/dado/dado.asm


--- Citar ---No daría igual hacer una antes que otra sin importar el orden?
Al fin y al cabo sólo se activarán las interrupciones después de haber en el estado sleep, no?
--- Fin de la cita ---

NO no es igual siempre, en este caso estas usando solo una interrupcion por lo cual no hay mayor problema pero es mejor acostumbrarse ya que cuando uses mas de una interrupcion si activas las interrupciones globales primero se te puede disparar alguna interrupcion en lo que estas activando otras. por eso tanto yo como  Huguen_aus_Tirol
--- Citar ---Al inicio del programa, no importa que sea C o asm, debes habilitar individualmente las interrupciones y, por último, globalmente (activar GIE)
--- Fin de la cita ---
te recomendamos eso.


--- Citar --- he probado lo que dices y de todas formas me da el mismo error de overwriting, no se qué hacer
--- Fin de la cita ---

ya tomaste encuenta lo que te dije  


--- Citar ---el problema es que  NUNCA se retorna de la interrrupcion
--- Fin de la cita ---

xernovil:

--- Citar ---NO no es igual siempre, en este caso estas usando solo una interrupcion por lo cual no hay mayor problema pero es mejor acostumbrarse ya que cuando uses mas de una interrupcion si activas las interrupciones globales primero se te puede disparar alguna interrupcion en lo que estas activando otras.

--- Fin de la cita ---

Vale, lo tendré en cuenta para mis próximas programaciones  :)



--- Citar ---esta estructura la he tomado de un libro de microcontroladores y la he ocupado siempre sin problemas ni errores

--- Fin de la cita ---

Yo también he visto esta estructura en muchos sitios, el caso es que la he visto siempre que se ha programado únicamente en ASM, quizás me dé estos errores al utilizar este compilador (PicANT IDE) y mezclar los dos lenguajes de programación (C2C y ASM).


--- Citar ---ya tomaste encuenta lo que te dije


--- Citar ---el problema es que  NUNCA se retorna de la interrrupcion

--- Fin de la cita ---

--- Fin de la cita ---


Sí, lo tomo en cuenta, pero al hacer esto

--- Código: Text --- void interrupt(void){disable_interrupt(GIE);clear_bit(INTCON,INTF);      //esto en realidad es lo mismo que disable_interrupt, no?asm reset;                         //no se si hago bien con este reset}  
no estoy reiniciando el programa  con el reset? o quizás falta la rutina de retorno de interrupción RETFIE?

Huguen_aus_Tirol:
Si quieres mediante una senal externa reiniciar tu programa desde 0, no te olvides que el micro tiene una pata de reset... este pin esta ahi para usarlo cuando se quiera ;)
Hay unas banderas que te indican que tipo de reset fue el mas reciente.
Creo que podrias buscar por ese lado la solucion a tu problema...

Tengo que rectificar algo... la instruccion GOTO ocupa una direccion de memoria, necesita dos ciclos para ejecutarse... perdon por la equivocacion :whistling:

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa