Ich würde gerne eine Slaf Funktion mit folgender Funktionalität benutzen (PsydoCode):
volatile sleep_enabel = 1; // global Flag is set to 0 in any waking ISR to stop sleeping
PowerDownExternalHardware( byte settings){
if(bitset(settings,0)){
//swirch off Hardware A by switching off Pin x
digitalWrite(Pin0, LOW);
}
if(bitset(settings,1)){
//swirch off Hardware A by switching off Pin x
digitalWrite(Pin1, LOW);
}
//...
}//PowerDownExternalHardware
PowerDownInternalHardware( byte settings){
if(bitset(settings,0)){
disable_TWI();
}
if(bitset(settings,1)){
disable_ADC();
}
//...
}//PowerDownInternalHardware
// Sleep Function, set: SleepMode, WDT Sleep Periode, if Serial waiks up, PCI Pins to wake up uC,
// Settings for external and internal Hardware shutdown
mySleep(byte Mode, unsigned int wdtPeriode, bool wakeBySerialRx, byte pciWakePins[],\
byte pinCount, byte extHwSet, byte intHwSet)
{
PowerDownExternalHardware( extHwSet); // shut down associated ext. Harware
PowerDownInternalHardware( intHwSet); // shut down associated int. Harware
if(wakeBySerialRx){
//set PCI for Pin 0, Provide PCI ISR!!
}
for(byte i = 0;i< pinCount;i++){
//enable Pci for Pins and ports, provide PCI ISRs !!
//enable PCI for acording pciWakePins[i],
}
if(wdtPeriode){ // enable wake by WDT only if WDT Periode is set
// setup wdt to periode and sleep x times till prriode is over
if(WDT Periode >= 8000){ // Sleep 8 sec
noInterrupts();
bool sleep_enabel_copy = sleep_enabel; // check if sleep is still enabled
interrupts();
While(sleep_enabel_copy && wdtPeriode >= 8000){ // sleep for x * 8sec
Periode -= 8000;
//set WDT
// start sleeping...
// disable sleeping
noInterrupts();
sleep_enabel_copy = sleep_enabel; // check if sleep is still enabled
interrupts();
}//while
}//if(WDT Periode > 8sec)
// skip 4 and 2 Sec
if(WDT Periode >= 1000){ // Sleep 1 sec
noInterrupts();
bool sleep_enabel_copy = sleep_enabel; // check if sleep is still enabled
interrupts();
While(sleep_enabel_copy && wdtPeriode >= 1000){ // sleep for x * 8sec
Periode -= 1000;
//set WDT
// start sleeping...
// disable sleeping
noInterrupts();
sleep_enabel_copy = sleep_enabel; // check if sleep is still enabled
interrupts();
}//while
}//if(WDT Periode > 1sec)
// same for 128ms
// same for 16ms
}// if(wdtPeriode){
else{ // no WDT Periode was given =>don't wake periodicly
// wake only by Interrtupt from PCI, ADC, Serial RX ...
// start sleeping...
// disable sleeping after Interrupt (or better disable sleep in ISRs?)
}
PowerUpInternalHardware();
PowerUpExternalHardware();
}
/* in all ISRs:
Disable sleep in wakeISRs !?
Set sleep enable == 0; // needed?
Set (global and local) ISR_has_happend_Flags
Disable own ISRs? (PCI: not if used for someting else, Serial: yes, not needed in
active state, WDT: disable and reste does extra overhed, keep
running and just reset intervall, ok/ possible??????)
*/
Kann mir jamdn dazu Tipps geben oder ob es überhaupt so möglich ist bzw was dagegen spricht? z.B. Welche Sequenzen mü+ssen dringen aufeinander folgen?
Vielen Dank.
PS: Das ganze funktioniert in Teilen schon, nur in der Kombination von mereren Wake-Quellen bekomme ich gerade Probleme.