You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					88 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					88 lines
				
				2.1 KiB
			|   
											14 years ago
										 | /* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ | ||
|  | 
 | ||
|  | /*
 | ||
|  |   Part of the Wiring project - http://wiring.uniandes.edu.co
 | ||
|  | 
 | ||
|  |   Copyright (c) 2004-05 Hernando Barragan | ||
|  | 
 | ||
|  |   This library is free software; you can redistribute it and/or | ||
|  |   modify it under the terms of the GNU Lesser General Public | ||
|  |   License as published by the Free Software Foundation; either | ||
|  |   version 2.1 of the License, or (at your option) any later version. | ||
|  | 
 | ||
|  |   This library is distributed in the hope that it will be useful, | ||
|  |   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||
|  |   Lesser General Public License for more details. | ||
|  | 
 | ||
|  |   You should have received a copy of the GNU Lesser General | ||
|  |   Public License along with this library; if not, write to the | ||
|  |   Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
|  |   Boston, MA  02111-1307  USA | ||
|  |    | ||
|  |   Modified 24 November 2006 by David A. Mellis | ||
|  | */ | ||
|  | 
 | ||
|  | #include <inttypes.h>
 | ||
|  | #include <avr/io.h>
 | ||
|  | #include <avr/interrupt.h>
 | ||
|  | #include <avr/pgmspace.h>
 | ||
|  | #include <stdio.h>
 | ||
|  | 
 | ||
|  | #include "WConstants.h"
 | ||
|  | #include "wiring_private.h"
 | ||
|  | 
 | ||
|  | volatile static voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; | ||
|  | // volatile static voidFuncPtr twiIntFunc;
 | ||
|  | 
 | ||
|  | void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) | ||
|  | { | ||
|  | 	if(interruptNum < EXTERNAL_NUM_INTERRUPTS) | ||
|  | 	{ | ||
|  | 		intFunc[interruptNum] = userFunc; | ||
|  | 
 | ||
|  | 		//clear the config for the change settings
 | ||
|  | 		EICRA &= ~(B00000011 << (interruptNum * 2)); | ||
|  | 
 | ||
|  | 		//set our mode.
 | ||
|  | 		EICRA |= (mode << (interruptNum * 2)); | ||
|  | 
 | ||
|  | 		// Enable the interrupt.
 | ||
|  | 		EIMSK |= (1 << interruptNum); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | void detachInterrupt(uint8_t interruptNum) | ||
|  | { | ||
|  | 	if(interruptNum < EXTERNAL_NUM_INTERRUPTS) | ||
|  | 	{ | ||
|  | 		// Disable the interrupt.
 | ||
|  | 		EIMSK &= ~(1 << interruptNum); | ||
|  | 
 | ||
|  | 		intFunc[interruptNum] = 0; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | ISR(INT0_vect) { | ||
|  |   if(intFunc[EXTERNAL_INT_0]) | ||
|  |     intFunc[EXTERNAL_INT_0](); | ||
|  | } | ||
|  | 
 | ||
|  | ISR(INT1_vect) { | ||
|  |   if(intFunc[EXTERNAL_INT_1]) | ||
|  |     intFunc[EXTERNAL_INT_1](); | ||
|  | } | ||
|  | 
 | ||
|  | ISR(INT2_vect) { | ||
|  |   if(intFunc[EXTERNAL_INT_2]) | ||
|  |     intFunc[EXTERNAL_INT_2](); | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  | SIGNAL(SIG_2WIRE_SERIAL) { | ||
|  |   if(twiIntFunc) | ||
|  |     twiIntFunc(); | ||
|  | } | ||
|  | */ | ||
|  | 
 |