abdf6f8c6b
Now the necessary settings are in adc.h. Refactored to allow repeated ADC reads without reinitialization. Arduino allows setting analogReference, this is now also implemented. ADC is now initialized to sane values in apps/arduino/arduino-process.c dev/arduino/arduino-compat.h now has all hardware independent settings for arduino (some moved from platform/osd-merkur/dev/hw-arduino.h). turnOffPWM re-implemented with hw_timer, removed from wiring_digital.c ADC-specific arduino stuff moved to arduino-compat.h Arduinos wiring_analog no longer necessary. arduino-sketch example now reads analog inputs 1 and 5 using analogRead.
172 lines
4.4 KiB
C
172 lines
4.4 KiB
C
#ifndef Arduino_h
|
|
#define Arduino_h
|
|
|
|
#include <hw-arduino.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include <avr/pgmspace.h>
|
|
#include <avr/io.h>
|
|
#include <avr/interrupt.h>
|
|
|
|
#include "binary.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"{
|
|
#endif
|
|
|
|
#define HIGH 0x1
|
|
#define LOW 0x0
|
|
|
|
#define INPUT 0x0
|
|
#define OUTPUT 0x1
|
|
#define INPUT_PULLUP 0x2
|
|
|
|
#define true 0x1
|
|
#define false 0x0
|
|
|
|
#define PI 3.1415926535897932384626433832795
|
|
#define HALF_PI 1.5707963267948966192313216916398
|
|
#define TWO_PI 6.283185307179586476925286766559
|
|
#define DEG_TO_RAD 0.017453292519943295769236907684886
|
|
#define RAD_TO_DEG 57.295779513082320876798154814105
|
|
|
|
#define SERIAL 0x0
|
|
#define DISPLAY 0x1
|
|
|
|
#define LSBFIRST 0
|
|
#define MSBFIRST 1
|
|
|
|
#define CHANGE 1
|
|
#define FALLING 2
|
|
#define RISING 3
|
|
|
|
#define DEFAULT ADC_DEFAULT
|
|
#define EXTERNAL ADC_EXTERNAL
|
|
|
|
// undefine stdlib's abs if encountered
|
|
#ifdef abs
|
|
#undef abs
|
|
#endif
|
|
|
|
#define min(a,b) ((a)<(b)?(a):(b))
|
|
#define max(a,b) ((a)>(b)?(a):(b))
|
|
#define abs(x) ((x)>0?(x):-(x))
|
|
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
|
|
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
|
|
#define radians(deg) ((deg)*DEG_TO_RAD)
|
|
#define degrees(rad) ((rad)*RAD_TO_DEG)
|
|
#define sq(x) ((x)*(x))
|
|
|
|
#define interrupts() sei()
|
|
#define noInterrupts() cli()
|
|
|
|
#define lowByte(w) ((uint8_t) ((w) & 0xff))
|
|
#define highByte(w) ((uint8_t) ((w) >> 8))
|
|
|
|
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
|
|
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
|
|
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
|
|
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
|
|
|
|
|
|
typedef unsigned int word;
|
|
|
|
#define bit(b) (1UL << (b))
|
|
|
|
typedef uint8_t boolean;
|
|
typedef uint8_t byte;
|
|
|
|
void pinMode(uint8_t, uint8_t);
|
|
void digitalWrite(uint8_t, uint8_t);
|
|
int digitalRead(uint8_t);
|
|
|
|
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
|
|
|
|
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
|
|
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
|
|
|
|
void attachInterrupt(uint8_t, void (*)(void), int mode);
|
|
void detachInterrupt(uint8_t);
|
|
|
|
void setup(void);
|
|
void loop(void);
|
|
|
|
// Get the bit location within the hardware port of the given virtual pin.
|
|
// This comes from the pins_*.c file for the active board configuration.
|
|
|
|
#define analogInPinToBit(P) (P)
|
|
|
|
// On the ATmega1280, the addresses of some of the port registers are
|
|
// greater than 255, so we can't store them in uint8_t's.
|
|
extern const uint16_t PROGMEM port_to_mode_PGM[];
|
|
extern const uint16_t PROGMEM port_to_input_PGM[];
|
|
extern const uint16_t PROGMEM port_to_output_PGM[];
|
|
|
|
extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
|
|
// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
|
|
extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
|
|
|
|
// Get the bit location within the hardware port of the given virtual pin.
|
|
// This comes from the pins_*.c file for the active board configuration.
|
|
//
|
|
// These perform slightly better as macros compared to inline functions
|
|
//
|
|
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
|
|
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
|
|
#define analogInPinToBit(P) (P)
|
|
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
|
|
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
|
|
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
|
|
|
|
#define NOT_A_PIN 0
|
|
#define NOT_A_PORT 0
|
|
|
|
#ifdef ARDUINO_MAIN
|
|
#define PA 1
|
|
#define PB 2
|
|
#define PC 3
|
|
#define PD 4
|
|
#define PE 5
|
|
#define PF 6
|
|
#define PG 7
|
|
#define PH 8
|
|
#define PJ 10
|
|
#define PK 11
|
|
#define PL 12
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
// look at this again when considering implementing serial
|
|
//#include "WCharacter.h"
|
|
//#include "WString.h"
|
|
//#include "HardwareSerial.h"
|
|
|
|
uint16_t makeWord(uint16_t w);
|
|
uint16_t makeWord(byte h, byte l);
|
|
|
|
#define word(...) makeWord(__VA_ARGS__)
|
|
|
|
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
|
|
|
|
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
|
|
void noTone(uint8_t _pin);
|
|
|
|
// WMath prototypes
|
|
long random(long);
|
|
long random(long, long);
|
|
void randomSeed(unsigned int);
|
|
long map(long, long, long, long, long);
|
|
|
|
#endif
|
|
|
|
#include "pins_arduino.h"
|
|
|
|
#include "dev/arduino/arduino-compat.h"
|
|
|
|
#endif
|