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