firmware/interrupt.c
author root@rika
Thu, 23 Apr 2009 20:55:41 +0200
changeset 33 7a0c4b0354ba
parent 2 2f55e5dd591d
permissions -rw-r--r--
updated documentation
slime@2
     1
/*
slime@2
     2
 * Project Frontplatte
slime@2
     3
 *
slime@2
     4
 * interrupt.c  -  handle interrupts
slime@2
     5
 *
slime@2
     6
 * This file is released under the GNU General Public License. Refer
slime@2
     7
 * to the COPYING file distributed with this package.
slime@2
     8
 *
slime@2
     9
 * (c) 2007 Carsten Presser cpresser AT fsing.uni-sb.de
slime@2
    10
 */
slime@2
    11
slime@2
    12
slime@2
    13
slime@2
    14
#include <p18cxxx.h>
slime@2
    15
#include "interrupt.h"
slime@2
    16
slime@2
    17
slime@2
    18
#include "rc5.h"
slime@2
    19
#include "myi2c.h"
slime@2
    20
#include "user.h"
slime@2
    21
#include "io_cfg.h"
slime@2
    22
#include "delay.h"
slime@2
    23
slime@2
    24
slime@2
    25
/** V A R I A B L E S **********************************************/
slime@2
    26
unsigned char c;
slime@2
    27
slime@2
    28
slime@2
    29
/** I N T E R R U P T  V E C T O R S *****************************************/
slime@2
    30
#pragma code high_vector=0x0808 //(0x0808)
slime@2
    31
void interrupt_at_high_vector(void)
slime@2
    32
{
slime@2
    33
    _asm goto high_isr _endasm
slime@2
    34
}
slime@2
    35
#pragma code
slime@2
    36
slime@2
    37
#pragma code low_vector=0x0818 //(0x0818)
slime@2
    38
void interrupt_at_low_vector(void)
slime@2
    39
{
slime@2
    40
    _asm goto low_isr _endasm
slime@2
    41
}
slime@2
    42
#pragma code
slime@2
    43
slime@2
    44
slime@2
    45
/** C O D E ******************************************************************/
slime@2
    46
#pragma interrupt high_isr
slime@2
    47
void high_isr(void)
slime@2
    48
{
slime@2
    49
slime@2
    50
/* Timer0 */
slime@2
    51
	if (INTCONbits.TMR0IF)
slime@2
    52
	{
slime@2
    53
		INTCONbits.TMR0IF 	= 0;	// clear flag
slime@2
    54
		rc5_scrap();
slime@2
    55
	}
slime@2
    56
slime@2
    57
/* Infrared Interrupt */
slime@2
    58
	if (INTCON3bits.INT2IF)
slime@2
    59
	{
slime@2
    60
		rc5_decode();
slime@2
    61
slime@2
    62
		INTCON3bits.INT2IF	= 0;						// clear flag
slime@2
    63
		INTCON2bits.INTEDG2 = !INTCON2bits.INTEDG2;		// toogle edge detect...
slime@2
    64
	}
slime@2
    65
}
slime@2
    66
slime@2
    67
#pragma interruptlow low_isr
slime@2
    68
void low_isr(void)
slime@2
    69
{
slime@2
    70
/* I2C Interrupt Line */
slime@2
    71
	INTCONbits.GIEL		= 0;
slime@2
    72
slime@2
    73
	if (INTCONbits.RBIF) 			// i2c_int
slime@2
    74
	{
slime@2
    75
		PORTB			= PORTB;	// end mismatch condition... (see page 114)
slime@2
    76
		INTCONbits.RBIF	= 0;		// then clear the flag!
slime@2
    77
	
slime@2
    78
slime@2
    79
		if (PIN_I2C_INT == 0) 			// ignore falling edge
slime@2
    80
		{
slime@2
    81
			gg_ioflags |= FLAG_I2C;
slime@2
    82
		}
slime@2
    83
	} // end of i2c-int
slime@2
    84
slime@2
    85
	if (PIR2bits.TMR3IF)
slime@2
    86
	{
slime@2
    87
		PIR2bits.TMR3IF = 0;
slime@2
    88
		c++;
slime@2
    89
		if (c > 0x08)
slime@2
    90
		{
slime@2
    91
			c = 0x00;
slime@2
    92
			gg_ioflags |= FLAG_COUNTER;
slime@2
    93
		}
slime@2
    94
	}
slime@2
    95
slime@2
    96
	INTCONbits.GIEL		= 1;
slime@2
    97
}
slime@2
    98
#pragma code