Sida 3 av 4
Re: Sleep/wake up PIC
Postat: 6 januari 2011, 16:38:33
av v-g
Jag forskade ju i detta i samband med att jag byggde min sensor bla tänkte jag tjyva lite ström med en spole eller nåt runt kabeln in till kåken. I slutändan blev en enkel 2ledare min lösning och i ändan sitter bara en fototrissa och en vanlig trissa som känner av pulsen. PICen sitter inne i värmen och drar full stret hela dagen lång
De 20mA eller nåt den drar anser jag mig ha råd med årskostnaden torde bli under kronan i vilket fall som helst
Varför jag inte vill ha batterier och skit är ju för att de såklart tar slut när det är svinkallt och är som träligast att byta, mitt skåp sitter en 20 meter från kåken och jag skottar normalt inte dit. Batterier kostar ju också en ren förmögenhet iom att kapaciteten i kyla säkert måste tiodubblas i mitt fall. Dessutom är det enklare att avlusa program när µc:n sitter inne
Ska man ha en extern räknare till PIC:en (för att klocka in signaler) gäller det att den är snålare än tex interna klockan och återigen då gäller det att ha järnkoll på databladen så man inte går över ån efter mindre vatten.
Det står iaf i databladet för
interupt on change att
This interrupt can wake the device from SLEEP. Dvs det är bara till att testa och dra fram multimetern för att verifiera.
Får du inte ner sändaren så stäng av den helt och slå bara på vid sändning mha en trissa eller nåt. Se till att ingen pullup/down ligger i hela tiden och måste de de det så högt motstånd som möjligt, men för knappar exvis skulle jag köra på de interna och bara aktivera precis när jag förväntar mig knapptryck osv.
Re: Sleep/wake up PIC
Postat: 6 januari 2011, 19:14:24
av TomasL
Varför skall man ha en extra räknare, det finns ju inbyggda sådana
Re: Sleep/wake up PIC
Postat: 6 januari 2011, 20:44:15
av sodjan
Vem har sagt att man *ska* ha det ???
Re: Sleep/wake up PIC
Postat: 6 januari 2011, 20:53:38
av TomasL
V_G skrev
Ska man ha en extern räknare till PIC:en (för att klocka in signaler)
Re: Sleep/wake up PIC
Postat: 6 januari 2011, 20:59:46
av sodjan
Men det var inget påstående, utan mer (om man läser hela meningen) ett
sätt att säga att det sannolikt inte alls är en bra idé. Du triggar och går
igång på ganska underliga saker...

Re: Sleep/wake up PIC
Postat: 6 januari 2011, 21:33:36
av v-g
Kollade förresten i databladet för en annan PIC och bläddrade förbi en sida där strömförbrukningen står för olika frekvenser, har TS koll på att detta finns? Det är ju iaf en bra guide till hur mycket det _borde_ dra om inte annat.
Re: Sleep/wake up PIC
Postat: 7 januari 2011, 15:39:34
av magnuscj
Jag har nu ett fungerande program som svar på den frågan jag inledde denna tråd med. Jag kommer inte att posta hela programmet utan valda delar. Programmet är en prototyp och hur väl resultatet fungerar med avseende på ström hann bara utvärderas som hastigast innan multimetern lade av... klant... Jag hade tänkt presentera strömmen för varje del samt vad de olika åtgärderna sparade. Jag undrar om sleep verkligen gör så mycket när jag dragit ned klockan till minimum.
Programmet i korthet:
- Initiera WDT med rätt konfiguration
- Stäng av Xbee via dess sleep-funktion
- "dra ned" klockans hastighet
- öka klockan vid "samtal" med Xbee
Kod: Markera allt
void main() {
TRISA = 0b00000000; //
TRISC = 0; // PORTC is output
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0; //
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0; //
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(200); // Wait for UART module to stabilize
OPTION_REG = 0b11111011;// OPTION REGISTER with some WDT Settings
WDTCON = 0b00010001;// WDT Settings
OSCCON_FAST = OSCCON; // UART friendly mode
OSCCON_SLOW = 0b00000011;// Low power mode
PORTC = 0b00000000;// Diodes OFF
PORTA = 0b00000001;// Xbee OFF
pulseCnt = 0;
sendThreshold = 0;
sendData("Init finished");
do
{
if(sendThreshold > 20)
{
sendData("pulses");
sendThreshold = 0;
sleep(); //One pulse received. Sleep is a good idea.
}
sendThreshold++;
}while (1);
void sendData(char s2[] )
{
OSCCON = OSCCON_FAST;
PORTA = 0b00000000; //Xbee ON
Delay_ms(15); //Take it easy, let Xbee start
UART1_Write_Text(s2);
Delay_ms(15); //Take it easy before turning off Xbee
PORTA = 0b00000001; //Xbee OFF
OSCCON = OSCCON_SLOW ;
}
Re: Sleep/wake up PIC
Postat: 7 januari 2011, 15:49:43
av sodjan
> Initiera WDT med rätt konfiguration
Behöver du WDT alls nu ? Du har väl skippat att väcka
proceesorn ur sleep via WDT ? Om inte, stäng bara av
WDT i CONFIG.
> OSCCON_FAST = OSCCON; // UART friendly mode
> OSCCON_SLOW = 0b00000011;// Low power mode
Borde inte både "fast" och "slow" vara två olika värden ?
Nu ser det ut som att "fast" bara är adressen till OSCCON.
Varför vill du sätta värdet på OSCCON till *adressen* till OSCCON ??
Re: Sleep/wake up PIC
Postat: 7 januari 2011, 20:37:37
av magnuscj
Det ser ut som om OSCCON inte är en pekare. Vanlig variabel-kopiering alltså.
Re: Sleep/wake up PIC
Postat: 7 januari 2011, 21:07:46
av ToPNoTCH
Nu är ju jag lite rudis på C, men hur funkar "delay_ms(X)"
Är det ett kommando eller en egen rutin ?
Om det är ett kommando, tar det då hänsyn till dina växlingar av klockan ?
Om det är din egna rutin tar den då hänsyn till att den övre "delay_ms(200)" går i snabbare klocka än de ndere "delay_ms(15)" ?
Tror du angriper problemet mycket mer rätt nu ...Bra jobbat.
Re: Sleep/wake up PIC
Postat: 7 januari 2011, 22:59:38
av sodjan
> Det ser ut som om OSCCON inte är en pekare.
Och vad har "pakere" med någonting alls att göra ?
OSCCON är en symbol som normalt innehåller adressen till registret OSCCON.
(Eller i alla fall så innehåller den *någonting* som får kompilatorn att förstå
att det är registret OSCCON man menar när man använder symbolen).
Längre ner i koden står det:
OSCCON = OSCCON_FAST;
...
OSCCON = OSCCON_SLOW;
Den senare är ju tydlig att den sätter OSCCON till 0b00000011.
Men vad gör den första tilldelningen ?
Include filen för proceesorn har
vilket ser ut som adressen till OSCCON.
Med den definitionen av OSCCON, vad gör "OSCCON_FAST = OSCCON;" ?
Re: Sleep/wake up PIC
Postat: 8 januari 2011, 15:00:44
av magnuscj
Då skall vi se. Det är naturligtvis så att Oscilatorkontrollen sköts med
registret OSCCON. Det hade jag tidigare räknat ut. Dessvärre så försökte
jag sätta dem på fel sätt. Jag sätter dem i mikroC-miljön nu på följande vis:
OSCCON.B6 = 0;//IRCF<2:0>:Internal Oscillator Frequency Select bits
OSCCON.B5 = 0;//
OSCCON.B4 = 0;// 111 = 8 MHz (8,4,2,1, 0.500, 0.250, 0.125, 0.031)
OSCCON.B0 = 1;//SCS: System Clock Select bit
Jag provar med en delay-rutin som konstrueras vid programmeringen/kompileringen
Delay_ms(1000); skall ta en sekund vid 8MHz, två vid 4Mhz och så vidare.
Se nedan för några prov.Jag mätte även strömmen vid några tillfällen.
8Mhz (7mA)
13:56:45 Start
13:56:46 Stop
4Mhz
14:01:43 start
14:01:45 Stop
2Mhz (6mA)
14:02:25 start
14:02:29 Stop
31kHz (5,25mA) //OSCCON.B6 = 0
14:04:51 start //OSCCON.B5 = 0
14:09:39 Stop //OSCCON.B4 = 0
Sleep tar ca 5,23mA. Sleep ser ut att vara bortkastat.
Jag har mätt strömmen på en PIC som matas av en USB (+5V). Inga dioder var aktiverade
på kortet (ett kort som följer med PICKit 2). Inga andra kopplinga som stör.
Jag är nog förvånad över att det inte var större skillnad när jag gick ned i frekvens.
Xbee:
45mA (som skickar data hela tiden)
3mA (Vid sleep)
Re: Sleep/wake up PIC
Postat: 8 januari 2011, 15:08:07
av sodjan
Och hur var det med "OSCCON_FAST = OSCCON;" ?
> Jag är nog förvånad över att det inte var större skillnad när jag gick ned i frekvens.
Det finns diagram i databladet som visar typiska värden.
Om du ligger långt från dom värderna så är det inte PIC'en som
förbrukar strömmen utan något annat som kanske är anslutet.
> (ett kort som följer med PICKit 2)
Det finns den del annat på det kortet som kan dra ström.
Hur är JP5 satt t.ex ? Och hur/var mäter du strömmen ?
Re: Sleep/wake up PIC
Postat: 8 januari 2011, 15:42:03
av Icecap
"Stäng av Xbee via dess sleep-funktion"
Vad säger databladet att den då förbrukar?
Och hur lång tid tar det för den (worst case) att däcka?
PIC'en i sig drar "försumbart" med ström nästan oavsett vilken hastighet den kör med men jagar man marginaler är det rätt väg att gå att låta den ändra hastighet efter behov.
Jag saknar dock lite data för hur mycket XBee drar i sovläget, hur mycket fotosensorkretsloppet drar osv.
Att sänka PIC'ens förbrukning är att skjuta gråsparv med kanoner, det finns helt säkert helt andra strömtjuvar i detta...
Re: Sleep/wake up PIC
Postat: 8 januari 2011, 16:42:35
av magnuscj
> - Och hur var det med "OSCCON_FAST = OSCCON;" ?
Jag tog det för givet att det faktisk var fel, med de avsikter jag hade, att göra som ovan. Jag gav upp saken och provade metoden jag visade här innan.
När jag nu kör debuggern för att kolla adresserna och de värden variablerna får så ser jag att det ser ut att fungera så som jag först avsåg.
Name Value Address
OSCCON_FAST 0b0111 0001 0x005C
OSCCON_SLOW 0b0101 0001 0x005F
OSCCON 0b0111 0001 0x008F
Jag provade i verkligheten och ja, det verkar fungera.
> -Hur är JP5 satt t.ex ? Och hur/var mäter du strömmen ?
När jag skruvade på potentiometern så sjönk strömmen...till ca 1,3 mA. Inte rätt miljö att jaga mA i kanske om man inte har full koll.
Jag mäter vid ingången på p2 som matas från en USB-krets.
> -Får du inte ner sändaren så stäng av den helt och slå bara på vid sändning mha en trissa eller nåt.
Ja, nu skall jag bara försöka räkna ut hur en sådan koppling kan se ut. Tips?
För pulsmätningen kör jag en TSL250R som ännu inte är inkopplad.
PS
Era kommentarer uppskattas!
DS
Jag inser vidare att det är dags att sluta jaga sparvar med kanon. Nu ger jag mig på Xbee:n