avr lebegopontos muveletek -frekimero-

Moczik Gabor pm at progzmaster.hu
Sun Sep 17 19:22:11 CEST 2006


Pal Lukacs wrote:
      SIGNAL (SIG_OVERFLOW1)
>      {
>        cli ();            //int ki        
>        TCCR1B &= 0xF8;        //a timer 1 ki
>       
>        lcd_cls ();
>        lcd_putstr ("Freq > 65,636 mHz");

Ez megszakitas?
Az LCD kezelo cuccokat vedd innen ki, nagyon huzza az idot, ilyenkor a proci 
nem kaphat masik megszakitast...

>        for (;;)            //main-loop
>          {
>            /* timer1 idonkenti jelzes */
>      
>            if (i == 0)            // timer1 ovf.1s -kent
>          {
>            cnt1_threshold = 1;        // timer1- tol kert ido 1s
>          }

Ugy nezem, az i es a cnt1_threshold redundans, tovabba ez a kodreszlet 
minden ciklusban (valszeg az ido nagy reszeben feleslegesen) lefut.

Hagy el az i valtozot, helyette a cnt1_threshold-ot hasznald.

Tovabba amikor a cnt1_threshold-ot 1000-rol 1-re allitod, a cnt1-et is 
nullazni kell.
(mert pl. 317-nel jar amikor 1-re allitod a threshold-ot, ilyenkor elszamol 
65535-ig, tulcsordul es utana lesz csak 1 az erteke. De ezt valoszinuleg nem 
vartad meg, mert jo sokaig tart)


>                sprintf (buf, "%s%d%c%03d%s", "Freq: ", imp / 1000, '.',
>                     imp % 1000, " KHz");

Miert nem jo igy:
sprintf(buf,"Freq: %d.%03d kHz",imp/1000,imp%1000);

Kevesebb parametert kell atadni, szinte 100% hogy ez hatekonyabb kodot 
eredmenyez.

>              if (i == 0 && imp > 10000)
>              {
>                i = 1;        //0.001S (1ms)idoalap

Ide ...

>                i = 0;        //1S idoalap
>                  // elooszto 128

Es ide kellene a cnt1=0, valamint az i-t kicsereled cnt1_threshold=0 es 
=1000-re, meg feljebb az osszes feltetelt ami az i-t hasznalja...

-- 
((( Móczik Gábor  )))--((( pm -> @ -> progzmaster -> . -> hu  )))
((( Skype: moczik )))--((( Website: http://www.progzmaster.hu )))



More information about the Elektro mailing list