پنج شنبه 26 تیر 1399 | Thursday 16 th of July 2020 صفحه اصلی گروه الکترونیکی کامپیوتر
برنامه اصلی به زبان Codevision

This program was produced by the

CodeWizardAVR V2.05.3 Standard

Automatic Program Generator

© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.

Date    : 07/10/2012

Chip type               : ATmega16

Program type            : Application

AVR Core Clock frequency: 8.000000 MHz

Memory model            : Small

External RAM size       : 0

Data Stack size         : 256

*****************************************************/

اضافه کردن کلمات کلیدی و رجیستر های مربوط به میکروکنترلرATMega

#include <mega16.h>

توابع  bcd

#include < bcd.h>

توابع تاخیر

#include <delay.h>

ثابت های  t1,t2,t3,t4زمانهای هر یک از 4 چراغ را نگاه داری می کنند و بع این علت ثابت تعریف شده اند که در طول برنامه تحت تاثیر عملیات به طور ناخواسته تغییر نکنند.

این اعداد هر عدد دلخواهی می توانند با شند به شرط انکه:

1.     کمتر از 10 نباشند  2. جمع هر 3 عدد بیشتر از 999 نشود

const unsigned int t1=33,t2=41,t3=67,t4=58;

tt1,tt2,tt3,tt4به عنوان متغیر های عملیاتی هستند تا در هر لحضه مقدار زمان جاری هر چراغ را نگاهداری کنند:

unsignedint tt1,tt2,tt3,tt4;

اطلاعات اعداد را به صورت BCD برای به نمایش در اوردن نگاه داری می کند:

unsigned char Ac,Ab,Ab,Bc,Bb,Ba;

در مدار بیت های 5و6و7 پورت  D  به صورت مشترک به چهار سون سگمت متصل هستند و وظیفه فعال سازی اعداد نمایشگر ها را  بر عهده دارند.

unsigned char select,select1=0x80,select2=0x40,select3=0x20;

unsigned char way=1;

voidselectway(void)

{

PORTC=0x00;

 PORTD &=0xE4;

switch (way)

{

case 1:

tt1=t1;

tt2=t1;

tt3=t1+t2;

tt4=tt3+t3;

way =2;

PORTC |=0x4C; PORTD.1=1;

break;

case 2:

tt2=t2;

            tt3=t2;

            tt4=t2+t3;

            tt1=tt4+t4;

way=3; 

PORTC |=0x61; PORTD.1=1;

break;

case 3:

tt3=t3;

tt4=t3;

tt1=t3+t4;

 tt2=tt1+t1;

way=4;

PORTC |=0x09; PORTD |=0x03;

break;

case 4:

tt4=t4;

tt1=t4;

tt2=t4+t1;

 tt3=tt2+t2;

way=1;

PORTC |=0x49; PORTD |=0x10;

break;

    }      

}

این تابع مقادیر ttرا به مقدار bcdجهت نمایش تبدیل کرده  و در متغیر های مربوطه قرار می دهد.

VoidChangeToShow(unsigned int t1,unsigned int t2,unsigned int t3,unsigned int t4)

{

unsigned char ct1,ct2,ct3,ct4;

Ac=Ab=Aa=Bc=Bb=Ba=0;

if(t1>99) { Ac=(t1 / 100); t1=t1%100; }

 ct1=(unsigned char)t1;

ct1=bin2bcd(ct1);

Ab=(ct1>>4);

Aa=(ct1 & 0x0f);

if(t2>99) { Ac |=((t2/100)<<4); t2=t2%100; }

  ct2=(unsigned char)t2;

 ct2=bin2bcd(ct2);

Ab |=(ct2 & 0xf0);

Aa |=(ct2<<4);

if(t3>99) {Bc=(t3/100); t3=t3%100;}

ct3=(unsigned char)t3;

ct3=bin2bcd(ct3);

Bb=ct3>>4;

Ba=(ct3 & 0x0f);

if(t4>99) {ct4=(unsigned char)t4;

 ct4=(unsigned char)t4;

ct4=bin2bcd(ct4);

 Bb |=(ct4 & 0xf0);

Ba |=(ct4<<4); 

      select1=0x80;select2=0x40;select3=0x20;

}

این تابع تایمر شماره صفر است که  شمارنده ای تا 255 است.

این تابع مقادیر bcdکه قبلا محاسبه کرده ایم را بر روی پورت مورد نظر قرار داده و رقم اول یا دوم یا سوم از نمایشگر را فعال میکند . این عمل را به سرعت انجام داده در نتیجه چشم انسان قادر به تشخیص روشن و خاموش شدن چراغ ها نیست و انها را پیوسته روشن می بیند.

Interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

   PORTD &=0x1f;

 

PORTA=Aa;

PORTB=Ba;

PORTD |=select1;

select=select1;

select1=select2;

select2=select3;

select3=select;

Aa=Ab;

Ab=Ac;

  Ac=PORTA;

 Ba=Bb;

Bb=Bc;

Bc=PORTB;

}

شمارنده شماره 1 که وظیفه ان محاسبه یک ثانیه است و در هر ثانیه اجرا شده و مقادیر نمایشگر ها را یک رقم کاهش داده و یا اگر به 10 رسیده بود چراغ زرد را  روشن می کند و اگر به صفر رسیده باشد دستور سبز شدن مسیر بعدی را می دهد.

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

// Place your code here

    TCCR0=0x00;

    #asm("cli") 

if(tt1 ==10 || tt2== 10 || tt3 ==10 || tt4==10)

{   

switch (way) 

{

case 1:   PORTD.4=0; PORTD.3=1; break;

case 2:   PORTC.2=0; PORTC.1=1; break;

case 3:   PORTC.5=0; PORTC.4=1; break;

case 4:   PORTD.0=0; PORTC.7=1; break;

 }

 }

if (!( tt1 && tt2 && tt3 && tt4))

selectway();

else

  {

tt1--;

tt2--;

          tt3--;

         tt4--;

ChangeToShow(tt1,tt2,tt3,tt4);

  #asm("sei")

TCCR0=0x03;

}

وقفه خارجی شماره صفر .این وقفه که به کلید انتخاب مسیر مدار متصل شده  در صورت فعال شدن ابتدا نمایشگر ها  را خاموش می کند.سپس صبر می کند تا کلید رها شود انگاه مسیر بعدی را انتخاب و مقدار های اولیه مورد نظر را قرار می دهد و به مقدار 400 میلی ثانیه مدار را متوقف می کند .

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

// Place your code here

#asm("cli")

PORTD.5=0;

PORTD.6=0;

PORTD.7=0;

while(~(PIND.2));

if(way ==4)

{     

 PORTC=0x00;

PORTD &=0xE4;

tt4=t4;

 tt1=t4;

tt2=t4+t1;

tt3=tt2+t2;

way=1;

PORTC =0x49;

PORTD |=0x10;

delay_ms(600);

}

else

{

delay_ms(400); selectway();

}

 

#asm("sei")

}

// Declare your global variables here

 

void main(void)

{

// Input/Output Ports initialization

// Port A 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

PORTA=0x00;

DDRA=0xFF;

// Port B 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

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=0xFF;

 

// Port D 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

PORTD=0x80;

DDRD=0xFB;

مقدار دهی و تنظیمات مر بوط به تایمر شماره صفر

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: 31.250 kHz

// Mode: Normal top=0xFF

// OC0 output: Disconnected

TCCR0=0x03;

TCNT0=0x00;

OCR0=0x00;

مقدار دهی و تنظیمات مربوط به تایمر شماره 1

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 7.813 kHz

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: On

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x0D;

//TCCR1B=0x01;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

/*OCR1AH=0x1E;

OCR1AL=0x85;*/

OCR1AH=0x0F;

OCR1AL=0x42;

 

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: Low level

// INT1: Off

// INT2: Off

GICR|=0x40;

MCUCR=0x00;

MCUCSR=0x00;

GIFR=0x40;

 

فعال کردن وفقه مربوط به تایمر صفر و یک

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x11;

 

// 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;

selectway();

ChangeToShow(tt1,tt2,tt3,tt4);

// Global enable interrupts

#asm("sei")

 

while (1)

      {

      // Place your code here

      }

}

Compatability by:
آخرین به روز رسانی سایت: سه شنبه, 22 اسفند 1391 - 00:26