next up previous contents
Next: 10.2 Beispielprogramm 1 Up: 10.1 Header-Dateien Previous: 10.1.1 can-ir.h

10.1.2 k-bus.h

/*****************************************************************************/
/* File:        k-bus.h                                                      */
/* Author:      Christopher Odenbach                                         */
/* Date:        May 1999                                                     */
/* Description: Include file for use of any modules which use the irq6       */
/*****************************************************************************/

#ifndef K_BUS_H
#define K_BUS_H

/*
 * includes
 *
 * these includes are needed
 *
 */

#include "bios.h"
#include "math.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"



/*
 * Global variables
 *
 * You won't need to use them
 *
 */

uint8 module[16], modules = 0;



/*
 * init_modules
 *
 * This function searches through the k-bus and detects modules which
 * use the base address xxxx 00 as a status register and who give back a
 * value != 32. Invoke once when the program starts.
 *
 */

void init_modules()
{
uint8   erg, i, adr;

  for (i=0; i<16; i++) {
    adr = i*4;
    erg = var_get_extension (adr);
    if (erg != 32) {                    /* module is available */
      module[modules++] = adr;
      printf("Found module at address %i\n",adr);
    }
  }
}



/*
 * irq_routine_module()
 *
 * When the global interrupt service routine has found out which module
 * requested the irq the module specific irq routine is called. Add
 * your own irq routine here for new modules as described below.
 *
 */

void irq_routine_module (uint8 mod, uint8 status)
{
  switch (mod) {

    case 0:  /* CAN-IR-Module */
      irq_routine_ir (status);
      break;

/*  case 4:    another module at base address 4
      ..
      break;
                 add interrupt routines for new modules here

*/

    default:
      break;
  }
}



/*
 * irq_routine()
 *
 * This is the global interrupt service routine. The interrupt vector
 * must point here. The function asks every existing module if it
 * requested the interrupt. A non-zero return value means 'yes'. Then
 * the function irq_routine_module (described above) is invoked.
 *
 */

void irq_routine()
{
  uint8 status, i = 0;
  boolean ok = FALSE;

  while (!ok && (i < modules)) {
    status = var_get_extension (module[i]);
    if (status != 0) {
      ok = TRUE;
      irq_routine_module (module[i], status);
    }
    i++;
  }
}

#endif



Christopher Odenbach
1999-06-01