00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "wiring_private.h"
00020 #include "pins_waspmote.h"
00021
00022 void pinMode(uint8_t pin, uint8_t mode)
00023 {
00024 uint8_t bit = digitalPinToBitMask(pin);
00025 uint8_t port = digitalPinToPort(pin);
00026 volatile uint8_t *reg;
00027
00028 if (port == NOT_A_PIN) return;
00029
00030
00031 reg = portModeRegister(port);
00032
00033 if (mode == INPUT) *reg &= ~bit;
00034 else *reg |= bit;
00035 }
00036
00037
00038
00039
00040
00041
00042
00043
00044 static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
00045 static inline void turnOffPWM(uint8_t timer)
00046 {
00047 if (timer == TIMER1A) cbi(TCCR1A, COM1A1);
00048 if (timer == TIMER1B) cbi(TCCR1A, COM1B1);
00049
00050 #if defined(__AVR_ATmega168__)
00051 if (timer == TIMER0A) cbi(TCCR0A, COM0A1);
00052 if (timer == TIMER0B) cbi(TCCR0A, COM0B1);
00053 if (timer == TIMER2A) cbi(TCCR2A, COM2A1);
00054 if (timer == TIMER2B) cbi(TCCR2A, COM2B1);
00055 #elif defined(__AVR_ATmega1281__)
00056 if (timer == TIMER0A) cbi(TCCR0A, COM0A1);
00057 if (timer == TIMER0B) cbi(TCCR0A, COM0B1);
00058 if (timer == TIMER2A) cbi(TCCR2A, COM2A1);
00059 if (timer == TIMER2B) cbi(TCCR2A, COM2B1);
00060 #else
00061 if (timer == TIMER2) cbi(TCCR2, COM21);
00062 #endif
00063 }
00064
00065 void digitalWrite(uint8_t pin, uint8_t val)
00066 {
00067 uint8_t timer = digitalPinToTimer(pin);
00068 uint8_t bit = digitalPinToBitMask(pin);
00069 uint8_t port = digitalPinToPort(pin);
00070 volatile uint8_t *out;
00071
00072 if (port == NOT_A_PIN) return;
00073
00074
00075
00076 if (timer != NOT_ON_TIMER) turnOffPWM(timer);
00077
00078 out = portOutputRegister(port);
00079
00080 if (val == LOW) *out &= ~bit;
00081 else *out |= bit;
00082 }
00083
00084 int digitalRead(uint8_t pin)
00085 {
00086 uint8_t timer = digitalPinToTimer(pin);
00087 uint8_t bit = digitalPinToBitMask(pin);
00088 uint8_t port = digitalPinToPort(pin);
00089
00090 if (port == NOT_A_PIN) return LOW;
00091
00092
00093
00094 if (timer != NOT_ON_TIMER) turnOffPWM(timer);
00095
00096 if (*portInputRegister(port) & bit) return HIGH;
00097 return LOW;
00098 }