1d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen/*
2d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  wiring.h - Partial implementation of the Wiring API for the ATmega8.
3d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Part of Arduino - http://www.arduino.cc/
4d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
5d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Copyright (c) 2005-2006 David A. Mellis
6d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
7d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  This library is free software; you can redistribute it and/or
8d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  modify it under the terms of the GNU Lesser General Public
9d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  License as published by the Free Software Foundation; either
10d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  version 2.1 of the License, or (at your option) any later version.
11d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
12d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  This library is distributed in the hope that it will be useful,
13d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  but WITHOUT ANY WARRANTY; without even the implied warranty of
14d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Lesser General Public License for more details.
16d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
17d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  You should have received a copy of the GNU Lesser General
18d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Public License along with this library; if not, write to the
19d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  Boston, MA  02111-1307  USA
21d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
22d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen  $Id$
23d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen*/
24d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
25d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#ifndef Wiring_h
26d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define Wiring_h
27d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
28d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#include <avr/io.h>
29d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#include <stdlib.h>
30d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#include "binary.h"
31d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
32d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#ifdef __cplusplus
33d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenextern "C"{
34d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif
35d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
36d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define HIGH 0x1
37d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define LOW  0x0
38d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
39d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define INPUT 0x0
40d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define OUTPUT 0x1
41d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
42d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define true 0x1
43d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define false 0x0
44d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
45d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define PI 3.1415926535897932384626433832795
46d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define HALF_PI 1.5707963267948966192313216916398
47d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define TWO_PI 6.283185307179586476925286766559
48d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define DEG_TO_RAD 0.017453292519943295769236907684886
49d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define RAD_TO_DEG 57.295779513082320876798154814105
50d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
51d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define SERIAL  0x0
52d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define DISPLAY 0x1
53d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
54d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define LSBFIRST 0
55d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define MSBFIRST 1
56d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
57d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define CHANGE 1
58d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define FALLING 2
59d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define RISING 3
60d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
61d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
62d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define INTERNAL1V1 2
63d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define INTERNAL2V56 3
64d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#else
65d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define INTERNAL 3
66d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif
67d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define DEFAULT 1
68d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define EXTERNAL 0
69d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
70d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen// undefine stdlib's abs if encountered
71d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#ifdef abs
72d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#undef abs
73d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif
74d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
75d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define min(a,b) ((a)<(b)?(a):(b))
76d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define max(a,b) ((a)>(b)?(a):(b))
77d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define abs(x) ((x)>0?(x):-(x))
78d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
79d06daf9bbc46838400461eb8e15842974e38d82aAdam Hampson#if __AVR_LIBC_VERSION__ < 10701UL
80d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
81d06daf9bbc46838400461eb8e15842974e38d82aAdam Hampson#endif
82d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define radians(deg) ((deg)*DEG_TO_RAD)
83d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define degrees(rad) ((rad)*RAD_TO_DEG)
84d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define sq(x) ((x)*(x))
85d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
86d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define interrupts() sei()
87d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define noInterrupts() cli()
88d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
89d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
90d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) )
91d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L )
92d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
93d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define lowByte(w) ((uint8_t) ((w) & 0xff))
94d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define highByte(w) ((uint8_t) ((w) >> 8))
95d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
96d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
97d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define bitSet(value, bit) ((value) |= (1UL << (bit)))
98d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
99d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
100d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
101d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
102d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chentypedef unsigned int word;
103d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
104d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#define bit(b) (1UL << (b))
105d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
106d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chentypedef uint8_t boolean;
107d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chentypedef uint8_t byte;
108d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
109d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid init(void);
110d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
111d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid pinMode(uint8_t, uint8_t);
112d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid digitalWrite(uint8_t, uint8_t);
113d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenint digitalRead(uint8_t);
114d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenint analogRead(uint8_t);
115d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid analogReference(uint8_t mode);
116d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid analogWrite(uint8_t, int);
117d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
118d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenunsigned long millis(void);
119d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenunsigned long micros(void);
120d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid delay(unsigned long);
121d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid delayMicroseconds(unsigned int us);
122d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenunsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
123d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
124d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
125d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenuint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
126d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
127d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid attachInterrupt(uint8_t, void (*)(void), int mode);
128d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid detachInterrupt(uint8_t);
129d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
130d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid setup(void);
131d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chenvoid loop(void);
132d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
133d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#ifdef __cplusplus
134d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen} // extern "C"
135d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif
136d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen
137d5790d78880d4bd60be277ee20e53a851aa8c11Mike J. Chen#endif
138