Возбуд убрать не получится. На частотах ниже 70Мгц сильно падает чутье.UkrRadist писал(а):а можно как то убрать это возбуждение,что бы показовало ноль при отсутствии сигнала?И ще:что покажет частотомер.если на вход подать частоту ниже 70МГц(по Даташиту - это минимальная вх.частота)?
Частотомер на МЕГА8
- Реклама
Re: Частотомер на МЕГА8
Люди сделал частотомер на МЕГЕ для авто и вывода инфы на 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]
Код
Конструктивная Критика приветствуется, ибо в этом начал разбираться тока 4 дня назад...
Схема
[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);
....
}
}Re: Частотомер на МЕГА8
вообщем решил ту проблему использовав Мегу16, теперь новая проблема юзаю 3х разрядный индикатор, все горит и выводиться правильно, но почемуто частота сигнала считается не правильно, в чем может быть причина непонимаю.... если мультиметром тыкать в коннектор провода он считает частоту в секунду, а если провод подсоединить то нет...
вот график предполагаемого сигнала
[img]http://kiro_1.users.photofile.ru/photo/kiro_1/3668545/xlarge/88979920.jpg[/img]
программа
вот график предполагаемого сигнала
[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);
};
}
