Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот еще пример как делать не надо :) Тыкаем ссылку, жмем "Freq Meter"

Отправлено CTAC 03 августа 2007 г. 10:52
В ответ на: delay в прерывании еще хуже. Это надо поместить в примеры, как НЕ надо делать отправлено koyodza 03 августа 2007 г. 10:32


//**************************************************************************
// Frequancy Meter
// Version 1.0 Mars 2003
//
// 1.0 -> -First Release
//
//
// Sylvain Bissonnette
//**************************************************************************


/*********************************************************/
/* I N C L U D E */
/*********************************************************/
#include "macros.h"
#include "iom8v.h"
#include
#include
#include
#include "NokiaLCD.h"

/*********************************************************/
/* E X T E R N */
/*********************************************************/
extern char UpdateLcd;

/*********************************************************/
/* P R O T O T Y P E */
/*********************************************************/
void Delay(int del);
void timer1_compa_isr(void);
void timer0_ovf_isr(void);
void GetCount(void);
void PrintFreq(void);
void Presentation(void);
void main(void);

/*********************************************************/
/* D E F I N E */
/*********************************************************/
#define TRUE 1
#define FALSE 0

#define CLR 0x20
#define OEH 0x10
#define OEM 0x08
#define OEL 0x04

/*********************************************************/
/* G L O B A L V A R I A B L E S */
/*********************************************************/
unsigned long Count;
unsigned long Time;

/*********************************************************/
void Delay(int del)
{
int i,j;

for (j=0;j {
for (i=0;i<320;i++);
}
}

/*********************************************************/
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
if ((PINB & 0x02) == 0x02)
{
GetCount();
PrintFreq();
}
}

/*********************************************************/
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
if (UpdateLcd == TRUE) LcdUpdate();
}

/*********************************************************/
void GetCount(void)
{
Count = 0;

PORTD &= ~OEH;
Delay(1);
Count = (unsigned long)((PINC & 0x3f) + (PIND & 0xc0));
PORTD |= OEH;

Count = Count << 8;

PORTD &= ~OEM;
Delay(1);
Count += (unsigned long)((PINC & 0x3f) + (PIND & 0xc0));
PORTD |= OEM;

Count = Count << 8;

PORTD &= ~OEL;
Delay(1);
Count += (unsigned long)((PINC & 0x3f) + (PIND & 0xc0));
PORTD |= OEL;

PORTD &= ~CLR;
Delay(1);
PORTD |= CLR;
}


/*********************************************************/
void PrintFreq(void)
{
char Str[7];
char Tmp[7];
unsigned char Len;

LcdGotoXY(1,4);
LcdStr(2," ");
LcdGotoXY(2,4);
LcdStr(2," ");

ltoa(&Str[0],Count,10);
Len = strlen(&Str[0]);
Str[Len] = 0x00;

if (Count < 1000)
{
LcdGotoXY(12-(2*Len),4);
LcdStr(2,&Str[0]);
LcdGotoXY(13,3);
LcdStr(1," " );

Time = 100000 / Count;
ltoa(&Str[0],Time,10);

if (Count <= 1000)
{
Tmp[0] = Str[0];
Tmp[1] = '.';
Tmp[2] = Str[1];
Tmp[3] = Str[2];
}
if (Count <= 100)
{
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = '.';
Tmp[3] = Str[2];
}
if (Count <= 10)
{
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = Str[2];
Tmp[3] = ' ';
}
if (Count == 0)
{
Tmp[0] = ' ';
Tmp[1] = ' ';
Tmp[2] = '0';
Tmp[3] = ' ';
}
Tmp[4] = 'm';
Tmp[5] = 's';
Tmp[6] = 0x00;
LcdGotoXY(9,6);
LcdStr(1,&Tmp[0]);
return;
}

if (Count < 10000)
{
Tmp[0] = Str[0];
Tmp[1] = '.';
Tmp[2] = Str[1];
Tmp[3] = Str[2];
Tmp[4] = Str[3];
Tmp[5] = 0x00;
LcdGotoXY(2,4);
LcdStr(2,&Tmp[0]);
LcdGotoXY(13,3);
LcdStr(1,"K" );

Time = 1000000 / Count;
ltoa(&Str[0],Time,10);
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = Str[2];
Tmp[3] = ' ';
Tmp[4] = 'u';
Tmp[5] = 's';
Tmp[6] = 0x00;
LcdGotoXY(9,6);
LcdStr(1,&Tmp[0]);
return;
}

if (Count < 100000)
{
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = '.';
Tmp[3] = Str[2];
Tmp[4] = Str[3];
Tmp[5] = Str[4];
Tmp[6] = 0x00;
LcdGotoXY(1,4);
LcdStr(2,&Tmp[0]);
LcdGotoXY(13,3);
LcdStr(1,"K" );

Time = 10000000 / Count;
ltoa(&Str[0],Time,10);
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = '.';
Tmp[3] = Str[2];
Tmp[4] = 'u';
Tmp[5] = 's';
Tmp[6] = 0x00;
LcdGotoXY(9,6);
LcdStr(1,&Tmp[0]);
return;
}

if (Count < 1000000)
{
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = Str[2];
Tmp[3] = '.';
Tmp[4] = Str[3];
Tmp[5] = Str[4];
Tmp[6] = 0x00;
LcdGotoXY(1,4);
LcdStr(2,&Tmp[0]);
LcdGotoXY(13,3);
LcdStr(1,"K" );

Time = 100000000 / Count;
ltoa(&Str[0],Time,10);
Tmp[0] = Str[0];
Tmp[1] = '.';
Tmp[2] = Str[1];
Tmp[3] = Str[2];
Tmp[4] = 'u';
Tmp[5] = 's';
Tmp[6] = 0x00;
LcdGotoXY(9,6);
LcdStr(1,&Tmp[0]);
return;
}

if (Count < 10000000)
{
Tmp[0] = Str[0];
Tmp[1] = '.';
Tmp[2] = Str[1];
Tmp[3] = Str[2];
Tmp[4] = Str[3];
Tmp[5] = Str[4];
Tmp[6] = 0x00;
LcdGotoXY(1,4);
LcdStr(2,&Tmp[0]);
LcdGotoXY(13,3);
LcdStr(1,"M" );

Time = 1000000000 / Count;
ltoa(&Str[0],Time,10);
Tmp[0] = Str[0];
Tmp[1] = Str[1];
Tmp[2] = Str[2];
Tmp[3] = ' ';
Tmp[4] = 'n';
Tmp[5] = 's';
Tmp[6] = 0x00;
LcdGotoXY(9,6);
LcdStr(1,&Tmp[0]);

return;
}
}

/*********************************************************/
void Presentation(void)
{
unsigned char i;

LcdClear();
LcdUpdate();

LcdGotoXY(3,1);
LcdStr(1,"Freq Meter" );
for (i=0;i<9;i++) LcdLine(0,i,83,i,PIXEL_XOR);
LcdGotoXY(5,3);
LcdStr(1,"Sylvain");
LcdGotoXY(3,4);
LcdStr(1,"Bissonnette");
LcdGotoXY(4,6);
LcdStr(1,"Ver : 1.0");
LcdUpdate();
Delay(10000);
LcdClear();
LcdUpdate();
}

/*********************************************************/
void main(void)
{
unsigned char i;

LcdInit();
LcdClear();
LcdUpdate();

Presentation();

LcdGotoXY(3,1);
LcdStr(1,"Freq Meter" );
for (i=0;i<9;i++) LcdLine(0,i,83,i,PIXEL_XOR);

LcdGotoXY(12,4);
LcdStr(1," hz" );
LcdGotoXY(2,4);
LcdStr(2," 0");
LcdGotoXY(1,6);
LcdStr(1,"Period: " );

TCCR0 = 0x05; //start timer0 / 1024

DDRB = 0x3f;
DDRC = 0x00;
DDRD = 0x3e;

PORTD |= OEH;
PORTD |= OEM;
PORTD |= OEL;
PORTD |= CLR;

//TIMER1 initialisation - prescale:256
// WGM: 4) CTC, TOP=OCRnA
// desired value: 2000mSec
// actual value: 2000.000mSec (0.0%)
TCCR1B = 0x00;
OCR1AH = 0x7A;
OCR1AL = 0x11;
TCCR1A = 0x40;
TCCR1B = 0x0C;

TIMSK = 0x11; //timer interrupt sources
SEI(); //re-enable interrupts
while(1)
{
Delay(10);
}
}




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 567:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru