Autor Tema: Las cositas del CCS  (Leído 2245 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re:Las cositas del CCS
« Respuesta #15 en: 08 de Junio de 2022, 08:18:15 »
Hola, ya va por la version 5.109.... :D

Hola muchacho  :mrgreen:

Si, si, pero imagino que Manolo la estará compilando con alguna de las últimas por eso le ofrezco hacerlo con algunas antiguas que tengo por aquí  :D
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Las cositas del CCS
« Respuesta #16 en: 08 de Junio de 2022, 09:20:00 »
El problema está en el reset de las variables Indmuestra y capturado.
Cuando terminás el cálculo activás calculado, pero capturado se resetea recién con #la INT_EXT --> Iniciará otro cálculo, pero como la interrupción e #INT_TIMER2 le alterarán Indmuestra hará cualquier cosa.

Lo solucionás agregando
Citar
            capturado=0;
            IndMuestra=0;
al final del cálculo,  aunque no es del todo prolijo porque en #INT_TIMER2 se sigue haciendo conversiones.


Con el delay de 10ms andaba porque la #INT_EXT reseteaba capturado antes del primer cálculo.
« Última modificación: 08 de Junio de 2022, 09:25:27 por Eduardo2 »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Las cositas del CCS
« Respuesta #17 en: 08 de Junio de 2022, 12:59:10 »
El problema está en el reset de las variables Indmuestra y capturado.
Cuando terminás el cálculo activás calculado, pero capturado se resetea recién con #la INT_EXT --> Iniciará otro cálculo, pero como la interrupción e #INT_TIMER2 le alterarán Indmuestra hará cualquier cosa.

Lo solucionás agregando
Citar
            capturado=0;
            IndMuestra=0;
al final del cálculo,  aunque no es del todo prolijo porque en #INT_TIMER2 se sigue haciendo conversiones.


Con el delay de 10ms andaba porque la #INT_EXT reseteaba capturado antes del primer cálculo.

En pocas palabras. Usar un delay, desactiva todas las interrupciones (bandera GIE = 0) hasta finalizar el retardo. Sin el delay, la interrupción sucede mucho más antes que 10 ms y aparece el problema.

¿Estoy en lo correcto?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Las cositas del CCS
« Respuesta #18 en: 08 de Junio de 2022, 13:16:28 »
....
En pocas palabras. Usar un delay, desactiva todas las interrupciones (bandera GIE = 0) hasta finalizar el retardo. Sin el delay, la interrupción sucede mucho más antes que 10 ms y aparece el problema.

¿Estoy en lo correcto?
No, la desacticación es/era un bug de CCS con algunos micros, en este caso no se desactivan.

Acá pasa que cuando termina de hacer el cálculo, como capturado sigue activado se ejecuta de nuevo. Pero como las interrupciones te cambian Indmuestra el for se termina donde lo agarre.
Con el delay de 10ms , llegaba antes la interrupción externa y resetea capturado.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Las cositas del CCS
« Respuesta #19 en: 09 de Junio de 2022, 02:30:41 »

Acá pasa que cuando termina de hacer el cálculo, como capturado sigue activado se ejecuta de nuevo. Pero como las interrupciones te cambian Indmuestra el for se termina donde lo agarre.
Con el delay de 10ms , llegaba antes la interrupción externa y resetea capturado.


Aquí me diste la pista definitiva Eduardo2. Efectivamente era lo que pasaba.
Lo he resuelto añadiendo una condición adicional, así:
      if ((capturado) && (!calculado)) {     

Muchísimas gracias

Código: C
  1. #include <18F1320.h>
  2. #device ADC=10
  3. #device HIGH_INTS=TRUE
  4. #include "math.h"
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6.  
  7. #use delay(internal=8MHz)
  8. #use rs232(baud=115200,parity=N,bits=8,stream=PORT1, xmit=PIN_B1, rcv=PIN_B4)
  9.  
  10. #define SALIDA             PIN_B3
  11. #define MUESTRASENCICLO      72
  12. #define NUMMUESTRAS        MUESTRASENCICLO*10   // Cada onda a 50Hz está dividida en 36 muestras. Cogemos 10 ondas
  13.  
  14. #define  OFFSET      512.0       // Restamos 512 porque la señal tiene un offset de 2.5V
  15. #define  AJUSTAADC   5.0/1024.0  // 5V a 10bits de resolución
  16.  
  17. unsigned int16 muestras[50];
  18.  
  19. int16 buffer, objetivo;
  20. float onda, consumo;
  21. int16 potencia;
  22.  
  23. unsigned int8 capturado, calculado;
  24. unsigned int8 contadorPWM, cortePWM;
  25. unsigned int8 IndMuestra=0;
  26.  
  27. #INT_RDA HIGH
  28. void intser()
  29. {
  30.    char c;
  31.    
  32.    c = getc();
  33.  
  34.    if ((c>='0') && (c<='9'))
  35.       buffer = buffer*10 + c - '0';
  36.    
  37.    if ((c == '\r')) {
  38.       objetivo = buffer;
  39.       buffer=0;
  40.    }
  41.    
  42.    if (c=='0')
  43.       output_low(SALIDA);
  44.    if (c=='1')
  45.       output_high(SALIDA);
  46.    // Como la interrupción RDA habrá interrumpido la lectura de la onda, empezamos de nuevo
  47.    IndMuestra=0;
  48.    onda = 0;
  49.    
  50. }
  51.  
  52. #INT_EXT
  53. void cruce_por_cero() {
  54.    
  55.    output_low(SALIDA);
  56.    set_timer2(0);
  57.    contadorPWM=0;
  58.    
  59.    if (!capturado) {
  60.       capturado=1;
  61.    }
  62.    
  63.    if (calculado) {
  64.       calculado=0;
  65.       capturado=0;
  66.       IndMuestra=0;
  67.    }
  68. }
  69.  
  70.  
  71. #INT_TIMER2
  72. void LeerADC() {
  73.    if ((!capturado) && (IndMuestra<50)){
  74.       muestras[IndMuestra]=read_adc();
  75.       IndMuestra++;
  76.    };
  77.    if (contadorPWM++ == cortePWM) {
  78.        output_high(SALIDA);
  79.    }
  80. }
  81.  
  82.  
  83. void main()
  84. {
  85.    int8 i;
  86.    int16 v;
  87.    float corriente;
  88.    int16 SumaMuestras;
  89.    
  90.    setup_adc_ports(sAN0, VSS_VDD);
  91.    setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_0);
  92.    output_low(SALIDA);
  93.    setup_timer_2 (T2_DIV_BY_1,198,2); // 187 para 36 ciclos
  94.    output_float(PIN_B0);
  95.    output_float(PIN_B4);
  96.    set_adc_channel(0);
  97.    onda = 0;
  98.    IndMuestra=0;
  99.    contadorPWM=0;
  100.    enable_interrupts(INT_TIMER2);
  101.    enable_interrupts(INT_RDA);
  102.    enable_interrupts(INT_EXT);
  103.    enable_interrupts(GLOBAL);
  104.    delay_ms(50);
  105.    objetivo = 0;
  106.    cortePWM=25;
  107.    
  108.    while (1) {
  109.       if ((capturado) && (!calculado)) {    
  110.          onda=0;
  111.          SumaMuestras=0;
  112.          if (IndMuestra==50) {
  113.             for (i=0;i<IndMuestra;i++) {
  114.                corriente =  (muestras[i]-OFFSET)*AJUSTAADC * 4.6;
  115.                SumaMuestras+=muestras[i];
  116.                muestras[i]=0;
  117.                onda = onda + corriente*corriente;
  118.             }
  119.             if (!SumaMuestras) {// eliminamos el ruido
  120.                consumo=0.0;
  121.                potencia = 0;
  122.             } else {
  123.                consumo = sqrt(2*onda/IndMuestra);
  124.                potencia = (int16)(consumo * 181.0);
  125.             }
  126.             //printf ("%u -> %6.2fA -> %4luW. Obj %lu - CortePWM %u\n", IndMuestra, consumo, potencia, objetivo, cortePWM);
  127.             printf ("%4lu\n", potencia);
  128.          }
  129.          if ((potencia<objetivo) && (cortePWM>0))
  130.             cortePWM--;
  131.          if ((potencia>objetivo) && (cortePWM<49))
  132.             cortePWM++;
  133.          calculado=1;
  134.       }
  135.     }
  136.  }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Las cositas del CCS
« Respuesta #20 en: 09 de Junio de 2022, 02:31:15 »
Perdón, señores del CCS. Esta vez la culpa no fue vuestra  :D

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re:Las cositas del CCS
« Respuesta #21 en: 09 de Junio de 2022, 04:08:02 »
Perdón, señores del CCS. Esta vez la culpa no fue vuestra  :D

Bien está lo que bien acaba  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania