Autor Tema: Interrupciones dobles, triples 16f  (Leído 3866 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Interrupciones dobles, triples 16f
« en: 20 de Mayo de 2007, 01:03:08 »
puedo manejar una interrupcion por RB0 (externa) y por TMR0 a la vez verdad?, pero como funciona, digamos, que ha ocurrido una interrupcion externa, esta ejecutando, no ha terminado y el timer ha desbordado, ocurre interrupcion por TMR0 y qeu pasa??, si no termino de ejecutar la rutina de INT EXT espera a terminar o atiende la interrupcion del TMR0, y si fuera al otro lado, si ejecuta TMR0, no acaba y ocurrio una INT EXT???

y si le aumento una tercera? jaja, una por TMR1 digamos o por A/D, etc.

una ultima, el TMR0 o TMR1 sigue incrementando si se ejecuta su misma rutina de interrupción o si se ejecuta la de INT EXT digamos?? porque si dejara de incrementarse no ocurriria desborde en cuanto ejecute una EXT o cualquiera, por ejemplo, lo cual no es lógico, cierto??

bueno disculpas por el desorden es que se me complica todo en el closet cuando pienso en eso, muchas gracias. adios.
.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Interrupciones dobles, triples 16f
« Respuesta #1 en: 20 de Mayo de 2007, 01:47:44 »
Hola Cryn.

puedo manejar una interrupcion por RB0 (externa) y por TMR0 a la vez verdad?, pero como funciona, digamos, que ha ocurrido una interrupcion externa, esta ejecutando, no ha terminado y el timer ha desbordado, ocurre interrupcion por TMR0 y qeu pasa??, si no termino de ejecutar la rutina de INT EXT espera a terminar o atiende la interrupcion del TMR0, y si fuera al otro lado, si ejecuta TMR0, no acaba y ocurrio una INT EXT???

y si le aumento una tercera? jaja, una por TMR1 digamos o por A/D, etc.

En la familia 16F, si sucede primero una interrupción "A" y mientras se esta ejecutando la rutina de "A" ocurren supongamos las interrupciones "B" y "C", se setean las banderas(flags) de las interrupciones "B" y "C", pero el PIC no las atiende inmediatamente debido a que, normalmente(y debería ser siempre excepto casos extremos) la bandera de interrupción global(INTCON,GIE) es automáticamente deshabilitada al ingresar al producirse la primera interrupción.
Entonces, cuando el código rehabilite la interrupcin global(INTCON,GIE), si las banderas de las interrupciones "B" y "C" continúan afectadas, el PIC volverá inmediatamente a ingresar a la rutina de interrupción y atenderá a la primera que hayas puesto(tal vez el CCS decida el orden, deberías ver el código assembler que genera o investigar).

Lo que si te puedo decir, es que puede haber conflictos al utilizar múltiples interrupciones(incluso usando tan sólo una*), especialmente cuando se producen demasiado seguido. Hay que ser cuidadoso y optimizar la atención del microcontrolador.

No sé cómo administrará el CCS el asunto de las banderas, habilitación/deshabilitación del INTCON,GIE, etc como para poder asesorarte completamente en el tema. Deberias fijarte qué código assembler genera y analizarlo.

*En caso de limpiar el flag de la interrupción apenas se ingresa a la rutina de interrupción, y cuando la rutina de la interrupción lleva más tiempo que el que tarda en volver a producirse la mísma. En este caso, puede que el uC pierda eventos y no ejecute absolutamente nada que no sea código dentro de la interrupción(no logra "escaparse" de la interrupción ya que cuando intenta salir, vuelve a ingresar por lo que no ejecuta nada del programa principal(¡un problemón!).

una ultima, el TMR0 o TMR1 sigue incrementando si se ejecuta su misma rutina de interrupción o si se ejecuta la de INT EXT digamos?? porque si dejara de incrementarse no ocurriria desborde en cuanto ejecute una EXT o cualquiera, por ejemplo, lo cual no es lógico, cierto??

Si. Siguen incrementándose. Si afectás a su registro contador, el mísmo no contará durante un pequeño lapso de tiempo pero luego comenzará nuevamente sin parar.

Tal vez algún RTOS te de una solución magistral en este caso.

Éxitos.
« Última modificación: 20 de Mayo de 2007, 01:57:10 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado piktron

  • PIC10
  • *
  • Mensajes: 4
Re: Interrupciones dobles, triples 16f
« Respuesta #2 en: 02 de Junio de 2007, 13:22:50 »
Saludos Pioneros

Disculpen, entonces ¿si se puede hacer lo que dice Cryn? Ya que tengo en mente esto: al ejecutarse la interrupcion externa capture una serie de datos, luego ya capturados, los retenga y espere otros datos por medio de otra interrupcion externa hasta un numero fijo de series de datos. Ahora por cada tiempo de espera el TMR0 de un tiempo para ingresarle el siguiente dato sino borre los datos almacenados :mrgreen:

Almenos esto es lo que no he hecho (como no tengo mucho tiempo trabajando con pic) y fuera de fabula hacerlo. :-/ :-/
EL QUE BUSCA ENCUENTRA..... sino siguele buscando

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Interrupciones dobles, triples 16f
« Respuesta #3 en: 02 de Junio de 2007, 14:15:49 »
a mi me parece muy posible amigo  :-/ cuando te animas a implementarlo¿?
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Interrupciones dobles, triples 16f
« Respuesta #4 en: 02 de Junio de 2007, 14:26:43 »
Antes que nada, bruno, lo explicaste genial.

No sé cómo administrará el CCS el asunto de las banderas, habilitación/deshabilitación del INTCON,GIE, etc como para poder asesorarte completamente en el tema. Deberias fijarte qué código assembler genera y analizarlo.
La verdad nunca se me ocurrió habilitar el GIE mediante un INTCON,GIE durante la rutina de interrupción, tengo entendido que solo se debe hacer mediante un RETFIE en el 100 de los casos.

En estas cosas los C suelen ser pobres y mucho menos eficientes que un assembler.  El que está acostumbrado al assembler se encuentra en aprietos en estos momentos.

En C18 lo resolvieron simple... se hace en assembler con un "goto" después de leer el flag directamente a la función en C que atiende la interrupción.

*En caso de limpiar el flag de la interrupción apenas se ingresa a la rutina de interrupción, y cuando la rutina de la interrupción lleva más tiempo que el que tarda en volver a producirse la mísma. En este caso, puede que el uC pierda eventos y no ejecute absolutamente nada que no sea código dentro de la interrupción(no logra "escaparse" de la interrupción ya que cuando intenta salir, vuelve a ingresar por lo que no ejecuta nada del programa principal(¡un problemón!).

Exacto y si eso ocurre es que "algo" o "mucho" está mal diseñado:

a) El diseño en sí (analizar porqué se producen realmente los eventos en ese orden, si realmente es así o es provocado por un mal diseño del hardware o del tipo de solución que obliga a que eso ocurra). 
b) El clock del microcontrolador no es suficiente.  Si estamos al límite solo nos queda cambiar el micro por uno que vaya más rápido.


Tal vez algún RTOS te de una solución magistral en este caso.
Los RTOS no son buenos para manejar "timings" ajustados como se puede hacer con codificar directamente al micro sin el sistema operativo. 

Creo que el nicho de aplicaciones en que va un RTOS es cuando la atención de los eventos no es tan histérica que tengamos que pensar en qué sucede si tal o cual cosa pasan a 5 microsegundos de diferencia.  Funcionan y muy bien para facilitar la gestión de tareas que no son tan rápidas y consecutivas como eventos diversos...

Recuerdo haber leído un artículo sobre RTlinux donde comentaban que les era difícil atender eventos en menos de 50microsegundos en un Pentium 4 a 3GHz!! 

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Interrupciones dobles, triples 16f
« Respuesta #5 en: 02 de Junio de 2007, 14:28:36 »
a mi me parece muy posible amigo  :-/ cuando te animas a implementarlo¿?

¿Le hablas a cryn o a piktron?  :shock: :shock:

Citar a lo que uno se refiere ayuda a evitar confusiones  :mrgreen: :mrgreen:
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Interrupciones dobles, triples 16f
« Respuesta #6 en: 02 de Junio de 2007, 14:30:02 »
Saludos Pioneros

Disculpen, entonces ¿si se puede hacer lo que dice Cryn? Ya que tengo en mente esto: al ejecutarse la interrupcion externa capture una serie de datos, luego ya capturados, los retenga y espere otros datos por medio de otra interrupcion externa hasta un numero fijo de series de datos. Ahora por cada tiempo de espera el TMR0 de un tiempo para ingresarle el siguiente dato sino borre los datos almacenados :mrgreen:

Almenos esto es lo que no he hecho (como no tengo mucho tiempo trabajando con pic) y fuera de fabula hacerlo. :-/ :-/

Es que no es algo que ocurren en simultáneo.  Podrías habilitar una interrupción y luego la otra cuando termine la primera y asunto solucionado.

Hasta te diría que dependiendo de cómo sea el resto del software, probablemente no necesites usar interrupciones.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Interrupciones dobles, triples 16f
« Respuesta #7 en: 28 de Junio de 2007, 16:21:45 »
Hola a todos, estaba leyendo y buscando y creo que es aquí donde es adecuado postear mi duda...  pues trata casi de lo mismo...

ya tengo un codigo con 2 interrupciones activas....  una PSP (que es la atencion a una comunicacion en bus paralelo, muy buena para comunicarme con un 8051 que tengo  operando como cerebro de un sistema y el pic funge como periferico) y una interrupcion del timer0...  voy a poner aqui el codigo y luego lo explico
Citar
#include <16F877A.h>
#FUSES NOWDT                    //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#priority psp,rtcc

int8 j;
int8 valor,salida[4]={0x0A,0x0A,0x0A,0x0A};
//*************************************************************************
//*************************************************************************
#INT_PSP   //Interrupcion del Parallel Slave Port
void Adquierelo()
{   
      disable_interrupts(GLOBAL);
      valor=psp_data; 
      switch(Valor&0x0F)
         {
         case 0x00:
            salida[3]=(valor&0xF0)/0x10;
            break;
         case 0x04:
            salida[2]=(valor&0xF0)/0x10;
            break;
         case 0x08:
            salida[1]=(valor&0xF0)/0x10;
            break;
         case 0x0C:
            salida[0]=(valor&0xF0)/0x10;
            break;
         case 0x0F:
            salida[0]=0x0A;           
            salida[1]=0x0A;
            salida[2]=0x0A;
            salida[3]=0x0A;
            break;
         }

     enable_interrupts(GLOBAL);


     
}
//*************************************************************************
#int_TIMER0
void muestralo()
{
int8 Numeros[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x00,0x00,0x20,0x00,0x00};
/*
  Numero\Equi  B7  B6  B5  B4  B3  B2  B1  B0          |      B0         ---
        0             0   0   1   1   1   1   1   1   0x3F         |  B6    B1   |     |
        1             0   0   0   0   0   1   1   0   0x06         |      B5         ---
        2             0   1   0   1   1   0   1   1   0x5B        |  B4    B2    |     |
        3             0   1   0   0   1   1   1   1   0x4F         |     B3          ---
        4             0   1   1   0   0   1   1   0   0x66         |
        5             0   1   1   0   1   1   0   1   0x6D
        6             0   1   1   1   1   1   0   1   0x7D
        7             0   0   0   0   0   1   1   1   0x07
        8             0   1   1   1   1   1   1   1   0x7F
        9             0   1   1   0   1   1   1   1   0x6F   
        A             0   0   0   0   0   0   0   0   0x00

  */

  int8 i;

  Output_B(0x00);
  switch(i)
   {
      case 0:
         output_high(PIN_A0);
         output_low(PIN_A1);
         output_low(PIN_A2);
         output_low(PIN_A3);
         output_B(Numeros[salida[0]]);       
      break;
      case 1:
         output_low(PIN_A0);
         output_high(PIN_A1);
         output_low(PIN_A2);
         output_low(PIN_A3);
         output_B(Numeros[salida[1]]);       
      break;
      case 2:
         output_low(PIN_A0);
         output_low(PIN_A1);
         output_high(PIN_A2);
         output_low(PIN_A3);
         output_B(Numeros[salida[2]]);         
      break;
      case 3:
         output_low(PIN_A0);
         output_low(PIN_A1);
         output_low(PIN_A2);
         output_high(PIN_A3);
         output_B(Numeros[salida[3]]);       
   }
 i++;
 if(i>3)
   i=0;

 set_timer0(0xE0);
}


//============================================================================
//////////////////////////////////////////////////////////////////////////////
void main()
{
   for(j=1;j<7;j++)
   {   
      output_high(PIN_B7);
      delay_ms(100);
      output_low(PIN_B7);
      delay_ms(100); 
   }   


   setup_psp(PSP_ENABLED);
   setup_adc_ports(NO_ANALOGS);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_PSP);
   enable_interrupts(INT_TIMER0);
   
   
   output_low(PIN_B7); 
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
   port_b_pullups(TRUE);
   
   set_timer0(255);
   
   while(1)
      {

      ;

      }
}

Bueno, lo tipico, fuses y cabecera...

Luego, esta el procedimiento del PSP... esto implica que el Intel8051 quiere escribirle datos al PIC, y lo activa por medio del CS1... (si desean les cuento la configuracion) bueno, el hecho es que la parte alta del valor de 8 bit escrito trae el dato como tal... (un numero del 0 al F) y la parte baja indica cual tipo de valor se esta recibiendo (dato Tipo 0=0x00, Dato tipo 1=0x04 (0100),dato tipo 2=0x08 (1000) o dato tipo 3=0x0C (1100)) allí el PIC decide en qué posicion de un arreglo lo guarda... por ejemplo, si envio desde el 8051 un valor 0x48 ---> en la posicion 2 del arreglo escribo un 0x04...   eso es lo que pasa en la interrupcion....

En el siguiente procedimiento, tomo el arreglo  cada vez que se activa el timer0, coloco ese dato en un 7 segmentos que tengo conectado al puerto B (excepto B7), con esto logro el multiplexado en el tiempo de la informacion de 4 siete segmentos... cada vez que se activa el timer 0...  cuando se activa e "i"=0 enciendo el catodo comun del primer 7seg y coloco el dato Arreglo[0], en la siguiente vez, i=1, enciendo el segundo 7 seg y coloco en el el el dato correspondiente (Arreglo[1]) y así... repito por siempre

En el main configuro las interrupciones pero antes hago una rutinita de encender y apagar un led conectado a B7 unas cuantas veces, solo para verificar, al encender el sistema completo, que el periferico inicio correctamente

todo funciona bien cuando prendo..  led titila y se apaga ritmicamente y se pone en espera (apagado)... luego mando una cifra completa y la muestra en el 7 segmentos...  AHORA SE PREGUNTARAN DONDE DEMONIOS ESTA EL DRAMA?

pues aqui al ratico, el led empieza a prender como loco, irregularmente, es como que el PIC se reinicia y se reinicia constantemente, tanto que no termina la rutina de encendido y se ve una secuencia totalmente loca en el led, se queda prendido, se apaga milisegundos, se vuelve a prender y apagar....   una locura....  se que debe ser un problema de las interrupciones pues si deshabilito las interrupciones al entrar en cada una, y las rehabilito al salir, el problema se resuelve, solo que no se mantiene el valor visualizado en los 7 segmentos...

Si alguien tiene alguna idea.....
« Última modificación: 28 de Junio de 2007, 16:28:54 por Dancrazy »
Daniel 
Caracas, Venezuela 

-----------------

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Interrupciones dobles, triples 16f
« Respuesta #8 en: 28 de Junio de 2007, 16:53:29 »
Hola. No miré a fondo tu programa, ¡pero estás declarando variables como locales cuando deberían ser globales!

A ver si así te funciona:

Código: C
  1. #include <16F877A.h>
  2. #FUSES NOWDT                    //Watch Dog Timer
  3. #FUSES XT                       //Crystal osc <= 4mhz
  4. #FUSES NOPUT                    //No Power Up Timer
  5. #FUSES NOPROTECT                //Code not protected from reading
  6. #FUSES NODEBUG                  //No Debug mode for ICD
  7. #FUSES NOBROWNOUT               //No brownout reset
  8. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  9. #FUSES NOCPD                    //No EE protection
  10. #FUSES NOWRT                    //Program memory not write protected
  11.  
  12. #use delay(clock=4000000)
  13. #priority psp,rtcc
  14.  
  15. int8 j;
  16. int8 i;
  17. int8 valor;
  18. int8 salida[4]={0x0A,0x0A,0x0A,0x0A};
  19.  
  20. Const int8 Numeros[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x00,0x00,0x20,0x00,0x00};
  21. /*
  22.   Numero\Equi  B7  B6  B5  B4  B3  B2  B1  B0          |      B0         ---
  23.         0             0   0   1   1   1   1   1   1   0x3F         |  B6    B1   |     |
  24.         1             0   0   0   0   0   1   1   0   0x06         |      B5         ---
  25.         2             0   1   0   1   1   0   1   1   0x5B        |  B4    B2    |     |
  26.         3             0   1   0   0   1   1   1   1   0x4F         |     B3          ---
  27.         4             0   1   1   0   0   1   1   0   0x66         |
  28.         5             0   1   1   0   1   1   0   1   0x6D
  29.         6             0   1   1   1   1   1   0   1   0x7D
  30.         7             0   0   0   0   0   1   1   1   0x07
  31.         8             0   1   1   1   1   1   1   1   0x7F
  32.         9             0   1   1   0   1   1   1   1   0x6F    
  33.         A             0   0   0   0   0   0   0   0   0x00
  34.  
  35.   */
  36.  
  37. //*************************************************************************
  38. //*************************************************************************
  39. #INT_PSP   //Interrupcion del Parallel Slave Port
  40. void Adquierelo()
  41. {    
  42.       disable_interrupts(GLOBAL);
  43.       valor=psp_data;  
  44.       switch(Valor&0x0F)
  45.          {
  46.          case 0x00:
  47.             salida[3]=(valor&0xF0)/0x10;
  48.             break;
  49.          case 0x04:
  50.             salida[2]=(valor&0xF0)/0x10;
  51.             break;
  52.          case 0x08:
  53.             salida[1]=(valor&0xF0)/0x10;
  54.             break;
  55.          case 0x0C:
  56.             salida[0]=(valor&0xF0)/0x10;
  57.             break;
  58.          case 0x0F:
  59.             salida[0]=0x0A;            
  60.             salida[1]=0x0A;
  61.             salida[2]=0x0A;
  62.             salida[3]=0x0A;
  63.             break;
  64.          }
  65.  
  66.      enable_interrupts(GLOBAL);
  67.  
  68.  
  69.      
  70. }
  71. //*************************************************************************
  72. #int_TIMER0
  73. void muestralo()
  74. {
  75.   Output_B(0x00);
  76.   switch(i)
  77.    {
  78.       case 0:
  79.          output_high(PIN_A0);
  80.          output_low(PIN_A1);
  81.          output_low(PIN_A2);
  82.          output_low(PIN_A3);
  83.          output_B(Numeros[salida[0]]);        
  84.       break;
  85.       case 1:
  86.          output_low(PIN_A0);
  87.          output_high(PIN_A1);
  88.          output_low(PIN_A2);
  89.          output_low(PIN_A3);
  90.          output_B(Numeros[salida[1]]);        
  91.       break;
  92.       case 2:
  93.          output_low(PIN_A0);
  94.          output_low(PIN_A1);
  95.          output_high(PIN_A2);
  96.          output_low(PIN_A3);
  97.          output_B(Numeros[salida[2]]);          
  98.       break;
  99.       case 3:
  100.          output_low(PIN_A0);
  101.          output_low(PIN_A1);
  102.          output_low(PIN_A2);
  103.          output_high(PIN_A3);
  104.          output_B(Numeros[salida[3]]);        
  105.    }
  106.  i++;
  107.  if(i>3)
  108.    i=0;
  109.  
  110.  set_timer0(0xE0);
  111. }
  112.  
  113.  
  114. //============================================================================
  115. //////////////////////////////////////////////////////////////////////////////
  116. void main()
  117. {
  118.    for(j=1;j<7;j++)
  119.    {  
  120.       output_high(PIN_B7);
  121.       delay_ms(100);
  122.       output_low(PIN_B7);
  123.       delay_ms(100);  
  124.    }  
  125.  
  126.  
  127.    setup_psp(PSP_ENABLED);
  128.    setup_adc_ports(NO_ANALOGS);
  129.    enable_interrupts(GLOBAL);
  130.    enable_interrupts(INT_PSP);
  131.    enable_interrupts(INT_TIMER0);
  132.    
  133.    
  134.    output_low(PIN_B7);  
  135.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
  136.    port_b_pullups(TRUE);
  137.    
  138.    set_timer0(255);
  139.    
  140.    while(1)
  141.       {
  142.  
  143.       ;
  144.  
  145.       }
  146. }
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Interrupciones dobles, triples 16f
« Respuesta #9 en: 28 de Junio de 2007, 17:19:53 »
Diablos!!!!  teneis razón...  de hecho, ahora que lo veo, no tengo ni idea de como funcionaba, aunque fuese a medias!!!!

mejoró, sustancialmente...  aun tiene alguna fallita, pero es mínima...

llevo dos dias mirando el mismo código, y no me habia percatado de ese error tan simple...
de hecho, el codigo en los 7segmentos no se debia haber visto, porque el sistema se debia haber perdido....

bueno, el led titila de vez en cuando... pero mucho menos... eso es un gran progreso, dado que el valor persiste el tiempo indicado... seguire viendo...  aun se reinicia el PIC, pero es menos frecuente

de verdad muchisimas gracias!!!!!

« Última modificación: 28 de Junio de 2007, 17:23:38 por Dancrazy »
Daniel 
Caracas, Venezuela 

-----------------

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Interrupciones dobles, triples 16f
« Respuesta #10 en: 02 de Julio de 2007, 11:10:36 »
SOLUCION A MI PROBLEMA....

Como siempre han contribuido a mis soluciones, al hayar yo mismo la respuesta, la quiero postear por si acaso a alguien le ocurre, sepa de que se trata y no sufra como yo....

El problema de que el sistema se reiniciaba y a veces se detenia por completo, estaba en el lugar mas obvio y se detectaba con el elemento mas comun...  Un triste tester.

<el problema es que todo mi sistema (El INTEL8051, un LCD, un teclado, un buzzer, un Pic 16F877A, tres 7 segmentos, dos RAM y  un RTC y otros integrados) se alimenta de un Adaptador de 12V 300mA que pasa por un L7805 que tiene sus respectivos condensadores de tantalio de 0,33 y 0,1 uF y su disipador...  el problema es que a los 5 minutos de operacion, el sistema completo alcanza un consumo tal que el 7805 se desbalancea y empieza a regular a 6,3 Volts y esta tension de alimentacion vuelve loco al PIC!!!!!! al colocar un zener de 5,1 y una resistencia, y otro disipador mas grande, se soluciona... Claro, el 7805 es bueno, pero no es milagroso...

Solo me di cuenta cuando se me ocurrio (como por ocio) poner un tester entre VCC y GND en el PIC...  un conflicto tontisimo...  pero nunca se me hubiese ocurrido...

Quiero agradecer especialmente a BrunoF por su excelente observacion, que me ayudó a corregir un error de programacion importante...

Saludos
Daniel 
Caracas, Venezuela 

-----------------

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Interrupciones dobles, triples 16f
« Respuesta #11 en: 02 de Julio de 2007, 12:05:05 »
Amigo si te pasa eso, es probable que no le estes consumiendo 300mA sino mucho más.

También si te regula a 6.3 V, no me queda otra que pensar en que te está oscilando el regulador.  Ponerle "capacitores" grandes antes y después no es precisamente lo aconsejable.  Los de .1uF son para evitar oscilaciones pero si al lado le pones otro grandote... aumentas las chances de oscilaciones.

PD: si consumes 1A o más , hay integrados que soportan esa corriente en formato similar. 

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Dancrazy

  • PIC16
  • ***
  • Mensajes: 134
Re: Interrupciones dobles, triples 16f
« Respuesta #12 en: 02 de Julio de 2007, 12:32:43 »
Si, estoy de acuerdo...  pense que el regulador estaba ya a punto de morir, pues es uno de mis mas antiguos...

lo sustituí, y oh sorpresa, sigue saliendo 6,3 volts...  pense que algun elemento estaba sobrecargando o actuando como elemento activo y sumando tension, asi que desconecté todo y probé la tension a la salida con sólo Regulador y sus respectivos condensadores... de nuevo 6,3 Volts... 

lo que me extraña es que el resto del circuito (el Intel8051, los integrados logicos, las memorias, el lcd y el max232) funciona bien, pero a la parte del circuito que tiene el PIC no, luego le puse un segundo regulador a esta seccion del sistema(como si estuviese en cascada con el primero) con el zener y funciona bien...

voy a probar si es el adaptador que falla... esta dando 16 volts, lo cual me parece excesivo.. sé que regularmente dan una tension superior a la marcada (que es 9 volts) para absorver el efecto de carga del circuito a alimentar, pero el doble me parece excesivo....

dejame probar a ver....

creo que el circuito consume cerca a los 800 mA, dado que el 8051, memorias y sus componentes estan garantizados a 150mA maximo... 120mA del LCD, y 70mA del conjunto de  7Segmentos (estan multiplexados) y los consumos de la mayoria de los integrados (son 74HC) es minima, el PIC dice el datasheet que maximo puede pedir 250mA + 25mA por pin usado (175mA por 7 pines)...  de todas formas que opinas?   en una pagina leí que puede ser bueno poner una resistencia de 7 ohms antes del regulador, mas o menos lo que habia pensado, sólo que yo pensé un zener en paralelo...

cosas de la vida, yo pense que era problemas de interrupciones...


« Última modificación: 02 de Julio de 2007, 12:41:06 por Dancrazy »
Daniel 
Caracas, Venezuela 

-----------------