PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کار با تایمر در کدویژن



hamid6568
18-01-2011, 22:50
سلام
آقا من دیگه علنن کم آوردم.:sa::unh::unh:
اینجا کامل پروژمو توضیح میدم و فایلشو میزارم. یه جوونمرد بگه ایراد کارم کجاس :cry:
1.هدفم اینه که یه موج با فرکانس حدود 400HZ و دیوتی سایکل 50% رو بگیرم
2.فرکانی دقیقشو بدست بیارم
3.با همون فرکانس 2تا موج تولید کنم که باهم و با سیگنال ورودی 120درجه اختلاف فاز داشته باشن
برنامه:

/************************************************** ***
This program was produced by the
CodeWizardAVR V2.05.0 Advanced
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
You can see links before reply

Project :
Version :
Date : 01/18/2011
Author : You can see links before reply (You can see links before reply) *** You can see links before reply (You can see links before reply)
Company :
Comments:


Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
************************************************** ***/

#include <mega32.h>
#include <delay.h>
#include <stdio.h>
unsigned long int ovf=0;
unsigned long int ovf1;
unsigned long int T;
unsigned int tt;
char capt=0;
bit sect;
void delay(void)
{
ovf1=ovf;
while(!ovf1==0)
{
if ((TIFR&0x04)==1)
{
ovf1=ovf1-1;
TIFR=TIFR|0x04;
}
}
TCNT1=tt;
TCCR1B=0xc1; //start timer
while(TIFR&0x04==1)
TIFR=TIFR|0x04;
}
void sectors(void)
{
sect=0;
TCCR1B=0xc1; //start timer
PORTB.0=0;
PORTB.1=1;
delay();
PORTB.0=0;
PORTB.1=0;
delay();
PORTB.0=1;
PORTB.1=0;
delay();
PORTB.0=1;
PORTB.1=0;
delay();
PORTB.0=1;
PORTB.1=1;
delay();
PORTB.0=0;
PORTB.1=1;
delay();
}

interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here

}

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if(capt<3)
{
ovf++;
}
}

// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if(capt<3)
{
capt++;
if(capt<2)
{TCCR1B=0xc1;} //start timer
}
else
{
sectors();
//sect=1;
}
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=P State5=T State4=T State3=T State2=P State1=T State0=T
PORTD=0x44;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: On
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0xc0;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x24;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
if (capt==2)
{
TCCR1B=0xc0; //stop timer
#asm("cli")
T=ovf*0xffff+TCNT1;
T=T/0x06;
ovf=T/0xffff;
tt=T%0xffff;
tt=0xffff-tt;
capt++;
#asm("sei")
}
//else if(sect==1)
//sectors();
}
}


روش کارم اینه:
1.سیگنال ورودی رو به پایه کپچر تایمر0 دادم و با اندازه گیری فاصله 2لبه بالارونده پریود سیگنال رو بدست آوردم(فکر کنم مشکلم تو این قسمته)
2.پریود رو تقسیم به 6 کردم تا مدت زمان 60درجه از سیگنالمو بدست بیارم.
3.بعد تو تابع ()sectors خروجی هامو تو 6 قسمت(60 درجه به 60 درجه)روی پورت های b.0 و b.1 رسم کردم.
همین :mrgreen:
اما سیگنال های خروجیم اصلا هم فرکانس با سیگنال اصلی نیستن(تازهdiuty sycle افتضاحیم دارن:baad:)
دوستان اگر میتونید راهنمایی کنید داغونم کرده:x :cry:

Wizard
22-01-2011, 15:40
سلام


1.هدفم اینه که یه موج با فرکانس حدود 400hz و دیوتی سایکل 50% رو بگیرم
2.فرکانی دقیقشو بدست بیارم
3.با همون فرکانس 2تا موج تولید کنم که باهم و با سیگنال ورودی 120درجه اختلاف فاز داشته باشن
[/right]

متوجه هدفت نمیشم کمی بیشتر توضیح بدید؟

hamid6568
22-01-2011, 21:50
متوجه هدفت نمیشم کمی بیشتر توضیح بدید؟
ممنون بابت وقت گذاشتنت:hi::018:
1.هدفم اینه که یه موج با فرکانس حدود 400hz و دیوتی سایکل 50% رو بگیرم
2.فرکانس دقیقشو بدست بیارم
3.با همون فرکانس 2تا موج تولید کنم که باهم و با سیگنال ورودی 120درجه اختلاف فاز داشته باشن
فرکانس سیگنال وروردیم حدود 400هست اما دقیقشو باید با میکرو بدست بیارم.
بعد با همون فرکانس 2تا سیگنال تو خروجی تولید کنم.
که این 2تا سیگنال هرکدوم دقیقا باهم و با اون سیگنال اولیه 120درجه اختلاف فاز داشته باشن

Wizard
23-01-2011, 09:39
سلام!

این برنامه رو یک نگاهی بنداز.

Test.rar (You can see links before reply)

این برنامه فرکانس 200 هرتز دقیقی روی پایه PORTB.0 ایجاد می کنه
البته وقفه هر 2500 میکرو ثانیه رخ میده ( فرکانس 400 هرتز ) و چون باید یک بار خاموش و یک بار هم روشن کنه به فرکانس 200 هرتز رسید حال خودت می تونی با استفاده از برنامه زیر مقدار فرکانس 400 هرتز رو بدست بیاری کافیه که فرکانس کاری میکرو و مقدار زمان وقفه رو بدی تا برنامه مقادیر تایمر رو بهت بده

Timer.rar (You can see links before reply)

می تونی فایل شبیه ساز که با پروتئوس ایجاد کردم رو هم ببینی.

اگر نتونستی کمکت می کنم!:wink:

1nafar
23-01-2011, 09:51
سلام
کتاب آموزش سریع میکرو کنترلر های Avr ، نوشته ی اقای رضا سپاس یار بخش تایمر و کانتر ها رو خیلی خوب توضیح داده و خوندش میتونه به شما در نوشتن برنامه کمک کنه
You can see links before reply