COSA
An Object-Oriented Platform for Arduino Programming
ATmega328P.hh
Go to the documentation of this file.
1 
21 #ifndef COSA_BOARD_ARDUINO_ATMEGA328P_HH
22 #define COSA_BOARD_ARDUINO_ATMEGA328P_HH
23 
24 /* This board is based on ATmega328P */
25 #define BOARD_ATMEGA328P
26 
30 #if !defined(UNUSED)
31 #define UNUSED(x) (void) (x)
32 #endif
33 
44 class Board {
45  friend class Pin;
46  friend class GPIO;
47  friend class UART;
48 private:
52  Board() {}
53 
59  static volatile uint8_t* SFR(uint8_t pin)
60  __attribute__((always_inline))
61  {
62  return (pin < 8 ? &PIND :
63  pin < 14 ? &PINB :
64  &PINC);
65  }
66 
73  static uint8_t BIT(uint8_t pin)
74  __attribute__((always_inline))
75  {
76  return (pin < 8 ? pin :
77  pin < 14 ? pin - 8 :
78  pin - 14);
79  }
80 
86  static volatile uint8_t* PCIMR(uint8_t pin)
87  __attribute__((always_inline))
88  {
89  return (pin < 8 ? &PCMSK2 :
90  pin < 14 ? &PCMSK0 :
91  &PCMSK1);
92  }
93 
99  static volatile uint8_t* UART(uint8_t port)
100  __attribute__((always_inline))
101  {
102  UNUSED(port);
103  return (&UCSR0A);
104  }
105 
106 public:
110  static void init() {}
111 
115  enum DigitalPin {
116  D0 = 0, // PD0
117  D1, // PD1
118  D2, // PD2
119  D3, // PD3
120  D4, // PD4
121  D5, // PD5
122  D6, // PD6
123  D7, // PD7
124  D8, // PB0
125  D9, // PB1
126  D10, // PB2
127  D11, // PB3
128  D12, // PB4
129  D13, // PB5
130  D14, // PC0
131  D15, // PC1
132  D16, // PC2
133  D17, // PC3
134  D18, // PC4
135  D19, // PC5
136  LED = D13
137  } __attribute__((packed));
138 
142  enum AnalogPin {
143  A0 = 0, // PC0/ADC0
144  A1, // PC1/ADC1
145  A2, // PC2/ADC2
146  A3, // PC3/ACD3
147  A4, // PC4/ACD4
148  A5, // PC5/ACD5
149  A6, // PC6/ACD6
150  A7 // PC7/ACD7
151  } __attribute__((packed));
152 
156  enum Reference {
157  APIN_REFERENCE = 0,
158  AVCC_REFERENCE = _BV(REFS0),
159  A1V1_REFERENCE = (_BV(REFS1) | _BV(REFS0))
160  } __attribute__((packed));
161 
166  enum PWMPin {
167  PWM0 = D3, // PD3 => OCR2B
168  PWM1 = D5, // PD5 => OCR0B
169  PWM2 = D6, // PD6 => OCR0A
170  PWM3 = D9, // PB1 => OCR1A
171  PWM4 = D10, // PB2 => OCR1B
172  PWM5 = D11 // PB3 => OCR2A
173  } __attribute__((packed));
174 
180  EXT0 = D2, // PD2
181  EXT1 = D3 // PD3
182  } __attribute__((packed));
183 
188  PCI0 = D0, // PD0
189  PCI1 = D1, // PD1
190  PCI2 = D2, // PD2
191  PCI3 = D3, // PD3
192  PCI4 = D4, // PD4
193  PCI5 = D5, // PD5
194  PCI6 = D6, // PD6
195  PCI7 = D7, // PD7
196  PCI8 = D8, // PB0
197  PCI9 = D9, // PB1
198  PCI10 = D10, // PB2
199  PCI11 = D11, // PB3
200  PCI12 = D12, // PB4
201  PCI13 = D13, // PB5
202  PCI14 = D14, // PC0
203  PCI15 = D15, // PC1
204  PCI16 = D16, // PC2
205  PCI17 = D17, // PC3
206  PCI18 = D18, // PC4
207  PCI19 = D19 // PC5
208  } __attribute__((packed));
209 
213  enum {
214  ANALOG_PIN_MAX = 8,
215  DIGITAL_PIN_MAX = 20,
216  EXT_PIN_MAX = 2,
217  PCI_PIN_MAX = 20,
218  PWM_PIN_MAX = 6
219  };
220 
224  enum TWIPin {
225  SDA = 4, // PC4/D18/A4
226  SCL = 5 // PC6/D19/A5
227  } __attribute__((packed));
228 
232  enum SPIPin {
233  SS = 2, // PB2/D10
234  MOSI = 3, // PB3/D11
235  MISO = 4, // PB4/D12
236  SCK = 5 // PB5/D13
237  } __attribute__((packed));
238 
242  enum {
243  VBG = (_BV(MUX3) | _BV(MUX2) | _BV(MUX1)),
244  UART_MAX = 1,
245  EXT_MAX = 2,
246  PCMSK_MAX = 3,
247  PCINT_MAX = 24
248  } __attribute__((packed));
249 };
250 
254 extern "C" {
255  void ADC_vect(void) __attribute__ ((signal));
256  void ANALOG_COMP_vect(void) __attribute__ ((signal));
257  void INT0_vect(void) __attribute__ ((signal));
258  void INT1_vect(void) __attribute__ ((signal));
259  void PCINT0_vect(void) __attribute__ ((signal));
260  void PCINT1_vect(void) __attribute__ ((signal));
261  void PCINT2_vect(void) __attribute__ ((signal));
262  void SPI_STC_vect(void) __attribute__ ((signal));
263  void TIMER0_COMPA_vect(void) __attribute__ ((signal));
264  void TIMER0_COMPB_vect(void) __attribute__ ((signal));
265  void TIMER0_OVF_vect(void) __attribute__ ((signal));
266  void TIMER1_CAPT_vect(void) __attribute__ ((signal));
267  void TIMER1_COMPA_vect(void) __attribute__ ((signal));
268  void TIMER1_COMPB_vect(void) __attribute__ ((signal));
269  void TIMER1_OVF_vect(void) __attribute__ ((signal));
270  void TIMER2_COMPA_vect(void) __attribute__ ((signal));
271  void TIMER2_COMPB_vect(void) __attribute__ ((signal));
272  void TIMER2_OVF_vect(void) __attribute__ ((signal));
273  void TWI_vect(void) __attribute__ ((signal));
274  void WDT_vect(void) __attribute__ ((signal));
275  void USART_RX_vect(void) __attribute__ ((signal));
276  void USART_TX_vect(void) __attribute__ ((signal));
277  void USART_UDRE_vect(void) __attribute__ ((signal));
278 }
279 #endif
280 
void TIMER0_COMPA_vect(void)
void WDT_vect(void)
void PCINT0_vect(void)
void TIMER1_COMPB_vect(void)
Definition: Pin.hh:35
void TIMER1_CAPT_vect(void)
Definition: LED.hh:32
void TIMER0_COMPB_vect(void)
void TWI_vect(void)
void TIMER2_COMPA_vect(void)
void USART_UDRE_vect(void)
void ANALOG_COMP_vect(void)
friend class UART
Definition: ATmega1284P.hh:39
ExternalInterruptPin
Definition: ATmega1284P.hh:190
Definition: UART.hh:59
void TIMER1_OVF_vect(void)
#define PCMSK0
Definition: ATtinyX5.hh:227
void USART_RX_vect(void)
Definition: PWMPin.hh:29
#define UNUSED(x)
Definition: ATmega328P.hh:31
void INT0_vect(void)
void USART_TX_vect(void)
void SPI_STC_vect(void)
void PCINT2_vect(void)
void TIMER0_OVF_vect(void)
Definition: GPIO.hh:30
void INT1_vect(void)
void TIMER2_COMPB_vect(void)
void ADC_vect(void)
void PCINT1_vect(void)
static void init()
Definition: ATmega328P.hh:110
void TIMER2_OVF_vect(void)
void TIMER1_COMPA_vect(void)