avr lebegopontos muveletek -frekimero-

Pal Lukacs ekegep at yahoo.com
Sun Sep 17 18:46:12 CEST 2006



Pal Lukacs <ekegep at yahoo.com> wrote: 

>.... beszurom a kodot ha nem baj:
   
 Ma annyira jutottam ,hogy mar 10KHz folott is mer es kijelez,de csak egyszer,vagyis nem frissiti a kijelzest.Nem kapom meg a kert idokozonkenti jelest az timer/isr-tol..Nem jovok ra hogy mi lehet a baj..
 (Sokat egyszerusitettem rajta,ellegge rovid a kod igy mar.)
     
 Minden otletet/segitseget varok.
     
 CODE
     
     /* freq-meter by gtk */
     
     #include <inttypes.h>
     #include <util/delay.h>
     #include <avr/io.h>
     #include <avr/interrupt.h>
     #include <stdlib.h>
     #include <avr/pgmspace.h>
     #include "simple_driver.h"
     
     
     volatile unsigned int cnt1, cnt2;
     volatile unsigned char flag1, flag2;
     unsigned int cnt1_threshold, cnt2_threshold;
     
     volatile unsigned int imp = 0x0, tme = 0x0;
     uint8_t mask = 0x0, i = 0;
     uint8_t buf[17];
     
     // 0.1S, 0.01S, 0.001S hez szamitott ertekek TCNT2-be.
     
     void timer2_isr ();
     
     void
     delay_ms (unsigned int d)
     {
       while (--d)
         {
           _delay_ms (1);
         }
     }
     
     /*
     * timer1 SIG_OVERFLOW1 : impulzusok szamat meri; 65536 -nal overflow
     * ha tulcsordul.
     */
     SIGNAL (SIG_OVERFLOW1)
     {
       cli ();            //int ki        
       TCCR1B &= 0xF8;        //a timer 1 ki
      
       lcd_cls ();
       lcd_putstr ("Freq > 65,636 mHz");
       TCNT1 = 0x00;
       TCCR1B |= 0x07;        //timer 1 indul
       sei ();            //globalis megszakitas engedelyezes
     }
     
     /* Timer 2 SIG_OVERFLOW2: Ido meres; 1S vagy 0.001S 
     * nel overflow.
     */
     
     SIGNAL (SIG_OVERFLOW2)
     {
       cli ();            //megszakitas kikapcs.
                       //timer2 kikapcs
       TCCR2 = 0x0;
       imp = TCNT1;            //impulzusok szama
       timer2_isr ();
       mask = 0x1;            //set mask; --> timer2 beallitasa a main-loop-ban (for(;;))
     }
     
     
     void
     timers_init (void)
     {
       TIMSK |= (1 << TOIE2);    //timer2 overflow enabled
     /* 
      * egy-be allitott bitek TCCR1B reg.ben: 
      * CS10,CS11,CS12: kulso orajel forras,felfuto elre lep. 
      * --> 00000111  --> 
      */
     
       TCCR1B |= 0x07;        
       TIMSK |= (1 << TOIE1);    //timer1 overflow enabled
     
       ASSR |= (1 << AS2);        //aszinkron uzemmod bekapcs; clock source from osc. connected to TOSC1 TOSC2.
     }
     
     
     void
     timer2_isr ()
     {
       cnt1++;
       if (cnt1 == cnt1_threshold)
         {
           cnt1 = 0;
           flag1 = 1;
         }
     }
     
     
     int
     main ()
     {
       lcd_init ();
       /*set: disply ,no curs, no c. blink */
       lcd_control (1, 0, 0);
       mask = 0x1;
       /* PORTD / T1 bemenet */
       //DDRD &= ~(1 << PD5);
       DDRD = 0x00;
       PORTD = 0xFF;
       timers_init ();        // init
     
       for (;;)            //main-loop
         {
           /* timer1 idonkenti jelzes */
     
           if (i == 0)            // timer1 ovf.1s -kent
         {
           cnt1_threshold = 1;        // timer1- tol kert ido 1s
         }
     
           if (i == 1)            // timer1 ovf. 0.001s -kent
         {
           cnt1_threshold = 1000;    // timer1- tol kert ido 1s
         }
     
           if (flag1)
         {
           flag1 = 0;
          
           //idoalap 1S
           if (imp < 1000 && i == 0)
             {
               sprintf (buf, "%s%d%s", "Freq: ", imp, " Hz");
             }
           //idoalap 1S
           if (imp >= 1000 && i == 0)
             {
               sprintf (buf, "%s%d%c%03d%s", "Freq: ", imp / 1000, '.',
                    imp % 1000, " KHz");
             }
           //idoalap 0.001S
           if (imp < 1000 && i == 1)
             {
               sprintf (buf, "%s%d%c%03d%s", "Freq: ", imp / 1000, '.',
                    imp % 1000, " KHz");
             }            //999 000 
           //idoalap 0.001S
           if (imp >= 1000 && i == 1)
             {
               sprintf (buf, "%s%d%c%03d%s", "Freq: ", imp / 1000000, '.',
                    imp % 1000000, " MHz");
             }
           lcd_cls ();
           lcd_putstr (buf);
         }
     /*
     * timer1 impulzus szamlalo; ha elmozdult ==>jel erkezett! meresi idot 1S -el indul    
     */
           if (TCNT1 & mask)
         {
           mask = 0x0;
                 
      /* meresi idot atallitjuk 0.001S-re ha az impulzusok szama/sec nagyobb mint 10.000 (10 KHz) 
      * i -t jelzesre haszanlom ,hogy epp melyik idoalap van beallitva.
      */
              
             if (i == 0 && imp > 10000)
             {
               i = 1;        //0.001S (1ms)idoalap
                 // elooszto 64
               TCCR2 &= 0xF8;
               TCCR2 |= 0x00;//0x04;//8 oszto
               
               //TIMSK |= (1 << TOIE2);            //timer2 overflow enabled
                //TCNT2 kezdeti erteke ; 
               TCNT2 = 33;                //250;    //4 ertek 
             }
           else
             {
               i = 0;        //1S idoalap
                 // elooszto 128
               TCCR2 &= 0xF8;
               TCCR2 |= 0x05;
                      
               //TIFR &= ~(1 << TOV2);                   //timer2 overflow flag torles
               //TIMSK |= (1 << TOIE2);            //timer2 overflow enabled   
                //TCNT2 kezdeti erteke ; 
               TCNT2 = 0;    
            }
            TCNT1 = 0x0;            //Timer1 = 0
           sei ();            //global interrupt enabled , meres indul         
         }
         }
     }
     
     /*high fuse CKOPT 4. bit (alapbol) 1(unprogrammed).
     * high fuse = 0xD9 , CKOPT 4. bit programmed 
     * low fuse CKSEL3 0-3. bit = 0100 --> internal osc.8Mhz
     * low fuse 1110 0100 = 0xE4
     */
     
 END CODE
   

 		
---------------------------------
Talk is cheap. Use Yahoo! Messenger to make PC-to-Phone calls.  Great rates starting at 1¢/min.


More information about the Elektro mailing list