Arduino/Arduino2AVR
aus Metalab Wiki, dem offenen Zentrum für meta-disziplinäre Magier und technisch-kreative Enthusiasten.
Zur Navigation springenZur Suche springenArduino -> AVR HOWTO
This is an (incomplete) guide to how to map from Arduino source code to avr-gcc source code. It's been written to map this this direction, but can be used to understand how to go the other direction as well.
Step 1: Setup project
- Copy Makefile from some other project
- NB! Make sure DEVICE and SERIAL are correctly set
- Copy the <MyProject.pde> file to main.cpp
Step 2: Edit main.cpp
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <avr/interrupt.h> #include <avr/io.h> #include <util/delay.h> <insert .pde code here> int main(void) { cli(); // set a2d reference to AVCC (5 volts) ADMUX &= ~(1<<REFS1); ADMUX |= (1<<REFS0); // set a2d prescale factor to 128 // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. // FIXME: this will not work properly for other clock speeds, and // this code should use F_CPU to determine the prescale factor. ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)| // enable a2d conversions (1<<ADEN); setup(); sei(); while (1) { loop(); } return 0; }
Step 3: Port code away from Arduino
Arduino | AVR | Notes |
---|---|---|
byte | uint8_t | |
Serial.begin(<baud>) | uart_init(<baud>) | |
Serial.print*() | printf() | |
Serial.available() | getchar() | NB! blocking |
pinMode(pin, INPUT) | DDRx &= ~_BV(bit); | // For I/O pins, convert pin to port+bit |
pinMode(pin, OUTPUT) | DDRx |= _BV(bit); | |
digitalWrite(pin, LOW) | PORTx &= ~_BV(bit); | |
digitalWrite(pin, HIGH) | PORTx |= _BV(bit); | |
digitalRead(pin) | (PINx & _BV(bit)) >> bit; | |
delay(ms) | _delay_ms(ms) | max delay is 262.14 ms / F_CPU in MHz. (16Mhz -> 16 ms) |
delayMicroseconds(us) | _delay_us(us) | max delay is 768 us / F_CPU in MHz. (16Mhz -> 48 us) |
millis() | Must be rewritten or implemented using a timer |
Misc. Notes
Address of I/O register: _SFR_IO_ADDR(PORTB)
(e.g. #define _SFR_IO_ADDR(sfr) (sfr - 0x20))
Read contents of I/O register: _SFR_IO8(register) // register = 00-3f
(e.g. #define PORTB _SFR_IO8(0x18)) #define _SFR_IO8(io_addr) (io_addr + 0x20)
Arduino pins to AVR port+bit
digital | |
0 | PORTD,0 |
1 | PORTD,1 |
2 | PORTD,2 |
3 | PORTD,3 |
4 | PORTD,4 |
5 | PORTD,5 |
6 | PORTD,6 |
7 | PORTD,7 |
8 | PORTB,0 |
9 | PORTB,1 |
10 | PORTB,2 |
11 | PORTB,3 |
12 | PORTB,4 |
13 | PORTB,5 |
analog | |
0 | PORTC,0 |
1 | PORTC,1 |
2 | PORTC,2 |
3 | PORTC,3 |
4 | PORTC,4 |
5 | PORTC,5 |