hallo
ich habe ein seltsames problem: im main rufe ich eine funktion auf:
WriteEEdata16(&timer0count, 200); // timer0count ist vom typ "unsigned int" und hat den wert '0xAABB'
diese funktion ist wie folgt definiert:
void WriteEEdata16(unsigned int *source, unsigned char addr) {
// writes 2 byte from 'source' to 'addr'
unsigned char *p = (unsigned char *)source;
WriteEEdata8(p++, addr++);
WriteEEdata8(p, addr);
}
und diese ruft wiederum diese funktion 2x auf:
void WriteEEdata8(unsigned char *source, unsigned char addr) {
// writes 1 byte from 'source' to 'addr'
// EECON1bits.CFGS = 0; // VERY important, alternatively it can be set also in the init()
EECON1bits.EEPGD = 0; // WRITE step #1
EECON1bits.WREN = 1; // WRITE step #2
EEADR = addr; // WRITE step #3
EEDATA = *source; // WRITE step #4
INTCONbits.GIEH = 0; // disable/enable interrupts <-- hier
INTCONbits.GIEL = 0; // disable/enable interrupts
EECON2 = 0x55; // WRITE step #5
EECON2 = 0xaa; // WRITE step #6
EECON1bits.WR = 1; // WRITE step #7
INTCONbits.GIEH = 1; // disable/enable interrupts
INTCONbits.GIEL = 1; // disable/enable interrupts
while (!PIR2bits.EEIF); // WRITE step #8
PIR2bits.EEIF = 0; // WRITE step #9
}
..leider stimmt nur die hälfte der 16bit-zahl: beim debuggen, finde ich heraus, dass beim ersten und zweiten aufruf der WriteEEdata8 bei "hier" folgende werte sind:
1. aufruf:
source -> 0x65 (an der adresse 0x65 steht der wert '0xBB')
EEDATA = BB
addr = 200
EEADR = 200
2. aufruf:
source -> 0x66 (an der adresse 0x66 steht der wert '0xAA')
EEDATA = BB
addr = 201
EEADR = 200
wie es scheint, haben 'source' und 'addr' in der WriteEEdata8-funktion jeweils den richtigen wert, jedoch werden die werte nicht in die register geschrieben. warum? irgendwie stehe ich auf der leitung, falls jemand den fehler sieht, wäre ich echt froh. danke :-)
edit: wenn ich beim 2. mal den debugger bei "hier" anhalte, und den "PC Cursor" 3 linien weiter oben platziere und dann wieder bei "hier" anhalte, so haben 'EEDATA' und 'EEADR' die werte von 'source' und 'addr' übernommen.
ps: ich habe diesen code aus einem älteren projekt (jedoch anderer PIC-typ) genommen, wo sie wunderbar funktionieren...