/****************************************************************************/
/*****************************************************************************
 *                      
 *      Project:        16x training
 *      Name:           isr 
 *      Filename:       isr.c
 *      System:         IBM PC/AT
 *      Compiler:       c166 V3.11
 *      Date:           02/98
 *      Author:         Siegbert Schaufelberger
 *      Rights:         hitex-systementwicklung GmbH        
 *                      Greschbachstr. 12
 *                      76229  Karlsruhe
 *                                                         
 *****************************************************************************
 *
 *      Implementation description:
 *
 *
 *****************************************************************************
 *
 *      Update:
 *        Date /Sgn.       Version  Changes made because of ...
 *      __-___-____/
 *
 *
 ****************************************************************************/
/****************************************************************************/


/****************************************************************************/
/***					System includes			                          ***/
/****************************************************************************/

#pragma MOD167 FIX167
#include <intrins.h>
#include <reg167.h>

/****************************************************************************/
/***					Defines & Constants                               ***/
/****************************************************************************/

#define byte  unsigned char
#define word  unsigned int
#define T6INT  0x26
#define T0INT  0x10
#define T1INT  0x21

                    
/****************************************************************************/
/***					Externals					                      ***/
/****************************************************************************/

extern word counter;
extern void f_clock ();	/* in modul clock */


/****************************************************************************/
/***					Publics						                      ***/
/****************************************************************************/

word sdata millisec;
char PECDestBuffer[9];
char PECSourceBuffer[9] ={"01234567"};
long	CaptureCompare [16];		/* Counter for CAPCOM register */
long	SystemTick;      /* Counts occurence of interrupt at system clock */

struct time
{
		byte millisec;
		byte second;
		byte minute;
		byte hour;
 		char Time [12];
} clock;				/* structure holding system time */

int	ADConverter [10];



/****************************************************************************/
/***					Functions					                      ***/
/****************************************************************************/

/*----------------------------------------------------------------------------
 *      
 *  Name:  			t0_isr 
 *      
 *  Description:	interrupt service for timer 0
 * 					One PEC-transfer occurs every 50ms. 
 *					The transfer of 8 Bytes lasts 400ms.
 * 					Therefore t0_isr will be called every 400ms.
 *                       
 *  Parameters:     
 *                                    
 *  Return Value:   
 *                  
 *--------------------------------------------------------------------------*/

void t0_isr (void) interrupt T0INT{

	CaptureCompare [0]++;	/* PECC0 is started */

	SRCP0 = _sof_ (PECSourceBuffer);
	DSTP0 = _sof_ (PECDestBuffer);
	PECC0 = 0x0508;			/* increment source, 8 bytes */
        counter++;}


/*----------------------------------------------------------------------------
 *      
 *  Name:  			t1_isr 
 *      
 *  Description:	interrupt service for timer 1 every 25ms ??
 *                       
 *  Parameters:     
 *                  
 *  Return Value:   
 *                  
 *--------------------------------------------------------------------------*/

void t1_isr (void) interrupt T1INT{

	long	Tick;
	int	i;

	SystemTick++;

 	Tick = SystemTick / 10;		/* Time in 1/1000s */   

	f_clock();

	clock.Time [0] = '0' + clock.hour / 10;
	clock.Time [1] = '0' + clock.hour % 10;
	clock.Time [2] = ':';
	clock.Time [3] = '0' + clock.minute / 10;
	clock.Time [4] = '0' + clock.minute % 10;
	clock.Time [5] = ':';
	clock.Time [6] = '0' + clock.second / 10;
	clock.Time [7] = '0' + clock.second % 10;
	clock.Time [8] = '.';
	clock.Time [9] = '0' + clock.millisec / 10;
	clock.Time [10] = '0' + clock.millisec % 10;
	clock.Time [11] = '\0';

	/* Read all channels of A/D Converter. */

	for (i = 0; i < 10; i++){

		ADCON = 0x0080 + i;
		while (ADCON & 0x0100);		/* Waiting on busy */
		ADConverter [i] = ADDAT;}
		}


/*----------------------------------------------------------------------------
 *      
 *  Name:  			t6_isr 
 *      
 *  Description:	interrupt service for GPT2 (timer 6)	 
 *                  
 *      
 *  Parameters:     
 *                  
 *  Return Value:   
 *                  
 *--------------------------------------------------------------------------*/

void t6_isr (void) interrupt T6INT{
    unsigned i;

    T6R  = 0;  /* stop timer 6 */
    T6IE = 0;  /* disable T6 Interrupts */
    millisec++;
    if ((millisec % 157) == 0)
      for (i=0; i<100; i++)
        ;
    if (millisec == 1000)
        millisec = 0;
    T6IE = 1; /* enable T6 Interrupts gpt2_t6_isr */
    T6R  = 1;
    _nop_ (); 
    }



