hunch
Sospecho que el problema está aquí:
#define ARRAY_SIZE 576
float I_1[ARRAY_SIZE]; //My huge array
Dado que cada flotador usa 4 bytes y cada doble usa 8 bytes,
esto es asignar una única matriz que utiliza más de 2 000 bytes de RAM.
El PIC18F4520 tiene 1 536 bytes de RAM, lo que no es suficiente para almacenar toda la matriz, mucho menos la matriz más todas las demás variables utilizadas en su programa.
Así que debes
- actualice a una MCU más grande con más RAM en chip, o
- de alguna manera adjunta algún tipo de RAM fuera de chip, o
- encuentre una manera de usar menos RAM (quizás un ARRAY_SIZE más pequeño, o tal vez usando algún tipo de datos de 16 u 8 bits que requiera menos RAM por elemento en la matriz, o tal vez de alguna manera almacene parte de esos datos en FLASH) , o ...)
o alguna combinación de lo anterior.
otros comentarios
Muchos profesores de lenguaje de programación C pasan mucho tiempo explicando que se puede acceder a los arreglos pueden utilizando los punteros.
Al igual que muchos profesores de química dedican mucho tiempo a explicar cómo las moléculas pueden se pueden construir a partir de átomos individuales.
Al igual que muchos profesores de física pasan mucho tiempo explicando cómo los átomos pueden se pueden construir a partir de protones y neutrones individuales.
Aunque hacerlo de esta manera puede ser muy educativo, es innecesariamente complicado y por lo general hay una forma más simple y mejor de obtener el resultado final deseado.
(Hay casos en los que necesitas usar punteros, pero este no parece ser uno de ellos).
Una habilidad importante en la depuración es tomar un programa con un error conocido y descubrir el paso exacto donde las cosas parecen ir mal.
Parece que piensas que el problema está en línea
I_1_ptr[i] = IL_1 - IO_1 * (exp(Q * V_1/ (NS * N * K * temperature)) - 1.0) - V_1/Rsh;
Esa línea hace muchas cosas. Es difícil para un depurador de un solo paso averiguar exactamente qué cosa está mal en una línea tan complicada.
Si tuviera este problema, mi primera acción sería dividir esa línea en un grupo de líneas más pequeñas y luego en un solo paso a través de esas líneas más pequeñas y simples para reducir dónde está el problema.
Quizás algo como
float denominator;
float ratio;
float temp1;
float temp2;
//...
denominator = NS * N * K * temperature;
ratio = Q * V_1 / denominator;
temp_1 = exp(ratio) - 1.0;
temp_2 = IL_1 - IO_1 * temp_1 - V_1/Rsh;
I_1[i] = temp2; // normal array access -- pointers not necessary here.
y compruebe que está obteniendo los valores esperados en cada paso.
¿Qué paso está dando resultados inesperados?
Una habilidad importante en la depuración es reducir un programa grande con un error conocido a un programa muy pequeño que exhibe el mismo error.
¿Podría recortar las partes de su programa antes y después de la línea que hace algo inesperado? quizás configurando las variables antes de esa línea a un valor constante en lugar de realizar largas series de cálculos, para darnos un muy breve , pero programa completo que da el comportamiento inesperado?