Частотомер на МЕГА8

Обсуждаем цифровые устройства...
Barni
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср дек 06, 2006 02:34:58

Сообщение Barni »

UkrRadist писал(а):а можно как то убрать это возбуждение,что бы показовало ноль при отсутствии сигнала?И ще:что покажет частотомер.если на вход подать частоту ниже 70МГц(по Даташиту - это минимальная вх.частота)?
Возбуд убрать не получится. На частотах ниже 70Мгц сильно падает чутье.
Реклама
lirik
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 17, 2010 23:27:58

Re: Частотомер на МЕГА8

Сообщение lirik »

Люди сделал частотомер на МЕГЕ для авто и вывода инфы на WG12864A., но такой трабл сигналы идут на порта INT0 и INT1, а на экран данные с портов PBх и PCx, а если PB6 и PB7 заняты на входа то куда Кварц подсоединять? и если выводить данные через порты PD, то как сделать прерывание по изменению состояния на порту если они есть тока для INT0/1
Схема
[img]http://kiro_1.users.photofile.ru/photo/kiro_1/3814294/xlarge/88720947.jpg[/img]
Код

Код: Выделить всё

#include <iom8v.h>
#include <stdlib.h> 
#include <macros.h>
#include <stdlib.h>
#include <math.h>
#include <interrupt.h>

#define SetBit(x,y) (x|=y)
#define ClrBit(x,y) (x&=~y)
#define TestBit(x,y) (x&y)

#define LCD_RST 0b00000001
#define LCD_E   0b00000010
#define LCD_RW  0b00000100
#define LCD_RS  0b00001000
#define LCD_CS2 0b00010000
#define LCD_CS1 0b00100000

#define LCD_DB PORTB
#define LCD_COM PORTC

#include "delay.h"
#include "ks0108.h"

unsigned char text,str[];
unsigned char rez[1];
 unsigned int HZ=0;
 unsigned int HZ0=0;
 unsigned int speed1=0;
 unsigned int taho=0;
 
void port_init(void)
{
  PORTB = 0xFF;
 DDRB  = 0xFF;
 PORTC = 0xFF; 
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0x00;
}

void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFF; //setup
 TCNT1L = 0xFF;
 //OCR1AH = 0xFF;
 //OCR1AL = 0x09;
 OCR1BH = 0x3D;
 OCR1BL = 0x85;
 ICR1H  = 0x08;
 ICR1L  = 0x08;
 //TCCR1A = 0xE0;
 TCCR1B = 0b00000011; //start Timer
 } 

#pragma interrupt_handler TIM1_OVF_isr:iv_TIM1_OVF
void TIM1_OVF_isr(void) 
{
 //external interupt on INT1
 TCNT1=0;
 speed1=HZ;
 taho=HZ0;
HZ=0;
HZ0=0;
} 

#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{
 //external interupt on INT1
HZ+=1;
} 

#pragma interrupt_handler int0_isr:iv_EXT_INT0
void int0_isr(void)
{
 //external interupt on INT1
HZ0+=1;
}  

void main()
{
 char String;
int i,j;
char spd[1];
char str[10]; 
 
 DDRC=0xFF;
 DDRD=0x00; 
 DDRB=0xFF;
   
 CLI(); //disable all interrupts
  init_lcd(); 
  timer1_init();
  Delay_ms(10);
 clear();
 Delay_ms(10);
  
 MCUCR = 0x0A;// для обоих портов //MCUCR = 0x0C; чисто для int1
 GICR  = 0xC0;// для обоих портов  //GICR  = 0x80; чисто для int1
 TIMSK = 4; //timer interrupt sources
 SEI();
 
 while(1){
     ....
 	вывод инфы на дисплей
           display(speed1);
           display(taho);
	....				  				
 		  }
 }
Конструктивная Критика приветствуется, ибо в этом начал разбираться тока 4 дня назад...
Реклама
lirik
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 17, 2010 23:27:58

Re: Частотомер на МЕГА8

Сообщение lirik »

вообщем решил ту проблему использовав Мегу16, теперь новая проблема юзаю 3х разрядный индикатор, все горит и выводиться правильно, но почемуто частота сигнала считается не правильно, в чем может быть причина непонимаю.... если мультиметром тыкать в коннектор провода он считает частоту в секунду, а если провод подсоединить то нет...
вот график предполагаемого сигнала
[img]http://kiro_1.users.photofile.ru/photo/kiro_1/3668545/xlarge/88979920.jpg[/img]
программа

Код: Выделить всё

#include <mega16.h>
#include <delay.h>
#include <math.h>


int i=1;
char E3,E2,E1,E0;

 unsigned int HZ=0;
 unsigned int HZ0=0;
 unsigned int HZ1=0;
 unsigned int speed1=0;
 unsigned int taho=0;
  unsigned int taho1=0;


void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFF; //setup
 TCNT1L = 0xFF;
 //OCR1AH = 0xFF;
 //OCR1AL = 0x09;
 OCR1BH = 0x3D;
 OCR1BL = 0x85;
 ICR1H  = 0x08;
 ICR1L  = 0x08;
 //TCCR1A = 0xE0;
 TCCR1B = 0b00000011; //start Timer
 }

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
 HZ0+=1;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
HZ+=1;
}

// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here
  HZ1+=1;
}
interrupt [TIM1_OVF] void TIM1_OVF_isr(void)
{

 TCNT1=0;
 speed1=HZ;
 speed1=HZ0;  //taho
 speed1=HZ1;      //taho1
HZ=0;
HZ0=0;
HZ1=0;
}
void main(void)
{
int j;
int i1;
char a[10][1] =
{
{0x3F}, //0
{0x06}, //1
{0x5B}, //2
{0x4F}, //3
{0x66}, //4
{0x6D}, // 5
{0x7D}, //6
{0x07}, //7
{0x7F}, //8
{0x6F} //9
};

DDRA=0xFF;
DDRC=0xFF; //245654
PORTC=0b00001110;
PORTA=0x00;
DDRD=0x00; //245654
delay_ms(100);
#asm("CLI") //disable all interrupts
 timer1_init();

 MCUCR = 0x0A;//int0/1/2  MCUCR = 0x0A;// для обоих портов int0/1 //MCUCR = 0x0C; чисто для int1
 GICR  = 0xE0;//int0/1/2 GICR  = 0xC0;// для обоих портов int0/1 //GICR  = 0x80; чисто для int1

 i=1 ;


 TIMSK = 4; //timer interrupt sources
 #asm("SEI")   //();

while(1)
{
if(speed1<1){
 speed1=0002;
};

 i1=speed1;
 E3=i1/1000;
 i1=i1-1000*fabs(i1/1000);
 E2=i1/100;
 i1=i1-100*fabs(i1/100);
 E1=i1/10;
 i1=i1-10*fabs(i1/10);
 E0=i1;

PORTC=0b00001000;
j=E2;             // 1 цифра
PORTA=a[1][j-1] ;
PORTA^=0xFF;
delay_ms(1);
delay_ms(1);
PORTC=0b00000010;   // 2 цифра
j=E1;
PORTA=a[1][j-1] ;
PORTA^=0xFF;
delay_ms(1);
PORTC=0b00000100;   // 3 цифра
j=E0;
PORTA=a[1][j-1] ;
PORTA^=0xFF;
delay_ms(1);
};
}
Ответить

Вернуться в «Цифровая техника»