MPU sjov og balade....

Hejsa,

Hvordan i H.... for man lavet tjekket om et tal går op i et andet med mindst resurser ????

Det drejer sig om at jeg prøver at få en logger til at lave en måling for hver 10 sec... og jeg har en sec tæller som incrementeres for hver andet sekund. Som det er nu benytter jeg mig af følgende metode :

If( (sekunder%5) == (sekunder/5) ) bla bla bla....

Men er det for tåbeligt ??? grunden til jeg vil bruge en formel er at jeg vil ha en variable der svare til scan intervallet som derved vil være hvor jeg har 5 tallet nu, så jeg kan ændre den hvis jeg vil scanne ved et andet interval.

VH Lars Molnit Håber det er skrevet så det nogenlunde forståeligt :)

Reply to
Moller
Loading thread data ...

"Moller" skrev i en meddelelse news:c0gcir$edd$ snipped-for-privacy@sunsite.dk...

andet

Hej Lars

Kan du ikke skrive lidt om din sekundt tælle? Bruger du den til andet end sensor tjek?

Hvis den nu kører på en interrupt der bliver tricket af en clock, kunne du jo bare få den til at kører hvert 10 sek!

Hilsen Mikkel

Reply to
Mikkel Lund

Det er en ekstern 32,768kHz crystal som driver en interupt timer, og derved vækker MPU'en fra sleep mode hver 2 sek. (sådan ca.) da det er en

16bit tæller.

Den bruges til at drive det interne ur i chippen, da jeg derved for en meget billig Ur funktion, som også er ekstrem strømbesparende (batteridrift).

klokken er rimelig fast da der bruges et fast crystal, så interuptet kan kun justeres mellem 1/32768 sek og 2 sek. måske skal man ha en sideløbende tæller som kun står for log tæller delen, og derved kan jeg minimere udtrykket til :

if(!(scan_timer%scan_interval)) bla bla bla ... scan_timer = 0 .... bla bla bla end if

hmmm, hvis jeg bare kunne måle strømforbruget på den, så ku man jo sammenligne de to states, men når der snakkes om nA-uA så er det lidt svært at få noget godt måleudstyr :(

VH Lars Molnit

Reply to
Moller

Hvad med at udføre følgenden hver andet sekundt:

Sekundttæller+=2;

if (Sekundtæller>10) { Sekundtæller-=10; bla bla bla... }

Så er det ret læt at sætte vilkårlige intervaller op.

Reply to
HKJ

Hey

Måske lidt offtopic...

Men en ADUC83X / 84x

har inbygget time interval counter til ur og køres fra et ur krystal direkte.....

(har fået den til at vågne op)....

og den kan gå i power down (15uA) eller lidt mere hvis pll'en skal køre

Bare lige et forslag ((:

Kasper

Reply to
Kasper

Du sammenligner en integer med en float?

if ( (sekunder%5) == 0 ) { do_stuff(); }

bør være rigeligt ;-) Så kan du jo nok lavet en constant du benytter istedet for det 5-tal.

--
-jens
Reply to
Jens Arnfast

Takker for forslaget :) men jeg bruger en PIC18F1320 og den kan det samme ...og som opstillingen er nu skulle jeg være nede på 1,1uA når den tæller mens den er i sleep mode.

VH Lars Molnit

Reply to
Moller

Og den kræver mindre resurcer end at jeg bruger division og modulus :) og derved mindre strømforbrug... :) genial ide.

VH Lars Molnit Som straks vil implementere dette i sin kode :)

Reply to
Moller

andet

nopes begge er integer, derved benytter jeg mig af compilerens fejl med at der altid rundes op..

Ja, det trode jeg også men underligt nok gir det ikke nul for hver gang det går op i 5, men i stedet antallet af gange 5 går op i sekunder ??? tror det er et problem med den C-compiler jeg bruger.

VH Lars Molnit Som lige har tjekket om uret går rigtig :) og det går perfekt, den har skrevet både dag, mdr, timer, min rigtigt :) og har kørt siden i går.... nu skal jeg bare finde en måde at få det kalibreret så godt som muligt, og lave koden så effektiv som muligt så den bruger mindst muligt strøm.

Reply to
Moller

Ja, hvad der sker med den implicitte konvertering er jo op til compileren ;-) enten sker der en implicit konvertering af integer til float, eller float til integer.

Ydrk, ikke meget modulus over det så - det er jo bare ren dividering ;-)

Men så er tidligere nævnte konstruktion:

if (sekunder > X) { sekunder = 0; do_stuff(); }

Nok den bedste løsning ;-) Så løber sekunder jo heller ikke bare sådan lige over ;-)

--
-jens
Reply to
Jens Arnfast

Hvem har foreslået den? I mit foreslag trækker man X fra tælleren, det betyder nemlig at skæve værdier også kan bruges (de vil i gennemsnit blive kørt korrekt).

Jeg bruger tit den slags tællere, især hvis jeg ikke vil risikere at miste tid, selvom den ikke lige når at blive kørt på det korrekte tidspunkt, så vil tælleren bare samle op, så den ALTID vil blive kørt det korrekte antal gange. Men det er selvfølgelig mere relevant når inkrement og dekrement af tælleren ikke foregår i samme task.

Reply to
HKJ

Se, så forstår jeg hvorfor du vil gøre det unødigt komplekst ;-) Threads, tasks, whatever er jo heller ikke just trivielt at udvikle, og vi har alle vores "best practices" og så kan man jo nemt komme op at toppes ;-)

Men hvis det i denne situation ikke var relevant kunne min tildeling godt være lidt billigere end din subtraktion ;-) (nulstilling vs aritmetik)

--
-jens
Reply to
Jens Arnfast

Hejsa Alle, Takker for hjælpen med problemet og kan nu sige at HKJ løsning har betydet at samme funktion nu kan gøres på ca. 1/4 resourcer i forhold til den jeg selv havde valgt, og da det er til en batteri drevet konstruktion betyder dette jo enormt :) for batteri levetiden.

VH Lars Molnit

Reply to
Moller

Det glæder mig at du kunne bruge mit forslag.

Reply to
HKJ

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.