Ejemplo n.º 1
0
void decision_complete(void)
{
#if 0
	msg_arrives.dec = 1;
	if(status_gnss.ant_status == 2) {
		led_mode(LED_MODE_GNSS_EANT);
	} else	if(geoinfo.mode != GEOM_NONE) {
		status_gnss.valid = 1;
		led_mode(LED_MODE_GNSS_VALID);
	} else {
		status_gnss.valid = 0;
		if(geoinfo.sats.visible)
			led_mode(LED_MODE_GNSS_RECV);
		else
			led_mode(LED_MODE_GNSS_OK);
	}
#endif
	
	Tgeo_packed pgeo;
	geo_pack(&pgeo, &geoinfo);
#if 0
	awc_send_msg(AWC_NAV, &pgeo, sizeof(pgeo));

	DEBUG(GNSS, NORMAL, "GEO ");
	DBGPRINTF_GEO(GNSS, NORMAL, &geoinfo);
	DEBUGCRLF(GNSS, NORMAL);
#endif
}
Ejemplo n.º 2
0
unsigned char read_hv(unsigned char channel)
{
   float xdata hv;

   /* read voltage channel */
   if (!adc_read(channel*2, &hv))
      return 0;

   /* convert to HV */
   hv *= DIVIDER;

   /* apply calibration */
   hv = hv * user_data[channel].adc_gain + user_data[channel].adc_offset;

   /* 0.01 resolution */
   hv = floor(hv * 100) / 100.0;

   led_mode(channel, !(hv > 40));

   DISABLE_INTERRUPTS;
   user_data[channel].u_meas = hv;
   ENABLE_INTERRUPTS;

   return 1;
}
Ejemplo n.º 3
0
// Subscriber Operation - led_state_sub
//# Start led_state_sub_operation Marker
void led_controller::led_state_sub_operation(const sequential_leds_app::led_state::ConstPtr& received_data)
{
#ifdef USE_ROSMOD
  comp_queue.ROSMOD_LOGGER->log("DEBUG", "Entering led_controller::led_state_sub_operation");
#endif
  // Business Logic for led_state_sub_operation
  if ( received_data->led_num == led_num )
    {
      if (useGPIO)
	led_mode(received_data->mode, 
		 received_data->numLEDs, 
		 received_data->delay);
      
      if (publish)
	{
	  sequential_leds_app::led_state nextLEDState;
	  nextLEDState.numLEDs = received_data->numLEDs;
	  nextLEDState.delay = received_data->delay;
	  nextLEDState.mode = received_data->mode;
	  if (!invert)
	    nextLEDState.led_num = led_num + 1;
	  else
	    nextLEDState.led_num = 0;
	  led_state_pub.publish(nextLEDState);
	}
    }
  
#ifdef USE_ROSMOD
  comp_queue.ROSMOD_LOGGER->log("DEBUG", "Exiting led_controller::led_state_sub_operation");
#endif
}
Ejemplo n.º 4
0
Item *led(List *expression)
{
    uint8_t led = eval_as_string(second(expression))[0] == 'R' ? 0 : 1;
    Item *value = third(expression);
    led_mode(led, value ? LEDMANUAL : LEDSTATE_OFF);
    set_out(leds[led], eval_as_uint8(value));
    return 0;
}
Ejemplo n.º 5
0
void setup(void)
{
   unsigned char i;

   watchdog_disable();
   
   XBR0 = 0x01;                 // Enable RX/TX
   XBR1 = 0x40;                 // Enable crossbar
   P0MDOUT = 0x90;              // P0.4: TX, P0.7: RS485 enable Push/Pull
   P0SKIP  = 0x0C;              // Skip P0.2&3 for Xtal
   P0MDIN  = 0xF3;              // P0.2&3 as analog input for Xtal
   P2MDOUT = 0x02;              // P2.1 for external watchdog

   OSCXCN = 0;
   OSCICN |= 0x03;              // Configure internal oscillator for
                                // its maximum frequency

   CLKMUL = 0x00;               // Select internal oscillator as
                                // input to clock multiplier

   CLKMUL |= 0x80;              // Enable clock multiplier
   for (i=0 ; i<100 ; i++);     // Delay for >5us
   CLKMUL |= 0xC0;              // Initialize the clock multiplier

   while(!(CLKMUL & 0x20));     // Wait for multiplier to lock

   CLKSEL |= USB_4X_CLOCK;      // Select USB clock
   CLKSEL |= SYS_INT_OSC;       // Select system clock

   VDM0CN = 0x80;               // VDD monitor enable
   while ((VDM0CN & 0x40)==0);  // wait for VDD monitor to stabilize

   /* start system clock */
   sysclock_init();

   /* init memory */
   RS485_ENABLE = 0;

   /* initialize UART0 */
   uart_init(0, BD_115200);
   PS0 = 1;                     // serial interrupt high priority

   /* Blink LEDs */
   led_blink(0, 3, 150);
   led_blink(1, 3, 150);

   /* invert first LED */
   led_mode(0, 1);

   /* dummy to prevent linker error */
   delay_us(1);
}
Ejemplo n.º 6
0
void user_init(unsigned char init)
{
   unsigned char i;
   unsigned short address;

   /* all output open drain */
   P1MDOUT = 0x00;
   P2MDOUT = 0x00;

   /* initial nonzero EEPROM values */
   if (init) {
      memset(user_data, 0, sizeof(user_data));
      for (i=0 ; i<N_HV_CHN ; i++) {
         user_data[i].ramp_up    = 300;
         user_data[i].ramp_down  = 300;
         user_data[i].u_limit    = MAX_VOLTAGE;
         user_data[i].i_limit    = MAX_CURRENT;
         user_data[i].ri_limit   = MAX_CURRENT;
         user_data[i].trip_time  = 10;

         user_data[i].adc_gain   = 1;
         user_data[i].dac_gain   = 1;
         user_data[i].cur_gain   = 1;
      }
   }

   /* default control register */
   for (i=0 ; i<N_HV_CHN ; i++) {
      user_data[i].control = CONTROL_REGULATION;
      user_data[i].status = 0;
      user_data[i].u_demand = 0;
      user_data[i].trip_cnt = 0;

      /* check maximum ratings */
      if (user_data[i].u_limit > MAX_VOLTAGE)
         user_data[i].u_limit = MAX_VOLTAGE;

      if (user_data[i].i_limit > MAX_CURRENT && user_data[i].i_limit != 9999)
         user_data[i].i_limit = MAX_CURRENT;

      u_actual[i] = 0;
      t_ramp[i] = time();
   }

   /* jumper and address bits as input */
   JU1 = 1;
   JU2 = 1;
   SW1 = 1;
   SW2 = 1;
   GA_A0 = 1;
   GA_A1 = 1;
   GA_A2 = 1;
   GA_A3 = 1;
   GA_A4 = 1;
   GA_A5 = 1;

   /* read six address bits */
   address = GA_A5;
   address = (address << 1) | GA_A4;
   address = (address << 1) | GA_A3;
   address = (address << 1) | GA_A2;
   address = (address << 1) | GA_A1;
   address = (address << 1) | GA_A0;

   /* each device has 5 channels */
   address *= 5;                   
   
   /* keep high byte of node address */               
   address |= (sys_info.node_addr & 0xFF00);

   sys_info.node_addr = address;

   /* set default group address */
   if (sys_info.group_addr == 0xFFFF)
      sys_info.group_addr = 500;

   /* sample initial state of switch */
   old_sw1 = SW1;
   if (old_sw1)
      for (i=0 ; i<N_HV_CHN ; i++)
         user_data[i].status |= STATUS_DISABLED;

   /* set-up DAC & ADC */
   DAC_CLR  = 1;
   ADC_NRES = 1;
   ADC_NRDY = 1; // input
   ADC_DIN  = 1; // input

   delay_ms(300); // wait for the ADC to come up after power on
   reset_adc();

#ifdef HARDWARE_TRIP
   /* reset current trip FF's */
   reset_hardware_trip();
#else
   /* disable hardware trip FF's */
   write_adc(REG_IOCONTROL, (1 << 4));
#endif

   /* force update */
   for (i=0 ; i<N_HV_CHN ; i++)
      chn_bits[i] = DEMAND_CHANGED | CUR_LIMIT_CHANGED;

   /* LED normally off (inverted) */
   for (i=0 ; i<N_HV_CHN ; i++)
      led_mode(i, 1);

   /* initially, trips are enabled */
   trip_reset = 1;    // reset once
   trip_disable = 0;  // trip initially enabled
   for (i=0 ; i<N_HV_CHN ; i++)
      trip_time[i] = 0;
}
Ejemplo n.º 7
0
// Initialization Function
//# Start Init Marker
void led_controller::init_timer_operation(const NAMESPACE::TimerEvent& event)
{
#ifdef USE_ROSMOD
  comp_queue.ROSMOD_LOGGER->log("DEBUG", "Entering led_controller::init_timer_operation");
#endif
  // Initialize Here
  led_num = 0;
  useGPIO = true;
  invert = false;
  publish = false;

  unsigned int numLEDs = 4;  // if using USR LEDs, use 0-3, else use real pin values
  std::string mode = "toggle";
  float delayTime;
 
  bool start = false;
  
  for (int i = 0; i < node_argc; i++)
    {
      if (!strcmp(node_argv[i], "--numleds"))
	{
	  numLEDs = atoi(node_argv[i+1]);
	}
      if (!strcmp(node_argv[i], "--led_num"))
	{
	  led_num = atoi(node_argv[i+1]);
	}
      if (!strcmp(node_argv[i], "--end"))
	{
	  invert = true;
	}
      if (!strcmp(node_argv[i], "--start"))
	{
	  start = true;
	}
      if (!strcmp(node_argv[i], "--nogpio"))
	{
	  useGPIO = false;
	}
      if (!strcmp(node_argv[i], "--delay"))
	{
	  delayTime = atof(node_argv[i+1]);
	}
      if (!strcmp(node_argv[i], "--publish"))
	{
	  publish = true;
	}
      if (!strcmp(node_argv[i], "--mode"))
	{
	  mode = node_argv[i+1];
	}
    }

  if (start)
    {
      if (useGPIO)
	led_mode(mode, numLEDs, delayTime);

      sequential_leds_app::led_state nextLEDState;
      nextLEDState.numLEDs = numLEDs;
      nextLEDState.led_num = led_num + 1;
      nextLEDState.delay = delayTime;
      nextLEDState.mode = mode;
      led_state_pub.publish(nextLEDState);
    }
  if (useGPIO)
    for (int i = 0; i < numLEDs; i++)
      led_set_value(i, LOW);
  // Stop Init Timer
  init_timer.stop();
#ifdef USE_ROSMOD
  comp_queue.ROSMOD_LOGGER->log("DEBUG", "Exiting led_controller::init_timer_operation");
#endif  
}
Ejemplo n.º 8
0
void user_init(unsigned char init)
{
   unsigned char i;

   P2MDOUT = 0xF0; // P2.4-7: enable Push/Pull for LEDs
   P3MDOUT = 0;

   /* initial nonzero EEPROM values */
   if (init) {
      memset(user_data, 0, sizeof(user_data));
      for (i=0 ; i<N_HV_CHN ; i++) {
         user_data[i].ramp_up    = 300;
         user_data[i].ramp_down  = 300;
         user_data[i].u_limit    = MAX_VOLTAGE;
         user_data[i].i_limit    = MAX_CURRENT;
         user_data[i].ri_limit   = MAX_CURRENT;
         user_data[i].trip_time  = 10;

         user_data[i].adc_gain   = 1;
         user_data[i].dac_gain   = 1;
         user_data[i].cur_gain   = 1;
      }
   }

   /* default control register */
   for (i=0 ; i<N_HV_CHN ; i++) {
      user_data[i].control = CONTROL_REGULATION;
      user_data[i].status = 0;
      user_data[i].u_demand = 0;
      user_data[i].trip_cnt = 0;

      /* check maximum ratings */
      if (user_data[i].u_limit > MAX_VOLTAGE)
         user_data[i].u_limit = MAX_VOLTAGE;

      if (user_data[i].i_limit > MAX_CURRENT && user_data[i].i_limit != 9999)
         user_data[i].i_limit = MAX_CURRENT;

      u_actual[i] = 0;
      t_ramp[i] = time();
   }

   /* set default group address */
   if (sys_info.group_addr == 0xFFFF)
      sys_info.group_addr = 400;

   /* jumper as input */
   JU0 = 1;
   JU1 = 1;
   JU2 = 1;

   /* read node configuration */
   for (i=0 ; i<N_HV_CHN ; i++) {
      if (JU0 == 0)
         user_data[i].status |= STATUS_NEGATIVE;
      else
         user_data[i].status &= ~STATUS_NEGATIVE;
   
      if (JU1 == 0)
         user_data[i].status |= STATUS_LOWCUR;
      else
         user_data[i].status &= ~STATUS_LOWCUR;
   }

   /* set-up DAC & ADC */
   DAC_CLR  = 1;
   ADC_NRES = 1;
   ADC_NRDY = 1; // input
   ADC_DIN  = 1; // input

   /* reset and wait for start-up of ADC */
   ADC_NRES = 0;
   delay_ms(100);
   ADC_NRES = 1;
   delay_ms(300);

   write_adc(REG_FILTER, ADC_SF_VALUE);

   /* force update */
   for (i=0 ; i<N_HV_CHN ; i++)
      chn_bits[i] = DEMAND_CHANGED | CUR_LIMIT_CHANGED;

   /* LED normally off (inverted) */
   for (i=0 ; i<N_HV_CHN ; i++)
      led_mode(i, 1);

   for (i=0 ; i<N_HV_CHN ; i++)
      trip_time[i] = 0;
}
Ejemplo n.º 9
0
void user_init(unsigned char init)
{
   unsigned char i;
   unsigned short value;

   /* configure crossbar */
   SFRPAGE = CONFIG_PAGE;

   XBR0 = 0x04;  // Enable UART0
   XBR1 = 0x14;  // Enable INT0 and INT1
   XBR2 = 0x40;  // Enable crossbar

   /* enable external interrupts */
   SFRPAGE = TIMER01_PAGE;

   PX0 = 1;      // INT0 high priority
   PX1 = 1;      // INT1 high priority

   IT0 = 1;      // INT0 is edge sensitive
   IT1 = 1;      // INT1 is edge sensitive

   IE0 = 0;      // Clear pending INT0
   IE1 = 0;      // Clear pending INT1

   EX0 = 0;      // INTs will be enabled 
   EX1 = 0;      // later in hv_on()

   SFRPAGE = CONFIG_PAGE;

   P0MDOUT = 0x11;  // P0.0: TX = Push Pull, P0.4: WD
   P1MDOUT = 0x00;  // all open drain
   P2MDOUT = 0x60;  // P2.5/6: HV_POWER
   P3MDOUT = 0x00;

   /* initial nonzero EEPROM values */
   if (init) {
      for (i=0 ; i<N_HV_CHN ; i++) {
         user_data[i].u_demand   = 0;
         user_data[i].trip_cnt   = 0;
         user_data[i].ramp_up    = 100;
         user_data[i].ramp_down  = 100;
         user_data[i].u_limit    = MAX_VOLTAGE;
         user_data[i].i_limit    = MAX_CURRENT;
         user_data[i].ri_limit   = MAX_CURRENT;
         user_data[i].trip_max   = 0;
         user_data[i].trip_time  = 10;

         user_data[i].adc_gain   = 1;
         user_data[i].adc_offset = 0;
         user_data[i].dac_gain   = 1;
         user_data[i].dac_offset = 0;
         user_data[i].cur_vgain  = 0;
         user_data[i].cur_gain   = 1;
         user_data[i].cur_offset = 0;
      }
   }

   /* default control register */
   for (i=0 ; i<N_HV_CHN ; i++) {
      user_data[i].control       = CONTROL_REGULATION;
      user_data[i].status        = 0;
      user_data[i].u_demand      = 0;
      user_data[i].trip_cnt      = 0;

      /* check maximum ratings */
      if (user_data[i].u_limit > MAX_VOLTAGE)
         user_data[i].u_limit = MAX_VOLTAGE;

      if (user_data[i].i_limit > MAX_CURRENT && user_data[i].i_limit != 9999)
         user_data[i].i_limit = MAX_CURRENT;

      if (user_data[i].ri_limit > MAX_CURRENT)
         user_data[i].ri_limit = MAX_CURRENT;

      u_actual[i] = 0;
      t_ramp[i] = time();

      /* read pos/neg jumper */
      JU1 = 1;
      if (JU1 == 0)
         user_data[i].status |= STATUS_NEGATIVE;
      else
         user_data[i].status &= ~STATUS_NEGATIVE;
      user_data[i].status |= STATUS_LOWCUR;
   }

   /* switch off HVs */
   hv_on(0, 0);
   hv_on(1, 0);

   /* HV power reset */
   HV1_POWER = 0;
   HV2_POWER = 0;

   delay_ms(400);

   HV1_POWER = 1;
   HV2_POWER = 1;

   /* set default group address */
   if (sys_info.group_addr == 0xFFFF)
      sys_info.group_addr = 200;

   /* get address from crate backplane read through internal ADC */
   SFRPAGE = LEGACY_PAGE;
   REF0CN  = 0x03;           // use internal voltage reference
   AMX0CF  = 0x00;           // select single ended analog inputs
   ADC0CF  = 0x98;           // ADC Clk 2.5 MHz @ 98 MHz, gain 1
   ADC0CN  = 0x80;           // enable ADC 

   SFRPAGE = ADC0_PAGE;
   sys_info.node_addr = 0;
   for (i=0 ; i<7 ; i++) {
      AMX0SL  = i;           // set multiplexer
      delay_ms(10);          // wait for settling time

      DISABLE_INTERRUPTS;
     
      AD0INT = 0;
      AD0BUSY = 1;
      while (!AD0INT);   // wait until conversion ready
   
      ENABLE_INTERRUPTS;

      value = ADC0L | (ADC0H << 8);
      if (value > 1000)
         sys_info.node_addr |= (1 << i);
   }

   /* each unit contains two addresses */
   sys_info.node_addr <<= 1;

   /* set-up DAC & ADC */
   ADC_NRDY = 1; // input
   ADC_DIN  = 1; // input
   ADC_NRES = 1; // remove reset
   DAC_NCLR = 1; // remove clear

   write_adc(REG_FILTER, ADC_SF_VALUE);

   /* force update */
   for (i=0 ; i<N_HV_CHN ; i++)
      chn_bits[i] = DEMAND_CHANGED | CUR_LIMIT_CHANGED;

   /* LED normally off (inverted) */
   for (i=0 ; i<N_HV_CHN ; i++)
      led_mode(i, 1);

   /* initially, trips are enabled */
   trip_enable(0, 1);
   trip_enable(0, 2);
   trip0 = trip1 = 0;
   trip0_reset = trip1_reset = 0;
   trip_change[0] = trip_change[1] = 0;
   trip_time[0] = trip_time[1] = 0;
}
Ejemplo n.º 10
0
void setup(void)
{
   unsigned char adr, flags, d;
   unsigned short i;
   unsigned char *p;

   _flkey = 0;
   
   /* first disable watchdog */
   watchdog_disable();

   /* avoid any blocking of RS485 bus */
   RS485_ENABLE = RS485_ENABLE_OFF;

   /* Port and oscillator configuration */

#if defined(CPU_C8051F120)

   SFRPAGE   = CONFIG_PAGE;
  
   XBR0 = 0x04;                 // Enable XBar, UART0 & UART1
   XBR1 = 0x00;
   XBR2 = 0x44;

  #ifdef CLK_25MHZ
   /* Select internal quartz oscillator */
   SFRPAGE   = LEGACY_PAGE;
   FLSCL     = 0x00;            // set flash read time for <25 MHz

   SFRPAGE   = CONFIG_PAGE;
   OSCICN    = 0x83;            // divide by 1
   CLKSEL    = 0x00;            // select internal oscillator
  #else          // 98 MHz
   /* Select internal quartz oscillator */
   SFRPAGE   = LEGACY_PAGE;
   FLSCL     = 0xB0;            // set flash read time for 100 MHz

   SFRPAGE   = CONFIG_PAGE;
   OSCICN    = 0x83;            // divide by 1
   CLKSEL    = 0x00;            // select internal oscillator

   PLL0CN    |= 0x01;
   PLL0DIV   = 0x01;
   PLL0FLT   = 0x01;
   PLL0MUL   = 0x04;
   for (i = 0 ; i < 15; i++);   // Wait 5us for initialization
   PLL0CN    |= 0x02;
   for (i = 0 ; i<50000 && ((PLL0CN & 0x10) == 0) ; i++);

   CLKSEL    = 0x02;            // select PLL as sysclk src
  #endif

#elif defined(CPU_C8051F020)

   XBR0 = 0x04;                 // Enable UART0 & UART1
   XBR1 = 0x00;
   XBR2 = 0x44;

   /* Select external quartz oscillator */
   OSCXCN = 0x67;               // Crystal mode, Power Factor 22E6
   OSCICN = 0x08;               // CLKSL=1 (external)

#elif defined(CPU_C8051F310) || defined(CPU_C8051F320)

   XBR0 = 0x01;                 // Enable RX/TX
   XBR1 = 0x40;                 // Enable crossbar

   /* Select internal quartz oscillator */
   OSCICN = 0x83;               // IOSCEN=1, SYSCLK=24.5 MHz
   CLKSEL = 0x00;               // derive SYSCLK from internal source

#else

   XBR0 = 0x04;                 // Enable RX/TX
   XBR1 = 0x00;
   XBR2 = 0x40;                 // Enable crossbar

   PRT0CF = 0x01;               // P0.0: TX = Push Pull
   PRT1CF = 0x00;               // P1
   PRT2CF = 0x00;               // P2  Open drain for 5V LCD
   PRT3CF = 0x20;               // P3.5: RS485 enable = Push Pull

   /* Select external quartz oscillator */
   OSCXCN = 0x67;               // Crystal mode, Power Factor 22E6
   OSCICN = 0x08;               // CLKSL=1 (external)

#endif
        
#ifdef CFG_HAVE_LCD
   lcd_setup();
#endif

#ifdef CFG_HAVE_EMIF
   /* initialize external memory interface */
   d = emif_init();

   /* do memory test on cold start */
   SFRPAGE = LEGACY_PAGE;
   if (d > 0 && (RSTSRC & 0x02) > 0)
      emif_test(d);
#endif

   /* start system clock */
   sysclock_init();

   /* enable watchdog with default timeout */
   watchdog_enable(0);

   /* enable missing clock detector */
   RSTSRC |= 0x04;

   /* default LED mode */
   for (i=0 ; i<N_LED ; i++)
      led_mode(i, 1);
   
   /* initialize all memory */
   CSR = 0;
   addressed = 0;
   flash_param = 0;
   flash_program = 0;
   flash_allowed = 0;
   wrong_cpu = 0;
   _flkey = 0;

#ifdef CFG_HAVE_RTC
   rtc_set = 0;
#endif

   i_in = i_out = n_out = 0;
   _cur_sub_addr = 0;
   for (i=0 ; i<sizeof(in_buf) ; i++)
      in_buf[i] = 0;
   for (i=0 ; i<sizeof(out_buf) ; i++)
      out_buf[i] = 0;

   /* check if we got reset by watchdog */
#if defined(CPU_C8051F120)
   SFRPAGE   = LEGACY_PAGE;
#endif
   WD_RESET = ((RSTSRC & 0x02) == 0 && (RSTSRC & 0x08) > 0);

   /* initialize UART(s) */
   uart_init(0, BD_115200);

#ifdef CFG_UART1_MSCB
   uart_init(1, BD_115200);
#endif

#ifdef CFG_DYN_VARIABLES
   setup_variables();
#endif

   /* count variables */
   for (n_variables = _var_size = 0;; n_variables++) {
      _var_size += variables[n_variables].width;
      if (variables[n_variables].width == 0)
         break;
   }

   /* check if variables are in xdata and xdata is present */
   if (n_variables > 0) {
      p = variables[0].ud;
      d = *p;
      *p = 0x55;
      if (*p != 0x55)
         wrong_cpu = 1;
      *p = 0xAA;
      if (*p != 0xAA)
         wrong_cpu = 1;
      *p = d;
   }

   /* retrieve EEPROM data */
#ifdef CPU_C8051F120
   SFRPAGE = LEGACY_PAGE;
#endif
   if ((RSTSRC & 0x02) > 0)
      flags = eeprom_retrieve(1); // vars on cold start
   else
      flags = eeprom_retrieve(0);

   if ((flags & (1 << 0)) == 0) {
      configured_addr = 0;
   
      /* set initial values */
      sys_info.node_addr = 0xFFFF;
      sys_info.group_addr = 0xFFFF;
      memset(sys_info.node_name, 0, sizeof(sys_info.node_name));
      strncpy(sys_info.node_name, node_name, sizeof(sys_info.node_name));
   } else
      configured_addr = 1;

   /* store SVN revision */
   sys_info.svn_revision = (svn_rev_main[6]-'0')*1000+
                           (svn_rev_main[7]-'0')*100+
                           (svn_rev_main[8]-'0')*10+
                           (svn_rev_main[9]-'0');

   if ((flags & (1 << 1)) == 0) {

      /* init variables */
      for (i = 0; variables[i].width; i++)
         if (!(variables[i].flags & MSCBF_DATALESS)) {
            /* do it for each sub-address */
            for (adr = 0 ; adr < _n_sub_addr ; adr++) {
               memset((char*)variables[i].ud + _var_size*adr, 0, variables[i].width);
            }
         }

      /* call user initialization routine with initialization */
      user_init(1);

      /* write current variables to flash later in main routine */
      configured_vars = 0;
   } else {
      /* call user initialization routine without initialization */
      user_init(0);
      configured_vars = 1;
   }

   /* Blink LEDs */
   for (i=0 ; i<N_LED ; i++)
      led_blink(i, 3, 150);

}
Ejemplo n.º 11
0
void setup(void)
{
   int i;                       // software timer

   WDTCN = 0xDE;                // Disable watchdog timer
   WDTCN = 0xAD;

   SFRPAGE = CONFIG_PAGE;       // set SFR page

   XBR0 = 0x04;                 // Enable UART0 & UART1
   XBR1 = 0x00;
   XBR2 = 0x44;

   // all pins used by the external memory interface are in push-pull mode
   P0MDOUT = 0xFF;
   P1MDOUT = 0xFF;
   P2MDOUT = 0xFF;
   P3MDOUT = 0xFF;
   P0 = 0xC0;                   // /WR, /RD, are high, RESET is low
   P1 = 0x00;
   P2 = 0x00;                   // P1, P2 contain the address lines
   P3 = 0xFF;                   // P3 contains the data lines

   OSCICN = 0x83;               // set internal oscillator to run
   // at its maximum frequency

   CLKSEL = 0x00;               // Select the internal osc. as
   // the SYSCLK source

   //Turn on the PLL and increase the system clock by a factor of M/N = 2
   SFRPAGE = CONFIG_PAGE;

   PLL0CN = 0x00;               // Set internal osc. as PLL source
   SFRPAGE = LEGACY_PAGE;
   FLSCL = 0x10;                // Set FLASH read time for 50MHz clk
   // or less
   SFRPAGE = CONFIG_PAGE;
   PLL0CN |= 0x01;              // Enable Power to PLL
   PLL0DIV = 0x01;              // Set Pre-divide value to N (N = 1)
   PLL0FLT = 0x01;              // Set the PLL filter register for
   // a reference clock from 19 - 30 MHz
   // and an output clock from 45 - 80 MHz
   PLL0MUL = 0x02;              // Multiply SYSCLK by M (M = 2)

   for (i = 0; i < 256; i++);   // Wait at least 5us
   PLL0CN |= 0x02;              // Enable the PLL
   while (!(PLL0CN & 0x10));    // Wait until PLL frequency is locked
   CLKSEL = 0x02;               // Select PLL as SYSCLK source

   SFRPAGE = LEGACY_PAGE;

   EMI0CF = 0xD7;               // Split-Mode, non-multiplexed
   // on P0-P3 (use 0xF7 for P4 - P7)

   EMI0TC = 0xB7;               // This value may be modified
   // according to SYSCLK to meet the
   // timing requirements for the CS8900A
   // For example, EMI0TC should be >= 0xB7
   // for a 100 MHz SYSCLK.


   SFRPAGE = ADC0_PAGE;
   AMX0CF = 0x00;               // select single ended analog inputs
   ADC0CF = 0xE0;               // 16 system clocks, gain 1
   ADC0CN = 0x80;               // enable ADC 

   REF0CN = 0x03;               // enable internal reference
   DAC0CN = 0x80;               // enable DAC0
   DAC1CN = 0x80;               // enable DAC1

   /* init memory */
   RS485_ENABLE = 0;

   /* start system clock */
   sysclock_init();
   CKCON = 0x00;                // assumed by tcp_timer()

   /* Blink LEDs */
   led_blink(0, 5, 150);
   led_blink(1, 5, 150);

   /* invert first LED */
   led_mode(0, 1);
}