C18: variable wird beim 2. mal aufrufen nicht mehr ins register geschrieben
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Entwicklungswerkzeuge  |  Compiler  |  C18: variable wird beim 2. mal aufrufen nicht mehr ins register geschrieben « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: C18: variable wird beim 2. mal aufrufen nicht mehr ins register geschrieben  (Gelesen 916 mal)
 
Master Snowman
Sr. Member
****
Offline Offline

Beiträge: 289



Profil anzeigen WWW
« am: November 20, 2010, 21:55:37 »

hallo
ich habe ein seltsames problem: im main rufe ich eine funktion auf:
Code:
WriteEEdata16(&timer0count, 200); // timer0count ist vom typ "unsigned int" und hat den wert '0xAABB'
diese funktion ist wie folgt definiert:
Code:
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:
Code:
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...

« Letzte Änderung: November 20, 2010, 22:09:13 von Master Snowman » Gespeichert
Master Snowman
Sr. Member
****
Offline Offline

Beiträge: 289



Profil anzeigen WWW
« Antworten #1 am: November 21, 2010, 06:08:22 »

sonderbares phänomen: wenn ich die sequenz mit dem debugger langsam schritt für schritt durchlaufe, so funktioniert alles bestens. wenn ich es einfach normal durchlaufen lasse, dann nicht.
der PIC18F458 läuft mit 4MHz, von dem her kann es wohl kaum zu schnell sein.

meine zwischenlösung soweit, die funktioniert, ist die folgende
Code:
while (EEADR != addr)
EEADR = addr; // WRITE step #3
while (EEDATA != *source)
EEDATA = *source; // WRITE step #4
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.034 Sekunden mit 18 Zugriffen.
 
Top! Top!