Una cosa importante acerca de este tema de la RAM y los Reset's.
En CCS C si declaras una variable de la forma
int8 MyVar no se perderá su valor tras un Reset producido por un pulso a LOW del Pin MCLR del PIC, pero si declaras esta misma variable en la forma
STATIC int8 MyVar si que lo perderas ya que al declararla
STATIC el compilador añade su puesta a 0x00 en el bloque inicial del programa, el que se ejecuta al principio tras un reset.
Esto se puede ver muy fácilmente con el siguiente simplísimo código C
#include <18F2550.h>
#fuses HS,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=20000000)
int8 MyVar;
void main() {
do {
MyVar = 0x000;
} while (TRUE);
}
Al compilarlo genera el siguiente ASM
0000: GOTO 0004
0004: CLRF FF8
0006: BCF FD0.7
0008: CLRF FEA
000A: CLRF FE9
000C: MOVF FC1,W
000E: ANDLW C0
0010: IORLW 0F
0012: MOVWF FC1
0014: MOVLW 07
0016: MOVWF FB4
.................... do {
.................... MyVar = 0x000;
0018: CLRF 05
.................... } while (TRUE);
.................... }
001A: BRA 0018
....................
001C: SLEEP
En cambio si declaramos STATIC nuestra variable ...
#include <18F2550.h>
#fuses HS,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=20000000)
static int8 MyVar;
void main() {
do {
MyVar = 0x000;
} while (TRUE);
}
El nuevo ASM queda de la siguiente forma ...
0000: GOTO 0004
0004: CLRF FF8
0006: BCF FD0.7
0008: CLRF FEA
000A: CLRF FE9
000C: MOVF FC1,W
000E: ANDLW C0
0010: IORLW 0F
0012: MOVWF FC1
0014: MOVLW 07
0016: MOVWF FB4
0018: CLRF 05 <-------- Esta línea la añade antes de entrar en el bucle infinito.
.................... do {
.................... MyVar = 0x000;
001A: CLRF 05 <------------------- que es igual a nuestra puesta a cero dentro de él.
.................... } while (TRUE);
.................... }
001C: BRA 001A
....................
001E: SLEEP