سلام
من می خوام با mega16 و کریستال 16MHz یه قطار پالس با فرکانس متغیر از 122Hz تا 8Mhz تولید کنم. روش کار به این صورت هست که فرکانس رو به برنامه میدم و برنامه زمان نصف پالس رو محاسبه می کنه. بر اساس این زمان، مقدار OCR1AH و OCR1AL رو تنظیم می کنه و در مد CTC با مقدار حد اکثر OCR1A تایمر شروع به شمارش می کنه و با رسیدن مقدار OCR پایه OC1A تغییر وضعیت ( toggle ) میده. برنامه رو تو avr studio تست کردم و درست کار می کنه. اما در عمل و توی پروتیوس ، تایمر OCR1AH رو نادیده می گیره و مقدار شمارش رو فقط با OCR1AL مقایسه می کنه. در نتیجه فرکانس های پایین تولید نمیشن. من که نتونستم دلیلی براش پیدا کنم. کسی می دونه دلیل نادیده گرفته شدن OCR1AH چیه؟
اینم برنامه
من می خوام با mega16 و کریستال 16MHz یه قطار پالس با فرکانس متغیر از 122Hz تا 8Mhz تولید کنم. روش کار به این صورت هست که فرکانس رو به برنامه میدم و برنامه زمان نصف پالس رو محاسبه می کنه. بر اساس این زمان، مقدار OCR1AH و OCR1AL رو تنظیم می کنه و در مد CTC با مقدار حد اکثر OCR1A تایمر شروع به شمارش می کنه و با رسیدن مقدار OCR پایه OC1A تغییر وضعیت ( toggle ) میده. برنامه رو تو avr studio تست کردم و درست کار می کنه. اما در عمل و توی پروتیوس ، تایمر OCR1AH رو نادیده می گیره و مقدار شمارش رو فقط با OCR1AL مقایسه می کنه. در نتیجه فرکانس های پایین تولید نمیشن. من که نتونستم دلیلی براش پیدا کنم. کسی می دونه دلیل نادیده گرفته شدن OCR1AH چیه؟
اینم برنامه
#include <mega16.h>
#define FRE 150
#define N 1000
// Declare your global variables here
unsigned long int n;
void pulse(unsigned long int f,unsigned long int n_2);
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
n--;
if(n==0)
{
TCCR1B=0x00;
PORTA.0=1;
}
}
void main(void)
{
PORTD=0x00;
DDRD=0x20;
PORTA=0x00;
DDRA=0x01;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x40;
// TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei"
pulse(FRE,N);
while (1);
}
void pulse(unsigned long int f,unsigned long int n_2)
{
double t=0;
unsigned int c=0;
n=2*n_2;
t=1000000000/(2*f); // half time
c=t/62.5;
OCR1AL=c;
OCR1AH=(c>>8);
TCCR1B=0x09;
PORTA.0=0;
}
#define FRE 150
#define N 1000
// Declare your global variables here
unsigned long int n;
void pulse(unsigned long int f,unsigned long int n_2);
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
n--;
if(n==0)
{
TCCR1B=0x00;
PORTA.0=1;
}
}
void main(void)
{
PORTD=0x00;
DDRD=0x20;
PORTA=0x00;
DDRA=0x01;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x40;
// TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei"

pulse(FRE,N);
while (1);
}
void pulse(unsigned long int f,unsigned long int n_2)
{
double t=0;
unsigned int c=0;
n=2*n_2;
t=1000000000/(2*f); // half time
c=t/62.5;
OCR1AL=c;
OCR1AH=(c>>8);
TCCR1B=0x09;
PORTA.0=0;
}
دیدگاه