⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 schduler for AVR mcu
💻 C
字号:
/*
  ------------------------------------------------------------------

   Main.c (v1.00)

  ------------------------------------------------------------------

   Framework for traffic-light controller (multi-state task).
 
   Required linker options (see text for details):

   OVERLAY (main ~ (TRAFFIC_LIGHTS_Update), 
   SCH_Dispatch_Tasks ! (TRAFFIC_LIGHTS_Update))


   COPYRIGHT
   ---------

   This code is from the book:

   PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont 
   [Pearson Education, 2001; ISBN: 0-201-33138-1].

   This code is copyright (c) 2001 by Michael J. Pont.
 
   --- Modefied by  sylva zhu to apply for  AVR Microcontroller .
   --- Ver 1.0  Sept 25th , 2006 .

  ------------------------------------------------------------------
*/
#include  <iom32.h>
#include  <inavr.h>
#include  <comp_a90.h>
//
#include  "Main.h"
#include  "Scheduler.h"
#include  "timer.h"
#include  "T_lights.h"
#include  "T_KeyScan.h"
#include  "T_KeyProcess.h"
#include  "T_AlarmBell.h"
#include  "T_Lcd.h"
#include  "RTC.h"
#include  "T_Measure.h"
//
//
 unsigned char __flash  name1[]={"  SCHEDULER   DEMO          "};
 unsigned char __flash  name2[]={"   ENGINEER DEPARTMENT      "};
 unsigned char __flash  name3[]={"   FEB 6 , 2006             "};
 unsigned char __flash  name4[]={"   VERSION:2.0A             "};
//
//
//*****************************************************************************
//delay  routine
void delay( unsigned int i )
{
  unsigned int j,k;
  for(k=1;k<=i;k++)
   {
     for(j=1;j<=124;j++)
         _NOP();
   }
}
//*****************************************************************************
void InitADC(void)
{
 //SET ADC REFERENCE VOLTAGE : internal Aref 2.56V .ADC CHANNEL 0
  ADMUX|=((1<<REFS1)|(1<<REFS0)|(1<<MUX0));
  //ADC ENABLE ,CLEAR ADIF FLAGBIT. 1/64 CLOCK DIVIDER 125KHZ
  ADCSRA|=((1<<ADEN)|(1<<ADIF)|(1<<ADPS1)|(1<<ADPS0));
  //delay in order for channel selection settle.
  __delay_cycles(10);
  //run a demo adc
  ADCSRA|=(1<<ADSC);
  while(!(ADCSRA&(1<<ADIF)));
  ADCSRA|=(1<<ADIF);
}
//*****************************************************************************
void InitIOPORT(void)
{
  //init_mega32()
  // PIN 7,6,1,0 INPUT ; PIN 5,4,3,2 OUTPUT.
  //GASADC,TEMPADC ,K17,K18 INPUT
  //RUNLED,ALARMLED OUTPUT
  DDRA&=~((1<<DDA7)|(1<<DDA6)|(1<<DDA1)|(1<<DDA0));
  DDRA|=((1<<DDA2)|(1<<DDA3)|(1<<DDA4)|(1<<DDA5));
  PORTA|=(1<<PORTA6)|(1<<PORTA7);                 // Enable weak pull_up .
  // PIN 7 ,6,5,4,3,1 OUTPUT *ALARM BELL OUTPUT ,PIN 0,2 INPUT
  DDRD|=((1<<DDD7)|(1<<DDD6)|(1<<DDD5)|(1<<DDD4)|(1<<DDD3)|(1<<DDD1));
  DDRD&=~(1<<DDD2);
  PORTD|=(1<<PORTD2);                            // Enable weak pull_up .
  //PORTB  ALL PIN  OUTPUT
  DDRB|=((1<<DDB7)|(1<<DDB6)|(1<<DDB5)|(1<<DDB4)|(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0));

}
//*****************************************************************************
void InitDevice(void)
{
 InitIOPORT();
 InitADC();
 InitRTC();
}
//
/* 
................................................................................ 
*/
//
void main(void)
{
   unsigned char i;
   //
   // Shut-up watchdog .
   WDTCR=(1<<WDTOE)|(1<<WDE);
   WDTCR=(0<<WDE);
   // Wait power stable .
   __delay_cycles(1000);
   // 
   __disable_interrupt();
   //
   InitDevice();
   InitLcd();
   ShowString(0,name1);     //name1[]={" NTC TESTER        "};
   ShowString(1,name2);     //name2[]={"ENGINEER DEPARTMENT"};
   ShowString(2,name3);     //name3[]={"   JAN 3 , 2005    "};
   ShowString(3,name4);     //name4[]={"VERSION:2.0A       "};
  //
  for(i=20;i>0;i--)
  {
   __delay_cycles(5);
   __delay_cycles(5);
   __delay_cycles(5);
   //DelayL();
   //DelayL();
   //DelayL();
   }//delay for display stable
   InitLcd();
   ShowString(0,name1);
   //
   //
   // Set up the scheduler 
   SCH_Init();

   // Prepare for the traffic light task
   TRAFFIC_LIGHTS_Init(RED);

   // Add a 'traffic light' task , 1mS tick , every ---500ms--- called .
   SCH_Add_Task(TRAFFIC_LIGHTS_Update, 20, 500);
   // Add a 'key_scan' task ,every 10ms called .
   SCH_Add_Task(KEY_SCAN_Update, 30, 10);
   // Add a 'key_process' task  , every 100ms called .
   SCH_Add_Task(KEY_PROCESS_Update, 40, 100);
   // Add a 'Run_bell' task, every 1000ms called .
   SCH_Add_Task(ALARM_BELL_TRIG_Update, 50, 300);
   // Add a 'RTC' task , every 1000ms called .
   SCH_Add_Task(RTC_Update, 65, 1000);
   // Add a 'MEASURE' task , every  10ms called
   SCH_Add_Task(ADC_Update, 35, 10);
   // Start the scheduler .
   // Enable interrupt .
   SCH_Start();
   //
   //
   while(1)
    {
      SCH_Dispatch_Tasks();
    }
   
}

/*
------------------------------------------------------------------*-
  ---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------
*/





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -