COSA
An Object-Oriented Platform for Arduino Programming
Mega.hh
Go to the documentation of this file.
1 
21 #ifndef COSA_BOARD_ARDUINO_MEGA_HH
22 #define COSA_BOARD_ARDUINO_MEGA_HH
23 
24 /* This board is based on ATmega1280/2560 */
25 #if defined(ARDUINO_MEGA2560)
26 # define BOARD_ATMEGA2560
27 #else
28 # define BOARD_ATMEG1280
29 #endif
30 
46 class Board {
47  friend class Pin;
48  friend class GPIO;
49  friend class UART;
50 private:
54  Board() {}
55 
61  static volatile uint8_t* SFR(uint8_t pin)
62  __attribute__((always_inline))
63  {
64  return (pin < 8 ? &PINE :
65  pin < 16 ? &PINH :
66  pin < 24 ? &PINB :
67  pin < 32 ? &PINA :
68  pin < 40 ? &PINC :
69  pin < 48 ? &PIND :
70  pin < 56 ? &PINL :
71  pin < 64 ? &PINF :
72  pin < 72 ? &PINK :
73  pin < 80 ? &PINJ :
74  &PING);
75  }
76 
83  static uint8_t BIT(uint8_t pin)
84  __attribute__((always_inline))
85  {
86  return (pin & 0x7);
87  }
88 
95  static volatile uint8_t* PCIMR(uint8_t pin)
96  __attribute__((always_inline))
97  {
98  return (pin < 24 ? &PCMSK0 :
99  &PCMSK2);
100  }
101 
107  static volatile uint8_t* UART(uint8_t port)
108  __attribute__((always_inline))
109  {
110  return (port == 1 ? &UCSR1A :
111  port == 2 ? &UCSR2A :
112  port == 3 ? &UCSR3A :
113  &UCSR0A);
114  }
115 
116 public:
120  static void init() {}
121 
125  enum DigitalPin {
126  D0 = 0, // PE0
127  D1 = 1, // PE1
128  D2 = 4, // PE4
129  D3 = 5, // PE5
130  D4 = 85, // PG5
131  D5 = 3, // PE3
132  D6 = 11, // PH3
133  D7 = 12, // PH4
134  D8 = 13, // PH5
135  D9 = 14, // PH6
136  D10 = 20, // PB4
137  D11 = 21, // PB5
138  D12 = 22, // PB6
139  D13 = 23, // PB7
140  D14 = 73, // PJ1
141  D15 = 72, // PJ0
142  D16 = 9, // PH1
143  D17 = 8, // PH0
144  D18 = 43, // PD3
145  D19 = 42, // PD2
146  D20 = 41, // PD1
147  D21 = 40, // PD0
148  D22 = 24, // PA0
149  D23 = 25, // PA1
150  D24 = 26, // PA2
151  D25 = 27, // PA3
152  D26 = 28, // PA4
153  D27 = 29, // PA5
154  D28 = 30, // PA6
155  D29 = 31, // PA7
156  D30 = 39, // PC7
157  D31 = 38, // PC6
158  D32 = 37, // PC5
159  D33 = 36, // PC4
160  D34 = 35, // PC3
161  D35 = 34, // PC2
162  D36 = 33, // PC1
163  D37 = 32, // PC0
164  D38 = 47, // PD7
165  D39 = 82, // PG2
166  D40 = 81, // PG1
167  D41 = 80, // PG0
168  D42 = 55, // PL7
169  D43 = 54, // PL6
170  D44 = 53, // PL5
171  D45 = 52, // PL4
172  D46 = 51, // PL3
173  D47 = 50, // PL2
174  D48 = 49, // PL1
175  D49 = 48, // PL0
176  D50 = 19, // PB3/MISO
177  D51 = 18, // PB2/MOSI
178  D52 = 17, // PB1/SCK
179  D53 = 16, // PB0/SS
180  D54 = 56, // PF0/A0
181  D55 = 57, // PF1/A1
182  D56 = 58, // PF2/A2
183  D57 = 59, // PF3/A3
184  D58 = 60, // PF4/A4
185  D59 = 61, // PF5/A5
186  D60 = 62, // PF6/A6
187  D61 = 63, // PF7/A7
188  D62 = 64, // PK0/A8
189  D63 = 65, // PK1/A9
190  D64 = 66, // PK2/A10
191  D65 = 67, // PK3/A11
192  D66 = 68, // PK4/A12
193  D67 = 69, // PK5/A13
194  D68 = 70, // PK6/A14
195  D69 = 71, // PK7/A15
196  LED = D13
197  } __attribute__((packed));
198 
202  enum AnalogPin {
203  A0 = 0, // PF0
204  A1 = 1, // PF1
205  A2 = 2, // PF2
206  A3 = 3, // PF3
207  A4 = 4, // PF4
208  A5 = 5, // PF5
209  A6 = 6, // PF6
210  A7 = 7, // PF7
211  A8 = 32, // PK0
212  A9 = 33, // PK1
213  A10 = 34, // PK2
214  A11 = 35, // PK3
215  A12 = 36, // PK4
216  A13 = 37, // PK5
217  A14 = 38, // PK6
218  A15 = 39 // PK7
219  } __attribute__((packed));
220 
224  enum Reference {
225  APIN_REFERENCE = 0,
226  AVCC_REFERENCE = _BV(REFS0),
227  A1V1_REFERENCE = _BV(REFS1),
228  A2V56_REFERENCE = (_BV(REFS1) | _BV(REFS0))
229  } __attribute__((packed));
230 
235  enum PWMPin {
236  PWM0 = D2, // PE4 => OCR3B
237  PWM1 = D3, // PE5 => 0CR3C
238  PWM2 = D4, // PG5 => OCR0B
239  PWM3 = D5, // PE3 => OCR3A
240  PWM4 = D6, // PH3 => OCR4A
241  PWM5 = D7, // PH4 => OCR4B
242  PWM6 = D8, // PH5 => OCR4C
243  PWM7 = D9, // PH6 => OCR2B
244  PWM8 = D10, // PB4 => OCR2A
245  PWM9 = D11, // PB5 => OCR1A
246  PWM10 = D12, // PB6 => OCR1B
247  PWM11 = D13 // PB7 => OCR0A
248  } __attribute__((packed));
249 
255  EXT0 = D21, // PD0
256  EXT1 = D20, // PD1
257  EXT2 = D19, // PD2
258  EXT3 = D18, // PD3
259  EXT4 = D2, // PE4
260  EXT5 = D3 // PE5
261  } __attribute__((packed));
262 
268  PCI0 = D10, // PB4
269  PCI1 = D11, // PB5
270  PCI2 = D12, // PB6
271  PCI3 = D13, // PB7
272  PCI4 = D50, // PB3
273  PCI5 = D51, // PB2
274  PCI6 = D52, // PB1
275  PCI7 = D53, // PB0
276  PCI8 = D62, // PK0/A8
277  PCI9 = D63, // PK1/A9
278  PCI10 = D64, // PK2/A10
279  PCI11 = D65, // PK3/A11
280  PCI12 = D66, // PK4/A12
281  PCI13 = D67, // PK5/A13
282  PCI14 = D68, // PK6/A14
283  PCI15 = D69 // PK7/A15
284  } __attribute__((packed));
285 
289  enum {
290  ANALOG_PIN_MAX = 16,
291  DIGITAL_PIN_MAX = 70,
292  EXT_PIN_MAX = 6,
293  PCI_PIN_MAX = 24,
294  PWM_PIN_MAX = 13
295  };
296 
300  enum TWIPin {
301  SCL = 0, // PD0/D21
302  SDA = 1 // PD1/D20
303  } __attribute__((packed));
304 
308  enum SPIPin {
309  SS = 0, // PB0/D53
310  SCK = 1, // PB1/D52
311  MOSI = 2, // PB2/D51
312  MISO = 3 // PB3/D50
313  } __attribute__((packed));
314 
318  enum {
319  VBG = (_BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)),
320  UART_MAX = 4,
321  EXT_MAX = 8,
322  PCMSK_MAX = 3,
323  PCINT_MAX = 24
324  } __attribute__((packed));
325 };
326 
330 #define USART_UDRE_vect USART0_UDRE_vect
331 #define USART_RX_vect USART0_RX_vect
332 #define USART_TX_vect USART0_TX_vect
333 
337 extern "C" {
338  void ADC_vect(void) __attribute__ ((signal));
339  void ANALOG_COMP_vect(void) __attribute__ ((signal));
340  void INT0_vect(void) __attribute__ ((signal));
341  void INT1_vect(void) __attribute__ ((signal));
342  void INT2_vect(void) __attribute__ ((signal));
343  void INT3_vect(void) __attribute__ ((signal));
344  void INT4_vect(void) __attribute__ ((signal));
345  void INT5_vect(void) __attribute__ ((signal));
346  void INT6_vect(void) __attribute__ ((signal));
347  void INT7_vect(void) __attribute__ ((signal));
348  void PCINT0_vect(void) __attribute__ ((signal));
349  void PCINT1_vect(void) __attribute__ ((signal));
350  void PCINT2_vect(void) __attribute__ ((signal));
351  void SPI_STC_vect(void) __attribute__ ((signal));
352  void TIMER0_COMPA_vect(void) __attribute__ ((signal));
353  void TIMER0_COMPB_vect(void) __attribute__ ((signal));
354  void TIMER0_OVF_vect(void) __attribute__ ((signal));
355  void TIMER1_COMPA_vect(void) __attribute__ ((signal));
356  void TIMER1_COMPB_vect(void) __attribute__ ((signal));
357  void TIMER1_COMPC_vect(void) __attribute__ ((signal));
358  void TIMER1_OVF_vect(void) __attribute__ ((signal));
359  void TIMER1_CAPT_vect(void) __attribute__ ((signal));
360  void TIMER2_COMPA_vect(void) __attribute__ ((signal));
361  void TIMER2_COMPB_vect(void) __attribute__ ((signal));
362  void TIMER2_OVF_vect(void) __attribute__ ((signal));
363  void TWI_vect(void) __attribute__ ((signal));
364  void WDT_vect(void) __attribute__ ((signal));
365  void USART_UDRE_vect(void) __attribute__ ((signal));
366  void USART_RX_vect(void) __attribute__ ((signal));
367  void USART_TX_vect(void) __attribute__ ((signal));
368  void USART1_UDRE_vect(void) __attribute__ ((signal));
369  void USART1_RX_vect(void) __attribute__ ((signal));
370  void USART1_TX_vect(void) __attribute__ ((signal));
371  void USART2_UDRE_vect(void) __attribute__ ((signal));
372  void USART2_RX_vect(void) __attribute__ ((signal));
373  void USART2_TX_vect(void) __attribute__ ((signal));
374  void USART3_UDRE_vect(void) __attribute__ ((signal));
375  void USART3_RX_vect(void) __attribute__ ((signal));
376  void USART3_TX_vect(void) __attribute__ ((signal));
377 }
378 #endif
void TIMER2_OVF_vect(void)
void INT3_vect(void)
void USART1_RX_vect(void)
Definition: Pin.hh:35
void USART2_TX_vect(void)
void PCINT2_vect(void)
void TIMER0_COMPA_vect(void)
void TIMER1_OVF_vect(void)
void TIMER2_COMPA_vect(void)
#define USART_TX_vect
Definition: Mega.hh:332
void SPI_STC_vect(void)
Definition: LED.hh:32
void TIMER1_CAPT_vect(void)
void WDT_vect(void)
void USART1_TX_vect(void)
void INT4_vect(void)
void INT2_vect(void)
void INT7_vect(void)
void USART2_UDRE_vect(void)
#define USART_RX_vect
Definition: Mega.hh:331
friend class UART
Definition: ATmega1284P.hh:39
void TIMER0_OVF_vect(void)
void INT5_vect(void)
void ADC_vect(void)
ExternalInterruptPin
Definition: ATmega1284P.hh:190
Definition: UART.hh:59
#define PCMSK0
Definition: ATtinyX5.hh:227
void PCINT1_vect(void)
Definition: PWMPin.hh:29
void TIMER2_COMPB_vect(void)
void TIMER1_COMPA_vect(void)
void USART3_RX_vect(void)
void USART1_UDRE_vect(void)
void INT6_vect(void)
void INT1_vect(void)
Definition: GPIO.hh:30
void TIMER1_COMPB_vect(void)
void TIMER1_COMPC_vect(void)
void TWI_vect(void)
void TIMER0_COMPB_vect(void)
void USART3_UDRE_vect(void)
void PCINT0_vect(void)
#define USART_UDRE_vect
Definition: Mega.hh:330
static void init()
Definition: Mega.hh:120
void USART3_TX_vect(void)
void ANALOG_COMP_vect(void)
void USART2_RX_vect(void)
void INT0_vect(void)