Efter lidt nørglen rundt, har jeg med lidt mindre småjusteringer fundet en løsning. For at nævne et par ting som gjorde udslaget, så kan jeg nævne, at watchdog'en skulle resettes, return from interupt skulle med i sløjfen, general interupt enable skulle resettes ligesom det mest væsentlige = Indgangen hvor mit signal til sleep kommer på, skulle også resettes under opstart. Ellers aner den jo ikke hvad værdi den har og om den skal resette, og støjen kunne åbenbart godt få den til at gå i SLEEP mode.
Det eneste jeg stadig ikke helt kan greje, er hvordan man skriver en doubles-værdi til EEPROM'en !! Jeg synes bestemt ikke de Assamblerkoder til PIC16f873 ligner de samme, som jeg brugte på min AtMEL89c2056. På en eller anden måde skal stackpointeren vel have at vide, at nu skal lagringsprocessen skrive eller læse i EEPROM'en - Kan jeg sgu ikke umiddelbart greje.
Det færdige stykke kommer her !!
/*----------------------------------SLEEP-routine---------------------------
------*/ /* SLEEP-routinen mindsker strømforbruget på processoren, når den ext. forsyning */ /* mangler. */ /*--------------------------------------------------------------------------
------*/ void sleep(void) // SLEEP-routine { #asm sleep nop nop #endasm }
/*------------------------------Assambler-kommandoer------------------------
------*/ /* Assambler kommandoen skal slette diverse flags under opstart, for at sikre */ /* korrekt opstart af Wake up. */ /*--------------------------------------------------------------------------
------*/ void asambl(void) // asambler-routine { #asm clrwdt retfie #endasm }
/*----------------------------------Hovedprogram----------------------------
------*/ void main(void) // Hovedprogram { TRISA = 16; // Port A til output an input ("1" input og "0" output) TRISB = 0; // Port B til output TRISC = 0; // Port C til output ADCON1 = 6; // Set Port B til Digital
PORTB = 56; // 8 Bit interface PORTA = 2; // LCDdelay(); // Kalder LCDdelayroutine PORTA = 0; //
PORTB = 12; // Display on, Cursor off, Blink off PORTA = 2; // LCDdelay(); // Kalder LCDdelayroutine PORTA = 0; //
PORTB = 1; // Clear display PORTA = 2; // LCDdelay(); // Kalder LCDdelayroutine PORTA = 0; //
RC2=0; // GIE=0; // bitsum=0; // Reset bitsum TMR0=0; // Reset 8 bit counter 0 start=0; // Reset start
asambl(); //
flag='a'; // Flag sættes til a - Viser startoptekst init_disp(); // Kalder init_disp for at tjekke hvilket flag, der er sat DELAY(); // Lav et delay, så vi kan se udlæsningen på displayet flag='b'; // Sæt flag b, så displayet viser forbrugsudlæsning
do{ PORTB = 2; // Cursor at home PORTA = 2; // PORTA = 0; //
input(); // Læs inputsignalet fra flowmåleren
level(); // Kalder level-routinen til LED-udvisning
reset(); // Kalder reset-routinen fra Extern reset
init_disp(); // Kalder initialisering af display
init_led(); // Kalder initialisering af LED-status
if (RC2==1) // { // Programmet skal her gemme double-værdien i EEPROM'en, for at programmet // ved næste MCLR fortsætter med det forbrug programmet er kommet frem // til ved SLEEP !!
sleep(); // }
} while(1); // Kør sløjfen igen og igen ......osv }