mirror of
https://github.com/damellis/attiny
synced 2025-09-05 00:05:08 +00:00
Updating for Arduino 1.0 (removing core and using variants).
This commit is contained in:
13
attiny/boards.txt
Normal file
13
attiny/boards.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
attiny45.name=ATtiny45
|
||||||
|
attiny45.upload.maximum_size=4096
|
||||||
|
attiny45.build.mcu=attiny45
|
||||||
|
attiny45.build.f_cpu=1000000L
|
||||||
|
attiny45.build.core=arduino:arduino
|
||||||
|
attiny45.build.variant=tiny8
|
||||||
|
|
||||||
|
attiny85.name=ATtiny85
|
||||||
|
attiny85.upload.maximum_size=8192
|
||||||
|
attiny85.build.mcu=attiny85
|
||||||
|
attiny85.build.f_cpu=1000000L
|
||||||
|
attiny85.build.core=arduino:arduino
|
||||||
|
attiny85.build.variant=tiny8
|
@@ -25,9 +25,10 @@
|
|||||||
Modified 09-10-2009 for attiny45 A.Saporetti
|
Modified 09-10-2009 for attiny45 A.Saporetti
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <avr/io.h>
|
#ifndef Pins_Arduino_h
|
||||||
#include "wiring_private.h"
|
#define Pins_Arduino_h
|
||||||
#include "pins_arduino.h"
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
// ATMEL ATTINY45 / ARDUINO
|
// ATMEL ATTINY45 / ARDUINO
|
||||||
//
|
//
|
||||||
@@ -39,29 +40,27 @@
|
|||||||
// +----+
|
// +----+
|
||||||
|
|
||||||
|
|
||||||
#define PB 1
|
#ifdef ARDUINO_MAIN
|
||||||
|
|
||||||
#define REPEAT8(x) x, x, x, x, x, x, x, x
|
|
||||||
#define BV0TO7 _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7)
|
|
||||||
#define BV7TO0 _BV(7), _BV(6), _BV(5), _BV(4), _BV(3), _BV(2), _BV(1), _BV(0)
|
|
||||||
|
|
||||||
|
|
||||||
// these arrays map port names (e.g. port B) to the
|
// these arrays map port names (e.g. port B) to the
|
||||||
// appropriate addresses for various functions (e.g. reading
|
// appropriate addresses for various functions (e.g. reading
|
||||||
// and writing) tiny45 only port B
|
// and writing) tiny45 only port B
|
||||||
const uint8_t PROGMEM port_to_mode_PGM[] = {
|
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
||||||
NOT_A_PORT,
|
NOT_A_PORT,
|
||||||
&DDRB,
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &DDRB,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM port_to_output_PGM[] = {
|
const uint16_t PROGMEM port_to_output_PGM[] = {
|
||||||
NOT_A_PORT,
|
NOT_A_PORT,
|
||||||
&PORTB,
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &PORTB,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM port_to_input_PGM[] = {
|
const uint16_t PROGMEM port_to_input_PGM[] = {
|
||||||
NOT_A_PIN,
|
NOT_A_PIN,
|
||||||
&PINB,
|
NOT_A_PIN,
|
||||||
|
(uint16_t) &PINB,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
@@ -86,9 +85,13 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
|
|||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
||||||
TIMER0A, /* OC0A */
|
TIMER0A, /* OC0A */
|
||||||
TIMER1,
|
TIMER0B,
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER,
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER,
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER,
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@@ -1,41 +0,0 @@
|
|||||||
attiny45usbtinyisp.name=ATtiny45 (w/ USB Tiny ISP)
|
|
||||||
attiny45usbtinyisp.upload.using=arduino:usbtinyisp
|
|
||||||
attiny45usbtinyisp.upload.maximum_size=4096
|
|
||||||
attiny45usbtinyisp.build.mcu=attiny45
|
|
||||||
attiny45usbtinyisp.build.f_cpu=1000000L
|
|
||||||
attiny45usbtinyisp.build.core=attiny45_85
|
|
||||||
|
|
||||||
attiny45arduinoisp.name=ATtiny45 (w/ Arduino as ISP)
|
|
||||||
attiny45arduinoisp.upload.using=arduino:arduinoisp
|
|
||||||
attiny45arduinoisp.upload.maximum_size=4096
|
|
||||||
attiny45arduinoisp.build.mcu=attiny45
|
|
||||||
attiny45arduinoisp.build.f_cpu=1000000L
|
|
||||||
attiny45arduinoisp.build.core=attiny45_85
|
|
||||||
|
|
||||||
attiny45avrisp.name=ATtiny45 (w/ AVRISP mkII)
|
|
||||||
attiny45avrisp.upload.using=arduino:avrispmkii
|
|
||||||
attiny45avrisp.upload.maximum_size=4096
|
|
||||||
attiny45avrisp.build.mcu=attiny45
|
|
||||||
attiny45avrisp.build.f_cpu=1000000L
|
|
||||||
attiny45avrisp.build.core=attiny45_85
|
|
||||||
|
|
||||||
attiny85usbtinyisp.name=ATtiny85 (w/ USB Tiny ISP)
|
|
||||||
attiny85usbtinyisp.upload.using=arduino:usbtinyisp
|
|
||||||
attiny85usbtinyisp.upload.maximum_size=8192
|
|
||||||
attiny85usbtinyisp.build.mcu=attiny85
|
|
||||||
attiny85usbtinyisp.build.f_cpu=1000000L
|
|
||||||
attiny85usbtinyisp.build.core=attiny45_85
|
|
||||||
|
|
||||||
attiny85arduinoisp.name=ATtiny85 (w/ Arduino as ISP)
|
|
||||||
attiny85arduinoisp.upload.using=arduino:arduinoisp
|
|
||||||
attiny85arduinoisp.upload.maximum_size=8192
|
|
||||||
attiny85arduinoisp.build.mcu=attiny85
|
|
||||||
attiny85arduinoisp.build.f_cpu=1000000L
|
|
||||||
attiny85arduinoisp.build.core=attiny45_85
|
|
||||||
|
|
||||||
attiny85avrisp.name=ATtiny85 (w/ AVRISP mkII)
|
|
||||||
attiny85avrisp.upload.using=arduino:avrispmkii
|
|
||||||
attiny85avrisp.upload.maximum_size=8192
|
|
||||||
attiny85avrisp.build.mcu=attiny85
|
|
||||||
attiny85avrisp.build.f_cpu=1000000L
|
|
||||||
attiny85avrisp.build.core=attiny45_85
|
|
BIN
attiny45_85/cores/attiny45_85/.DS_Store
vendored
BIN
attiny45_85/cores/attiny45_85/.DS_Store
vendored
Binary file not shown.
@@ -1,243 +0,0 @@
|
|||||||
# Arduino 0015 Makefile
|
|
||||||
# Arduino adaptation by mellis, eighthave, oli.keller
|
|
||||||
#
|
|
||||||
# This makefile allows you to build sketches from the command line
|
|
||||||
# without the Arduino environment (or Java).
|
|
||||||
#
|
|
||||||
# Detailed instructions for using the makefile:
|
|
||||||
#
|
|
||||||
# 1. Copy this file into the folder with your sketch. There should be a
|
|
||||||
# file with the same name as the folder and with the extension .pde
|
|
||||||
# (e.g. foo.pde in the foo/ folder).
|
|
||||||
#
|
|
||||||
# 2. Modify the line containg "INSTALL_DIR" to point to the directory that
|
|
||||||
# contains the Arduino installation (for example, under Mac OS X, this
|
|
||||||
# might be /Applications/arduino-0012).
|
|
||||||
#
|
|
||||||
# 3. Modify the line containing "PORT" to refer to the filename
|
|
||||||
# representing the USB or serial connection to your Arduino board
|
|
||||||
# (e.g. PORT = /dev/tty.USB0). If the exact name of this file
|
|
||||||
# changes, you can use * as a wildcard (e.g. PORT = /dev/tty.usb*).
|
|
||||||
#
|
|
||||||
# 4. Set the line containing "MCU" to match your board's processor.
|
|
||||||
# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth
|
|
||||||
# or Diecimila have the atmega168. If you're using a LilyPad Arduino,
|
|
||||||
# change F_CPU to 8000000.
|
|
||||||
#
|
|
||||||
# 5. At the command line, change to the directory containing your
|
|
||||||
# program's file and the makefile.
|
|
||||||
#
|
|
||||||
# 6. Type "make" and press enter to compile/verify your program.
|
|
||||||
#
|
|
||||||
# 7. Type "make upload", reset your Arduino board, and press enter to
|
|
||||||
# upload your program to the Arduino board.
|
|
||||||
#
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
TARGET = $(notdir $(CURDIR))
|
|
||||||
INSTALL_DIR = ../../..
|
|
||||||
PORT = /dev/tty.usb*
|
|
||||||
UPLOAD_RATE = 19200
|
|
||||||
AVRDUDE_PROGRAMMER = stk500v1
|
|
||||||
MCU = attiny84
|
|
||||||
F_CPU = 8000000
|
|
||||||
|
|
||||||
############################################################################
|
|
||||||
# Below here nothing should be changed...
|
|
||||||
|
|
||||||
ARDUINO = $(INSTALL_DIR)/hardware/cores/arduino
|
|
||||||
AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
|
|
||||||
SRC = $(ARDUINO)/pins_arduino.c $(ARDUINO)/wiring.c \
|
|
||||||
$(ARDUINO)/wiring_analog.c $(ARDUINO)/wiring_digital.c \
|
|
||||||
$(ARDUINO)/wiring_pulse.c $(ARDUINO)/wiring_serial.c \
|
|
||||||
$(ARDUINO)/wiring_shift.c $(ARDUINO)/WInterrupts.c
|
|
||||||
CXXSRC = $(ARDUINO)/HardwareSerial.cpp $(ARDUINO)/WMath.cpp \
|
|
||||||
$(ARDUINO)/Print.cpp
|
|
||||||
FORMAT = ihex
|
|
||||||
|
|
||||||
|
|
||||||
# Name of this Makefile (used for "make depend").
|
|
||||||
MAKEFILE = Makefile
|
|
||||||
|
|
||||||
# Debugging format.
|
|
||||||
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
|
||||||
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
|
||||||
DEBUG = stabs
|
|
||||||
|
|
||||||
OPT = s
|
|
||||||
|
|
||||||
# Place -D or -U options here
|
|
||||||
CDEFS = -DF_CPU=$(F_CPU)
|
|
||||||
CXXDEFS = -DF_CPU=$(F_CPU)
|
|
||||||
|
|
||||||
# Place -I options here
|
|
||||||
CINCS = -I$(ARDUINO)
|
|
||||||
CXXINCS = -I$(ARDUINO)
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
|
||||||
# c89 - "ANSI" C
|
|
||||||
# gnu89 - c89 plus GCC extensions
|
|
||||||
# c99 - ISO C99 standard (not yet fully implemented)
|
|
||||||
# gnu99 - c99 plus GCC extensions
|
|
||||||
CSTANDARD = -std=gnu99
|
|
||||||
CDEBUG = -g$(DEBUG)
|
|
||||||
CWARN = -Wall -Wstrict-prototypes
|
|
||||||
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
|
||||||
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
|
||||||
|
|
||||||
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA)
|
|
||||||
CXXFLAGS = $(CDEFS) $(CINCS) -O$(OPT)
|
|
||||||
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
|
||||||
LDFLAGS = -lm
|
|
||||||
|
|
||||||
|
|
||||||
# Programming support using avrdude. Settings and variables.
|
|
||||||
AVRDUDE_PORT = $(PORT)
|
|
||||||
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex
|
|
||||||
AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf \
|
|
||||||
-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
|
|
||||||
-b $(UPLOAD_RATE)
|
|
||||||
|
|
||||||
# Program settings
|
|
||||||
CC = $(AVR_TOOLS_PATH)/avr-gcc
|
|
||||||
CXX = $(AVR_TOOLS_PATH)/avr-g++
|
|
||||||
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
|
|
||||||
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
|
|
||||||
AR = $(AVR_TOOLS_PATH)/avr-ar
|
|
||||||
SIZE = $(AVR_TOOLS_PATH)/avr-size
|
|
||||||
NM = $(AVR_TOOLS_PATH)/avr-nm
|
|
||||||
AVRDUDE = $(AVR_TOOLS_PATH)/avrdude
|
|
||||||
REMOVE = rm -f
|
|
||||||
MV = mv -f
|
|
||||||
|
|
||||||
# Define all object files.
|
|
||||||
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
|
|
||||||
|
|
||||||
# Define all listing files.
|
|
||||||
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)
|
|
||||||
|
|
||||||
# Combine all necessary flags and optional flags.
|
|
||||||
# Add target processor to flags.
|
|
||||||
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
|
|
||||||
ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS)
|
|
||||||
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
# Default target.
|
|
||||||
all: applet_files build sizeafter
|
|
||||||
|
|
||||||
build: elf hex
|
|
||||||
|
|
||||||
applet_files: $(TARGET).pde
|
|
||||||
# Here is the "preprocessing".
|
|
||||||
# It creates a .cpp file based with the same name as the .pde file.
|
|
||||||
# On top of the new .cpp file comes the WProgram.h header.
|
|
||||||
# At the end there is a generic main() function attached.
|
|
||||||
# Then the .cpp file will be compiled. Errors during compile will
|
|
||||||
# refer to this new, automatically generated, file.
|
|
||||||
# Not the original .pde file you actually edit...
|
|
||||||
test -d applet || mkdir applet
|
|
||||||
echo '#include "WProgram.h"' > applet/$(TARGET).cpp
|
|
||||||
cat $(TARGET).pde >> applet/$(TARGET).cpp
|
|
||||||
cat $(ARDUINO)/main.cxx >> applet/$(TARGET).cpp
|
|
||||||
|
|
||||||
elf: applet/$(TARGET).elf
|
|
||||||
hex: applet/$(TARGET).hex
|
|
||||||
eep: applet/$(TARGET).eep
|
|
||||||
lss: applet/$(TARGET).lss
|
|
||||||
sym: applet/$(TARGET).sym
|
|
||||||
|
|
||||||
# Program the device.
|
|
||||||
upload: applet/$(TARGET).hex
|
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
|
|
||||||
|
|
||||||
|
|
||||||
# Display size of file.
|
|
||||||
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
|
|
||||||
ELFSIZE = $(SIZE) applet/$(TARGET).elf
|
|
||||||
sizebefore:
|
|
||||||
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi
|
|
||||||
|
|
||||||
sizeafter:
|
|
||||||
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi
|
|
||||||
|
|
||||||
|
|
||||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
|
||||||
COFFCONVERT=$(OBJCOPY) --debugging \
|
|
||||||
--change-section-address .data-0x800000 \
|
|
||||||
--change-section-address .bss-0x800000 \
|
|
||||||
--change-section-address .noinit-0x800000 \
|
|
||||||
--change-section-address .eeprom-0x810000
|
|
||||||
|
|
||||||
|
|
||||||
coff: applet/$(TARGET).elf
|
|
||||||
$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof
|
|
||||||
|
|
||||||
|
|
||||||
extcoff: $(TARGET).elf
|
|
||||||
$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof
|
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES: .elf .hex .eep .lss .sym
|
|
||||||
|
|
||||||
.elf.hex:
|
|
||||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
|
||||||
|
|
||||||
.elf.eep:
|
|
||||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
|
||||||
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
|
||||||
|
|
||||||
# Create extended listing file from ELF output file.
|
|
||||||
.elf.lss:
|
|
||||||
$(OBJDUMP) -h -S $< > $@
|
|
||||||
|
|
||||||
# Create a symbol table from ELF output file.
|
|
||||||
.elf.sym:
|
|
||||||
$(NM) -n $< > $@
|
|
||||||
|
|
||||||
# Link: create ELF output file from library.
|
|
||||||
applet/$(TARGET).elf: $(TARGET).pde applet/core.a
|
|
||||||
$(CC) $(ALL_CFLAGS) -o $@ applet/$(TARGET).cpp -L. applet/core.a $(LDFLAGS)
|
|
||||||
|
|
||||||
applet/core.a: $(OBJ)
|
|
||||||
@for i in $(OBJ); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Compile: create object files from C++ source files.
|
|
||||||
.cpp.o:
|
|
||||||
$(CXX) -c $(ALL_CXXFLAGS) $< -o $@
|
|
||||||
|
|
||||||
# Compile: create object files from C source files.
|
|
||||||
.c.o:
|
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
|
||||||
.c.s:
|
|
||||||
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
|
||||||
.S.o:
|
|
||||||
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
|
||||||
|
|
||||||
|
|
||||||
# Automatic dependencies
|
|
||||||
%.d: %.c
|
|
||||||
$(CC) -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
|
|
||||||
|
|
||||||
%.d: %.cpp
|
|
||||||
$(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
|
|
||||||
|
|
||||||
|
|
||||||
# Target: clean project.
|
|
||||||
clean:
|
|
||||||
$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \
|
|
||||||
applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \
|
|
||||||
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)
|
|
||||||
|
|
||||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter
|
|
||||||
|
|
||||||
include $(SRC:.c=.d)
|
|
||||||
include $(CXXSRC:.cpp=.d)
|
|
@@ -1,215 +0,0 @@
|
|||||||
/*
|
|
||||||
Print.cpp - Base class that provides print() and println()
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Modified 23 November 2006 by David A. Mellis
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include "wiring.h"
|
|
||||||
|
|
||||||
#include "Print.h"
|
|
||||||
|
|
||||||
// Public Methods //////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
|
||||||
void Print::write(const char *str)
|
|
||||||
{
|
|
||||||
while (*str)
|
|
||||||
write(*str++);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
|
||||||
void Print::write(const uint8_t *buffer, size_t size)
|
|
||||||
{
|
|
||||||
while (size--)
|
|
||||||
write(*buffer++);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(uint8_t b)
|
|
||||||
{
|
|
||||||
this->write(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(char c)
|
|
||||||
{
|
|
||||||
print((byte) c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(const char str[])
|
|
||||||
{
|
|
||||||
write(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(int n)
|
|
||||||
{
|
|
||||||
print((long) n);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(unsigned int n)
|
|
||||||
{
|
|
||||||
print((unsigned long) n);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(long n)
|
|
||||||
{
|
|
||||||
if (n < 0) {
|
|
||||||
print('-');
|
|
||||||
n = -n;
|
|
||||||
}
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(unsigned long n)
|
|
||||||
{
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(long n, int base)
|
|
||||||
{
|
|
||||||
if (base == 0)
|
|
||||||
print((char) n);
|
|
||||||
else if (base == 10)
|
|
||||||
print(n);
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print(double n)
|
|
||||||
{
|
|
||||||
printFloat(n, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(void)
|
|
||||||
{
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(char c)
|
|
||||||
{
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(const char c[])
|
|
||||||
{
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(uint8_t b)
|
|
||||||
{
|
|
||||||
print(b);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(int n)
|
|
||||||
{
|
|
||||||
print(n);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(unsigned int n)
|
|
||||||
{
|
|
||||||
print(n);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(long n)
|
|
||||||
{
|
|
||||||
print(n);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(unsigned long n)
|
|
||||||
{
|
|
||||||
print(n);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(long n, int base)
|
|
||||||
{
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::println(double n)
|
|
||||||
{
|
|
||||||
print(n);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods /////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void Print::printNumber(unsigned long n, uint8_t base)
|
|
||||||
{
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
|
|
||||||
unsigned long i = 0;
|
|
||||||
|
|
||||||
if (n == 0) {
|
|
||||||
print('0');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (n > 0) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; i > 0; i--)
|
|
||||||
print((char) (buf[i - 1] < 10 ?
|
|
||||||
'0' + buf[i - 1] :
|
|
||||||
'A' + buf[i - 1] - 10));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::printFloat(double number, uint8_t digits)
|
|
||||||
{
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0)
|
|
||||||
{
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
for (uint8_t i=0; i<digits; ++i)
|
|
||||||
rounding /= 10.0;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits > 0)
|
|
||||||
print(".");
|
|
||||||
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits-- > 0)
|
|
||||||
{
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
Print.h - Base class that provides print() and println()
|
|
||||||
Copyright (c) 2008 David A. Mellis. All right reserved.
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Print_h
|
|
||||||
#define Print_h
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdio.h> // for size_t
|
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
#define BYTE 0
|
|
||||||
|
|
||||||
class Print
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
void printNumber(unsigned long, uint8_t);
|
|
||||||
void printFloat(double, uint8_t);
|
|
||||||
public:
|
|
||||||
virtual void write(uint8_t) = 0;
|
|
||||||
virtual void write(const char *str);
|
|
||||||
virtual void write(const uint8_t *buffer, size_t size);
|
|
||||||
void print(char);
|
|
||||||
void print(const char[]);
|
|
||||||
void print(uint8_t);
|
|
||||||
void print(int);
|
|
||||||
void print(unsigned int);
|
|
||||||
void print(long);
|
|
||||||
void print(unsigned long);
|
|
||||||
void print(long, int);
|
|
||||||
void print(double);
|
|
||||||
void println(void);
|
|
||||||
void println(char);
|
|
||||||
void println(const char[]);
|
|
||||||
void println(uint8_t);
|
|
||||||
void println(int);
|
|
||||||
void println(unsigned int);
|
|
||||||
void println(long);
|
|
||||||
void println(unsigned long);
|
|
||||||
void println(long, int);
|
|
||||||
void println(double);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1 +0,0 @@
|
|||||||
#include "wiring.h"
|
|
@@ -1,86 +0,0 @@
|
|||||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Part of the Wiring project - http://wiring.uniandes.edu.co
|
|
||||||
|
|
||||||
Copyright (c) 2004-05 Hernando Barragan
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Modified 24 November 2006 by David A. Mellis
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 09-10-2009 for attiny45 A.Saporetti
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "WConstants.h"
|
|
||||||
#include "wiring_private.h"
|
|
||||||
|
|
||||||
volatile static voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS];
|
|
||||||
// volatile static voidFuncPtr twiIntFunc;
|
|
||||||
|
|
||||||
#define EICRA MCUCR
|
|
||||||
#define EIMSK GIMSK
|
|
||||||
|
|
||||||
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
|
|
||||||
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
|
|
||||||
intFunc[interruptNum] = userFunc;
|
|
||||||
|
|
||||||
// Configure the interrupt mode (trigger on low input, any change, rising
|
|
||||||
// edge, or falling edge). The mode constants were chosen to correspond
|
|
||||||
// to the configuration bits in the hardware register, so we simply shift
|
|
||||||
// the mode into place.
|
|
||||||
|
|
||||||
// Enable the interrupt.
|
|
||||||
|
|
||||||
//only 1 interrupt
|
|
||||||
switch (interruptNum) {
|
|
||||||
case 0:
|
|
||||||
EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
|
|
||||||
EIMSK |= (1 << INT0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void detachInterrupt(uint8_t interruptNum) {
|
|
||||||
if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
|
|
||||||
// Disable the interrupt. (We can't assume that interruptNum is equal
|
|
||||||
// to the number of the EIMSK bit to clear, as this isn't true on the
|
|
||||||
// ATmega8. There, INT0 is 6 and INT1 is 7.)
|
|
||||||
|
|
||||||
//only 1 interrupt
|
|
||||||
switch (interruptNum) {
|
|
||||||
case 0:
|
|
||||||
EIMSK &= ~(1 << INT0);
|
|
||||||
break;;
|
|
||||||
}
|
|
||||||
|
|
||||||
intFunc[interruptNum] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//SIGNAL(EXT_INT0_vect) {
|
|
||||||
ISR(INT0_vect) {
|
|
||||||
if(intFunc[EXTERNAL_INT_0])
|
|
||||||
intFunc[EXTERNAL_INT_0]();
|
|
||||||
}
|
|
@@ -1,60 +0,0 @@
|
|||||||
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Part of the Wiring project - http://wiring.org.co
|
|
||||||
Copyright (c) 2004-06 Hernando Barragan
|
|
||||||
Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "stdlib.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
void randomSeed(unsigned int seed)
|
|
||||||
{
|
|
||||||
if (seed != 0) {
|
|
||||||
srandom(seed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long random(long howbig)
|
|
||||||
{
|
|
||||||
if (howbig == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return random() % howbig;
|
|
||||||
}
|
|
||||||
|
|
||||||
long random(long howsmall, long howbig)
|
|
||||||
{
|
|
||||||
if (howsmall >= howbig) {
|
|
||||||
return howsmall;
|
|
||||||
}
|
|
||||||
long diff = howbig - howsmall;
|
|
||||||
return random(diff) + howsmall;
|
|
||||||
}
|
|
||||||
|
|
||||||
long map(long x, long in_min, long in_max, long out_min, long out_max)
|
|
||||||
{
|
|
||||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int makeWord(unsigned int w) { return w; }
|
|
||||||
unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; }
|
|
@@ -1,30 +0,0 @@
|
|||||||
#ifndef WProgram_h
|
|
||||||
#define WProgram_h
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
|
|
||||||
#include "wiring.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
//#include "HardwareSerial.h" // burp
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
// WMath prototypes
|
|
||||||
long random(long);
|
|
||||||
long random(long, long);
|
|
||||||
void randomSeed(unsigned int);
|
|
||||||
long map(long, long, long, long, long);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,515 +0,0 @@
|
|||||||
#ifndef Binary_h
|
|
||||||
#define Binary_h
|
|
||||||
|
|
||||||
#define B0 0
|
|
||||||
#define B00 0
|
|
||||||
#define B000 0
|
|
||||||
#define B0000 0
|
|
||||||
#define B00000 0
|
|
||||||
#define B000000 0
|
|
||||||
#define B0000000 0
|
|
||||||
#define B00000000 0
|
|
||||||
#define B1 1
|
|
||||||
#define B01 1
|
|
||||||
#define B001 1
|
|
||||||
#define B0001 1
|
|
||||||
#define B00001 1
|
|
||||||
#define B000001 1
|
|
||||||
#define B0000001 1
|
|
||||||
#define B00000001 1
|
|
||||||
#define B10 2
|
|
||||||
#define B010 2
|
|
||||||
#define B0010 2
|
|
||||||
#define B00010 2
|
|
||||||
#define B000010 2
|
|
||||||
#define B0000010 2
|
|
||||||
#define B00000010 2
|
|
||||||
#define B11 3
|
|
||||||
#define B011 3
|
|
||||||
#define B0011 3
|
|
||||||
#define B00011 3
|
|
||||||
#define B000011 3
|
|
||||||
#define B0000011 3
|
|
||||||
#define B00000011 3
|
|
||||||
#define B100 4
|
|
||||||
#define B0100 4
|
|
||||||
#define B00100 4
|
|
||||||
#define B000100 4
|
|
||||||
#define B0000100 4
|
|
||||||
#define B00000100 4
|
|
||||||
#define B101 5
|
|
||||||
#define B0101 5
|
|
||||||
#define B00101 5
|
|
||||||
#define B000101 5
|
|
||||||
#define B0000101 5
|
|
||||||
#define B00000101 5
|
|
||||||
#define B110 6
|
|
||||||
#define B0110 6
|
|
||||||
#define B00110 6
|
|
||||||
#define B000110 6
|
|
||||||
#define B0000110 6
|
|
||||||
#define B00000110 6
|
|
||||||
#define B111 7
|
|
||||||
#define B0111 7
|
|
||||||
#define B00111 7
|
|
||||||
#define B000111 7
|
|
||||||
#define B0000111 7
|
|
||||||
#define B00000111 7
|
|
||||||
#define B1000 8
|
|
||||||
#define B01000 8
|
|
||||||
#define B001000 8
|
|
||||||
#define B0001000 8
|
|
||||||
#define B00001000 8
|
|
||||||
#define B1001 9
|
|
||||||
#define B01001 9
|
|
||||||
#define B001001 9
|
|
||||||
#define B0001001 9
|
|
||||||
#define B00001001 9
|
|
||||||
#define B1010 10
|
|
||||||
#define B01010 10
|
|
||||||
#define B001010 10
|
|
||||||
#define B0001010 10
|
|
||||||
#define B00001010 10
|
|
||||||
#define B1011 11
|
|
||||||
#define B01011 11
|
|
||||||
#define B001011 11
|
|
||||||
#define B0001011 11
|
|
||||||
#define B00001011 11
|
|
||||||
#define B1100 12
|
|
||||||
#define B01100 12
|
|
||||||
#define B001100 12
|
|
||||||
#define B0001100 12
|
|
||||||
#define B00001100 12
|
|
||||||
#define B1101 13
|
|
||||||
#define B01101 13
|
|
||||||
#define B001101 13
|
|
||||||
#define B0001101 13
|
|
||||||
#define B00001101 13
|
|
||||||
#define B1110 14
|
|
||||||
#define B01110 14
|
|
||||||
#define B001110 14
|
|
||||||
#define B0001110 14
|
|
||||||
#define B00001110 14
|
|
||||||
#define B1111 15
|
|
||||||
#define B01111 15
|
|
||||||
#define B001111 15
|
|
||||||
#define B0001111 15
|
|
||||||
#define B00001111 15
|
|
||||||
#define B10000 16
|
|
||||||
#define B010000 16
|
|
||||||
#define B0010000 16
|
|
||||||
#define B00010000 16
|
|
||||||
#define B10001 17
|
|
||||||
#define B010001 17
|
|
||||||
#define B0010001 17
|
|
||||||
#define B00010001 17
|
|
||||||
#define B10010 18
|
|
||||||
#define B010010 18
|
|
||||||
#define B0010010 18
|
|
||||||
#define B00010010 18
|
|
||||||
#define B10011 19
|
|
||||||
#define B010011 19
|
|
||||||
#define B0010011 19
|
|
||||||
#define B00010011 19
|
|
||||||
#define B10100 20
|
|
||||||
#define B010100 20
|
|
||||||
#define B0010100 20
|
|
||||||
#define B00010100 20
|
|
||||||
#define B10101 21
|
|
||||||
#define B010101 21
|
|
||||||
#define B0010101 21
|
|
||||||
#define B00010101 21
|
|
||||||
#define B10110 22
|
|
||||||
#define B010110 22
|
|
||||||
#define B0010110 22
|
|
||||||
#define B00010110 22
|
|
||||||
#define B10111 23
|
|
||||||
#define B010111 23
|
|
||||||
#define B0010111 23
|
|
||||||
#define B00010111 23
|
|
||||||
#define B11000 24
|
|
||||||
#define B011000 24
|
|
||||||
#define B0011000 24
|
|
||||||
#define B00011000 24
|
|
||||||
#define B11001 25
|
|
||||||
#define B011001 25
|
|
||||||
#define B0011001 25
|
|
||||||
#define B00011001 25
|
|
||||||
#define B11010 26
|
|
||||||
#define B011010 26
|
|
||||||
#define B0011010 26
|
|
||||||
#define B00011010 26
|
|
||||||
#define B11011 27
|
|
||||||
#define B011011 27
|
|
||||||
#define B0011011 27
|
|
||||||
#define B00011011 27
|
|
||||||
#define B11100 28
|
|
||||||
#define B011100 28
|
|
||||||
#define B0011100 28
|
|
||||||
#define B00011100 28
|
|
||||||
#define B11101 29
|
|
||||||
#define B011101 29
|
|
||||||
#define B0011101 29
|
|
||||||
#define B00011101 29
|
|
||||||
#define B11110 30
|
|
||||||
#define B011110 30
|
|
||||||
#define B0011110 30
|
|
||||||
#define B00011110 30
|
|
||||||
#define B11111 31
|
|
||||||
#define B011111 31
|
|
||||||
#define B0011111 31
|
|
||||||
#define B00011111 31
|
|
||||||
#define B100000 32
|
|
||||||
#define B0100000 32
|
|
||||||
#define B00100000 32
|
|
||||||
#define B100001 33
|
|
||||||
#define B0100001 33
|
|
||||||
#define B00100001 33
|
|
||||||
#define B100010 34
|
|
||||||
#define B0100010 34
|
|
||||||
#define B00100010 34
|
|
||||||
#define B100011 35
|
|
||||||
#define B0100011 35
|
|
||||||
#define B00100011 35
|
|
||||||
#define B100100 36
|
|
||||||
#define B0100100 36
|
|
||||||
#define B00100100 36
|
|
||||||
#define B100101 37
|
|
||||||
#define B0100101 37
|
|
||||||
#define B00100101 37
|
|
||||||
#define B100110 38
|
|
||||||
#define B0100110 38
|
|
||||||
#define B00100110 38
|
|
||||||
#define B100111 39
|
|
||||||
#define B0100111 39
|
|
||||||
#define B00100111 39
|
|
||||||
#define B101000 40
|
|
||||||
#define B0101000 40
|
|
||||||
#define B00101000 40
|
|
||||||
#define B101001 41
|
|
||||||
#define B0101001 41
|
|
||||||
#define B00101001 41
|
|
||||||
#define B101010 42
|
|
||||||
#define B0101010 42
|
|
||||||
#define B00101010 42
|
|
||||||
#define B101011 43
|
|
||||||
#define B0101011 43
|
|
||||||
#define B00101011 43
|
|
||||||
#define B101100 44
|
|
||||||
#define B0101100 44
|
|
||||||
#define B00101100 44
|
|
||||||
#define B101101 45
|
|
||||||
#define B0101101 45
|
|
||||||
#define B00101101 45
|
|
||||||
#define B101110 46
|
|
||||||
#define B0101110 46
|
|
||||||
#define B00101110 46
|
|
||||||
#define B101111 47
|
|
||||||
#define B0101111 47
|
|
||||||
#define B00101111 47
|
|
||||||
#define B110000 48
|
|
||||||
#define B0110000 48
|
|
||||||
#define B00110000 48
|
|
||||||
#define B110001 49
|
|
||||||
#define B0110001 49
|
|
||||||
#define B00110001 49
|
|
||||||
#define B110010 50
|
|
||||||
#define B0110010 50
|
|
||||||
#define B00110010 50
|
|
||||||
#define B110011 51
|
|
||||||
#define B0110011 51
|
|
||||||
#define B00110011 51
|
|
||||||
#define B110100 52
|
|
||||||
#define B0110100 52
|
|
||||||
#define B00110100 52
|
|
||||||
#define B110101 53
|
|
||||||
#define B0110101 53
|
|
||||||
#define B00110101 53
|
|
||||||
#define B110110 54
|
|
||||||
#define B0110110 54
|
|
||||||
#define B00110110 54
|
|
||||||
#define B110111 55
|
|
||||||
#define B0110111 55
|
|
||||||
#define B00110111 55
|
|
||||||
#define B111000 56
|
|
||||||
#define B0111000 56
|
|
||||||
#define B00111000 56
|
|
||||||
#define B111001 57
|
|
||||||
#define B0111001 57
|
|
||||||
#define B00111001 57
|
|
||||||
#define B111010 58
|
|
||||||
#define B0111010 58
|
|
||||||
#define B00111010 58
|
|
||||||
#define B111011 59
|
|
||||||
#define B0111011 59
|
|
||||||
#define B00111011 59
|
|
||||||
#define B111100 60
|
|
||||||
#define B0111100 60
|
|
||||||
#define B00111100 60
|
|
||||||
#define B111101 61
|
|
||||||
#define B0111101 61
|
|
||||||
#define B00111101 61
|
|
||||||
#define B111110 62
|
|
||||||
#define B0111110 62
|
|
||||||
#define B00111110 62
|
|
||||||
#define B111111 63
|
|
||||||
#define B0111111 63
|
|
||||||
#define B00111111 63
|
|
||||||
#define B1000000 64
|
|
||||||
#define B01000000 64
|
|
||||||
#define B1000001 65
|
|
||||||
#define B01000001 65
|
|
||||||
#define B1000010 66
|
|
||||||
#define B01000010 66
|
|
||||||
#define B1000011 67
|
|
||||||
#define B01000011 67
|
|
||||||
#define B1000100 68
|
|
||||||
#define B01000100 68
|
|
||||||
#define B1000101 69
|
|
||||||
#define B01000101 69
|
|
||||||
#define B1000110 70
|
|
||||||
#define B01000110 70
|
|
||||||
#define B1000111 71
|
|
||||||
#define B01000111 71
|
|
||||||
#define B1001000 72
|
|
||||||
#define B01001000 72
|
|
||||||
#define B1001001 73
|
|
||||||
#define B01001001 73
|
|
||||||
#define B1001010 74
|
|
||||||
#define B01001010 74
|
|
||||||
#define B1001011 75
|
|
||||||
#define B01001011 75
|
|
||||||
#define B1001100 76
|
|
||||||
#define B01001100 76
|
|
||||||
#define B1001101 77
|
|
||||||
#define B01001101 77
|
|
||||||
#define B1001110 78
|
|
||||||
#define B01001110 78
|
|
||||||
#define B1001111 79
|
|
||||||
#define B01001111 79
|
|
||||||
#define B1010000 80
|
|
||||||
#define B01010000 80
|
|
||||||
#define B1010001 81
|
|
||||||
#define B01010001 81
|
|
||||||
#define B1010010 82
|
|
||||||
#define B01010010 82
|
|
||||||
#define B1010011 83
|
|
||||||
#define B01010011 83
|
|
||||||
#define B1010100 84
|
|
||||||
#define B01010100 84
|
|
||||||
#define B1010101 85
|
|
||||||
#define B01010101 85
|
|
||||||
#define B1010110 86
|
|
||||||
#define B01010110 86
|
|
||||||
#define B1010111 87
|
|
||||||
#define B01010111 87
|
|
||||||
#define B1011000 88
|
|
||||||
#define B01011000 88
|
|
||||||
#define B1011001 89
|
|
||||||
#define B01011001 89
|
|
||||||
#define B1011010 90
|
|
||||||
#define B01011010 90
|
|
||||||
#define B1011011 91
|
|
||||||
#define B01011011 91
|
|
||||||
#define B1011100 92
|
|
||||||
#define B01011100 92
|
|
||||||
#define B1011101 93
|
|
||||||
#define B01011101 93
|
|
||||||
#define B1011110 94
|
|
||||||
#define B01011110 94
|
|
||||||
#define B1011111 95
|
|
||||||
#define B01011111 95
|
|
||||||
#define B1100000 96
|
|
||||||
#define B01100000 96
|
|
||||||
#define B1100001 97
|
|
||||||
#define B01100001 97
|
|
||||||
#define B1100010 98
|
|
||||||
#define B01100010 98
|
|
||||||
#define B1100011 99
|
|
||||||
#define B01100011 99
|
|
||||||
#define B1100100 100
|
|
||||||
#define B01100100 100
|
|
||||||
#define B1100101 101
|
|
||||||
#define B01100101 101
|
|
||||||
#define B1100110 102
|
|
||||||
#define B01100110 102
|
|
||||||
#define B1100111 103
|
|
||||||
#define B01100111 103
|
|
||||||
#define B1101000 104
|
|
||||||
#define B01101000 104
|
|
||||||
#define B1101001 105
|
|
||||||
#define B01101001 105
|
|
||||||
#define B1101010 106
|
|
||||||
#define B01101010 106
|
|
||||||
#define B1101011 107
|
|
||||||
#define B01101011 107
|
|
||||||
#define B1101100 108
|
|
||||||
#define B01101100 108
|
|
||||||
#define B1101101 109
|
|
||||||
#define B01101101 109
|
|
||||||
#define B1101110 110
|
|
||||||
#define B01101110 110
|
|
||||||
#define B1101111 111
|
|
||||||
#define B01101111 111
|
|
||||||
#define B1110000 112
|
|
||||||
#define B01110000 112
|
|
||||||
#define B1110001 113
|
|
||||||
#define B01110001 113
|
|
||||||
#define B1110010 114
|
|
||||||
#define B01110010 114
|
|
||||||
#define B1110011 115
|
|
||||||
#define B01110011 115
|
|
||||||
#define B1110100 116
|
|
||||||
#define B01110100 116
|
|
||||||
#define B1110101 117
|
|
||||||
#define B01110101 117
|
|
||||||
#define B1110110 118
|
|
||||||
#define B01110110 118
|
|
||||||
#define B1110111 119
|
|
||||||
#define B01110111 119
|
|
||||||
#define B1111000 120
|
|
||||||
#define B01111000 120
|
|
||||||
#define B1111001 121
|
|
||||||
#define B01111001 121
|
|
||||||
#define B1111010 122
|
|
||||||
#define B01111010 122
|
|
||||||
#define B1111011 123
|
|
||||||
#define B01111011 123
|
|
||||||
#define B1111100 124
|
|
||||||
#define B01111100 124
|
|
||||||
#define B1111101 125
|
|
||||||
#define B01111101 125
|
|
||||||
#define B1111110 126
|
|
||||||
#define B01111110 126
|
|
||||||
#define B1111111 127
|
|
||||||
#define B01111111 127
|
|
||||||
#define B10000000 128
|
|
||||||
#define B10000001 129
|
|
||||||
#define B10000010 130
|
|
||||||
#define B10000011 131
|
|
||||||
#define B10000100 132
|
|
||||||
#define B10000101 133
|
|
||||||
#define B10000110 134
|
|
||||||
#define B10000111 135
|
|
||||||
#define B10001000 136
|
|
||||||
#define B10001001 137
|
|
||||||
#define B10001010 138
|
|
||||||
#define B10001011 139
|
|
||||||
#define B10001100 140
|
|
||||||
#define B10001101 141
|
|
||||||
#define B10001110 142
|
|
||||||
#define B10001111 143
|
|
||||||
#define B10010000 144
|
|
||||||
#define B10010001 145
|
|
||||||
#define B10010010 146
|
|
||||||
#define B10010011 147
|
|
||||||
#define B10010100 148
|
|
||||||
#define B10010101 149
|
|
||||||
#define B10010110 150
|
|
||||||
#define B10010111 151
|
|
||||||
#define B10011000 152
|
|
||||||
#define B10011001 153
|
|
||||||
#define B10011010 154
|
|
||||||
#define B10011011 155
|
|
||||||
#define B10011100 156
|
|
||||||
#define B10011101 157
|
|
||||||
#define B10011110 158
|
|
||||||
#define B10011111 159
|
|
||||||
#define B10100000 160
|
|
||||||
#define B10100001 161
|
|
||||||
#define B10100010 162
|
|
||||||
#define B10100011 163
|
|
||||||
#define B10100100 164
|
|
||||||
#define B10100101 165
|
|
||||||
#define B10100110 166
|
|
||||||
#define B10100111 167
|
|
||||||
#define B10101000 168
|
|
||||||
#define B10101001 169
|
|
||||||
#define B10101010 170
|
|
||||||
#define B10101011 171
|
|
||||||
#define B10101100 172
|
|
||||||
#define B10101101 173
|
|
||||||
#define B10101110 174
|
|
||||||
#define B10101111 175
|
|
||||||
#define B10110000 176
|
|
||||||
#define B10110001 177
|
|
||||||
#define B10110010 178
|
|
||||||
#define B10110011 179
|
|
||||||
#define B10110100 180
|
|
||||||
#define B10110101 181
|
|
||||||
#define B10110110 182
|
|
||||||
#define B10110111 183
|
|
||||||
#define B10111000 184
|
|
||||||
#define B10111001 185
|
|
||||||
#define B10111010 186
|
|
||||||
#define B10111011 187
|
|
||||||
#define B10111100 188
|
|
||||||
#define B10111101 189
|
|
||||||
#define B10111110 190
|
|
||||||
#define B10111111 191
|
|
||||||
#define B11000000 192
|
|
||||||
#define B11000001 193
|
|
||||||
#define B11000010 194
|
|
||||||
#define B11000011 195
|
|
||||||
#define B11000100 196
|
|
||||||
#define B11000101 197
|
|
||||||
#define B11000110 198
|
|
||||||
#define B11000111 199
|
|
||||||
#define B11001000 200
|
|
||||||
#define B11001001 201
|
|
||||||
#define B11001010 202
|
|
||||||
#define B11001011 203
|
|
||||||
#define B11001100 204
|
|
||||||
#define B11001101 205
|
|
||||||
#define B11001110 206
|
|
||||||
#define B11001111 207
|
|
||||||
#define B11010000 208
|
|
||||||
#define B11010001 209
|
|
||||||
#define B11010010 210
|
|
||||||
#define B11010011 211
|
|
||||||
#define B11010100 212
|
|
||||||
#define B11010101 213
|
|
||||||
#define B11010110 214
|
|
||||||
#define B11010111 215
|
|
||||||
#define B11011000 216
|
|
||||||
#define B11011001 217
|
|
||||||
#define B11011010 218
|
|
||||||
#define B11011011 219
|
|
||||||
#define B11011100 220
|
|
||||||
#define B11011101 221
|
|
||||||
#define B11011110 222
|
|
||||||
#define B11011111 223
|
|
||||||
#define B11100000 224
|
|
||||||
#define B11100001 225
|
|
||||||
#define B11100010 226
|
|
||||||
#define B11100011 227
|
|
||||||
#define B11100100 228
|
|
||||||
#define B11100101 229
|
|
||||||
#define B11100110 230
|
|
||||||
#define B11100111 231
|
|
||||||
#define B11101000 232
|
|
||||||
#define B11101001 233
|
|
||||||
#define B11101010 234
|
|
||||||
#define B11101011 235
|
|
||||||
#define B11101100 236
|
|
||||||
#define B11101101 237
|
|
||||||
#define B11101110 238
|
|
||||||
#define B11101111 239
|
|
||||||
#define B11110000 240
|
|
||||||
#define B11110001 241
|
|
||||||
#define B11110010 242
|
|
||||||
#define B11110011 243
|
|
||||||
#define B11110100 244
|
|
||||||
#define B11110101 245
|
|
||||||
#define B11110110 246
|
|
||||||
#define B11110111 247
|
|
||||||
#define B11111000 248
|
|
||||||
#define B11111001 249
|
|
||||||
#define B11111010 250
|
|
||||||
#define B11111011 251
|
|
||||||
#define B11111100 252
|
|
||||||
#define B11111101 253
|
|
||||||
#define B11111110 254
|
|
||||||
#define B11111111 255
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,14 +0,0 @@
|
|||||||
#include <WProgram.h>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
|
|
||||||
setup();
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
loop();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@@ -1,12 +0,0 @@
|
|||||||
int main(void)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
|
|
||||||
setup();
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
loop();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
pins_arduino.h - Pin definition functions for Arduino
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2007 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 14-108-2009 for attiny45 Saposoft
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Pins_Arduino_h
|
|
||||||
#define Pins_Arduino_h
|
|
||||||
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
|
|
||||||
#define NOT_A_PIN 0
|
|
||||||
#define NOT_A_PORT 0
|
|
||||||
|
|
||||||
#define NOT_ON_TIMER 0
|
|
||||||
#define TIMER0A 1
|
|
||||||
#define TIMER0B 2
|
|
||||||
#define TIMER1 3
|
|
||||||
|
|
||||||
//changed it to uint16_t to uint8_t
|
|
||||||
extern const uint8_t PROGMEM port_to_mode_PGM[];
|
|
||||||
extern const uint8_t PROGMEM port_to_input_PGM[];
|
|
||||||
extern const uint8_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[];
|
|
||||||
extern const uint8_t PROGMEM digital_pin_to_timer_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 digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
|
|
||||||
#define analogInPinToBit(P) (P)
|
|
||||||
// in the following lines modified pgm_read_word in pgm_read_byte, word doesn't work on attiny45
|
|
||||||
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_byte( port_to_output_PGM + (P))) )
|
|
||||||
#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_byte( port_to_input_PGM + (P))) )
|
|
||||||
#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_byte( port_to_mode_PGM + (P))) )
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,220 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring.c - Partial implementation of the Wiring API for the ATmega8.
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.c 585 2009-05-12 10:55:26Z dmellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 14-108-2009 for attiny45 Saposoft
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wiring_private.h"
|
|
||||||
|
|
||||||
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
|
|
||||||
// the overflow handler is called every 256 ticks.
|
|
||||||
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
|
|
||||||
|
|
||||||
// the whole number of milliseconds per timer0 overflow
|
|
||||||
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
|
|
||||||
|
|
||||||
// the fractional number of milliseconds per timer0 overflow. we shift right
|
|
||||||
// by three to fit these numbers into a byte. (for the clock speeds we care
|
|
||||||
// about - 8 and 16 MHz - this doesn't lose precision.)
|
|
||||||
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
|
|
||||||
#define FRACT_MAX (1000 >> 3)
|
|
||||||
|
|
||||||
volatile unsigned long timer0_overflow_count = 0;
|
|
||||||
volatile unsigned long timer0_millis = 0;
|
|
||||||
static unsigned char timer0_fract = 0;
|
|
||||||
|
|
||||||
//different name, TIMER0_OVF_vect to this
|
|
||||||
SIGNAL(TIM0_OVF_vect)
|
|
||||||
{
|
|
||||||
// copy these to local variables so they can be stored in registers
|
|
||||||
// (volatile variables must be read from memory on every access)
|
|
||||||
unsigned long m = timer0_millis;
|
|
||||||
unsigned char f = timer0_fract;
|
|
||||||
|
|
||||||
m += MILLIS_INC;
|
|
||||||
f += FRACT_INC;
|
|
||||||
if (f >= FRACT_MAX) {
|
|
||||||
f -= FRACT_MAX;
|
|
||||||
m += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
timer0_fract = f;
|
|
||||||
timer0_millis = m;
|
|
||||||
timer0_overflow_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long millis()
|
|
||||||
{
|
|
||||||
unsigned long m;
|
|
||||||
uint8_t oldSREG = SREG;
|
|
||||||
|
|
||||||
// disable interrupts while we read timer0_millis or we might get an
|
|
||||||
// inconsistent value (e.g. in the middle of a write to timer0_millis)
|
|
||||||
cli();
|
|
||||||
m = timer0_millis;
|
|
||||||
SREG = oldSREG;
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long micros() {
|
|
||||||
unsigned long m, t;
|
|
||||||
uint8_t oldSREG = SREG;
|
|
||||||
|
|
||||||
cli();
|
|
||||||
t = TCNT0;
|
|
||||||
|
|
||||||
#ifdef TIFR0
|
|
||||||
if ((TIFR0 & _BV(TOV0)) && (t == 0))
|
|
||||||
t = 256;
|
|
||||||
#else
|
|
||||||
if ((TIFR & _BV(TOV0)) && (t == 0))
|
|
||||||
t = 256;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m = timer0_overflow_count;
|
|
||||||
SREG = oldSREG;
|
|
||||||
|
|
||||||
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
|
|
||||||
}
|
|
||||||
|
|
||||||
void delay(unsigned long ms)
|
|
||||||
{
|
|
||||||
unsigned long start = millis();
|
|
||||||
|
|
||||||
while (millis() - start <= ms)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock.
|
|
||||||
* Disables interrupts, which will disrupt the millis() function if used
|
|
||||||
* too frequently. */
|
|
||||||
void delayMicroseconds(unsigned int us)
|
|
||||||
{
|
|
||||||
uint8_t oldSREG;
|
|
||||||
|
|
||||||
// calling avrlib's delay_us() function with low values (e.g. 1 or
|
|
||||||
// 2 microseconds) gives delays longer than desired.
|
|
||||||
//delay_us(us);
|
|
||||||
|
|
||||||
#if F_CPU >= 16000000L
|
|
||||||
// for the 16 MHz clock on most Arduino boards
|
|
||||||
|
|
||||||
// for a one-microsecond delay, simply return. the overhead
|
|
||||||
// of the function call yields a delay of approximately 1 1/8 us.
|
|
||||||
if (--us == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// the following loop takes a quarter of a microsecond (4 cycles)
|
|
||||||
// per iteration, so execute it four times for each microsecond of
|
|
||||||
// delay requested.
|
|
||||||
us <<= 2;
|
|
||||||
|
|
||||||
// account for the time taken in the preceeding commands.
|
|
||||||
us -= 2;
|
|
||||||
#else
|
|
||||||
// for the 8 MHz internal clock on the ATmega168
|
|
||||||
|
|
||||||
// for a one- or two-microsecond delay, simply return. the overhead of
|
|
||||||
// the function calls takes more than two microseconds. can't just
|
|
||||||
// subtract two, since us is unsigned; we'd overflow.
|
|
||||||
if (--us == 0)
|
|
||||||
return;
|
|
||||||
if (--us == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// the following loop takes half of a microsecond (4 cycles)
|
|
||||||
// per iteration, so execute it twice for each microsecond of
|
|
||||||
// delay requested.
|
|
||||||
us <<= 1;
|
|
||||||
|
|
||||||
// partially compensate for the time taken by the preceeding commands.
|
|
||||||
// we can't subtract any more than this or we'd overflow w/ small delays.
|
|
||||||
us--;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// disable interrupts, otherwise the timer 0 overflow interrupt that
|
|
||||||
// tracks milliseconds will make us delay longer than we want.
|
|
||||||
oldSREG = SREG;
|
|
||||||
cli();
|
|
||||||
|
|
||||||
// busy wait
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"1: sbiw %0,1" "\n\t" // 2 cycles
|
|
||||||
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
|
||||||
);
|
|
||||||
|
|
||||||
// reenable interrupts.
|
|
||||||
SREG = oldSREG;
|
|
||||||
}
|
|
||||||
|
|
||||||
void init()
|
|
||||||
{
|
|
||||||
// this needs to be called before setup() or some functions won't
|
|
||||||
// work there
|
|
||||||
sei();
|
|
||||||
|
|
||||||
/* dumpt everything, and only added the 2 timers the attiny has */
|
|
||||||
// on the ATmega168, timer 0 is also used for fast hardware pwm
|
|
||||||
// (using phase-correct PWM would mean that timer 0 overflowed half as often
|
|
||||||
// resulting in different millis() behavior on the ATmega8 and ATmega168)
|
|
||||||
sbi(TCCR0A, WGM01);
|
|
||||||
sbi(TCCR0A, WGM00);
|
|
||||||
// set timer 0 prescale factor to 64
|
|
||||||
// sbi(TCCR0B, CS02);
|
|
||||||
sbi(TCCR0B, CS01);
|
|
||||||
sbi(TCCR0B, CS00);
|
|
||||||
// enable timer 0 overflow interrupt
|
|
||||||
sbi(TIMSK, TOIE0);
|
|
||||||
|
|
||||||
// timers 1 are used for phase-correct hardware pwm
|
|
||||||
// this is better for motors as it ensures an even waveform
|
|
||||||
// note, however, that fast pwm mode can achieve a frequency of up
|
|
||||||
// 8 MHz (with a 16 MHz clock) at 50% duty cycle
|
|
||||||
// set timer 1 prescale factor to 64
|
|
||||||
sbi(TCCR1, CS11);
|
|
||||||
sbi(TCCR1, CS10);
|
|
||||||
sbi(TCCR1, PWM1A);
|
|
||||||
// put timer 1 in 8-bit phase correct pwm mode
|
|
||||||
// sbi(TCCR1, WGM10); non c'è nell attiny 45
|
|
||||||
|
|
||||||
// set a2d prescale factor to 128
|
|
||||||
// 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
|
|
||||||
// XXX: this will not work properly for other clock speeds, and
|
|
||||||
// this code should use F_CPU to determine the prescale factor.
|
|
||||||
/* added F_CPU prescaler */
|
|
||||||
#if F_CPU >= 16000000L //128
|
|
||||||
sbi(ADCSRA, ADPS2);
|
|
||||||
sbi(ADCSRA, ADPS1);
|
|
||||||
sbi(ADCSRA, ADPS0);
|
|
||||||
#elif F_CPU >= 8000000L //64
|
|
||||||
sbi(ADCSRA, ADPS2);
|
|
||||||
sbi(ADCSRA, ADPS1);
|
|
||||||
#else //8
|
|
||||||
sbi(ADCSRA, ADPS1);
|
|
||||||
sbi(ADCSRA, ADPS0);
|
|
||||||
#endif
|
|
||||||
// enable a2d conversions
|
|
||||||
sbi(ADCSRA, ADEN);
|
|
||||||
}
|
|
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring.h - Partial implementation of the Wiring API for the ATmega8.
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.h 602 2009-06-01 08:32:11Z dmellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 14-108-2009 for attiny45 Saposoft
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Wiring_h
|
|
||||||
#define Wiring_h
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include "binary.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ARDUINO
|
|
||||||
#define ARDUINO 18
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HIGH 0x1
|
|
||||||
#define LOW 0x0
|
|
||||||
|
|
||||||
#define INPUT 0x0
|
|
||||||
#define OUTPUT 0x1
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
// interrupts
|
|
||||||
// #define LOW 0x0
|
|
||||||
#define CHANGE 1
|
|
||||||
#define FALLING 2
|
|
||||||
#define RISING 3
|
|
||||||
// end interrupts
|
|
||||||
|
|
||||||
#define INTERNAL 3
|
|
||||||
#define DEFAULT 1
|
|
||||||
#define EXTERNAL 0
|
|
||||||
|
|
||||||
// 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 clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
|
|
||||||
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
|
|
||||||
#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
|
|
||||||
|
|
||||||
#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 init(void);
|
|
||||||
|
|
||||||
void pinMode(uint8_t, uint8_t);
|
|
||||||
void digitalWrite(uint8_t, uint8_t);
|
|
||||||
int digitalRead(uint8_t);
|
|
||||||
int analogRead(uint8_t);
|
|
||||||
void analogReference(uint8_t mode);
|
|
||||||
void analogWrite(uint8_t, int);
|
|
||||||
|
|
||||||
//No Serial to begin with
|
|
||||||
//void beginSerial(long);
|
|
||||||
//void serialWrite(unsigned char);
|
|
||||||
//int serialAvailable(void);
|
|
||||||
//int serialRead(void);
|
|
||||||
//void serialFlush(void);
|
|
||||||
|
|
||||||
unsigned long millis(void);
|
|
||||||
unsigned long micros(void);
|
|
||||||
void delay(unsigned long);
|
|
||||||
void delayMicroseconds(unsigned int us);
|
|
||||||
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
|
|
||||||
|
|
||||||
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val);
|
|
||||||
|
|
||||||
void attachInterrupt(uint8_t, void (*)(void), int mode);
|
|
||||||
void detachInterrupt(uint8_t);
|
|
||||||
|
|
||||||
void setup(void);
|
|
||||||
void loop(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring_analog.c - analog input and output
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 14-108-2009 for attiny45 Saposoft
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wiring_private.h"
|
|
||||||
#include "pins_arduino.h"
|
|
||||||
|
|
||||||
uint8_t analog_reference = DEFAULT;
|
|
||||||
|
|
||||||
void analogReference(uint8_t mode)
|
|
||||||
{
|
|
||||||
// can't actually set the register here because the default setting
|
|
||||||
// will connect AVCC and the AREF pin, which would cause a short if
|
|
||||||
// there's something connected to AREF.
|
|
||||||
analog_reference = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
int analogRead(uint8_t pin)
|
|
||||||
{
|
|
||||||
uint8_t low, high;
|
|
||||||
|
|
||||||
// set the analog reference (high two bits of ADMUX) and select the
|
|
||||||
// channel (low 4 bits). this also sets ADLAR (left-adjust result)
|
|
||||||
// to 0 (the default).
|
|
||||||
// ADMUX = (analog_reference << 6) | (pin & 0x3f); // more MUX
|
|
||||||
// sapo per tiny45
|
|
||||||
ADMUX = pin & 0x3f;
|
|
||||||
|
|
||||||
// without a delay, we seem to read from the wrong channel
|
|
||||||
//delay(1);
|
|
||||||
|
|
||||||
// start the conversion
|
|
||||||
sbi(ADCSRA, ADSC);
|
|
||||||
|
|
||||||
// ADSC is cleared when the conversion finishes
|
|
||||||
while (bit_is_set(ADCSRA, ADSC));
|
|
||||||
|
|
||||||
// we have to read ADCL first; doing so locks both ADCL
|
|
||||||
// and ADCH until ADCH is read. reading ADCL second would
|
|
||||||
// cause the results of each conversion to be discarded,
|
|
||||||
// as ADCL and ADCH would be locked when it completed.
|
|
||||||
low = ADCL;
|
|
||||||
high = ADCH;
|
|
||||||
|
|
||||||
// combine the two bytes
|
|
||||||
return (high << 8) | low;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right now, PWM output only works on the pins with
|
|
||||||
// hardware support. These are defined in the appropriate
|
|
||||||
// pins_*.c file. For the rest of the pins, we default
|
|
||||||
// to digital output.
|
|
||||||
void analogWrite(uint8_t pin, int val)
|
|
||||||
{
|
|
||||||
// We need to make sure the PWM output is enabled for those pins
|
|
||||||
// that support it, as we turn it off when digitally reading or
|
|
||||||
// writing with them. Also, make sure the pin is in output mode
|
|
||||||
// for consistenty with Wiring, which doesn't require a pinMode
|
|
||||||
// call for the analog output pins.
|
|
||||||
pinMode(pin, OUTPUT);
|
|
||||||
|
|
||||||
//Yep, only 2 PMW, Saposoft
|
|
||||||
|
|
||||||
if (digitalPinToTimer(pin) == TIMER0A) {
|
|
||||||
if (val == 0) {
|
|
||||||
digitalWrite(pin, LOW);
|
|
||||||
} else {
|
|
||||||
// connect pwm to pin on timer 0, channel A
|
|
||||||
sbi(TCCR0A, COM0A1);
|
|
||||||
// set pwm duty
|
|
||||||
OCR0A = val;
|
|
||||||
}
|
|
||||||
} else if (digitalPinToTimer(pin) == TIMER1) {
|
|
||||||
if (val == 0) {
|
|
||||||
digitalWrite(pin, LOW);
|
|
||||||
} else {
|
|
||||||
// connect pwm to pin on timer 0, channel B
|
|
||||||
sbi(TCCR1, COM1A1);
|
|
||||||
// set pwm duty
|
|
||||||
OCR1A = val;
|
|
||||||
}
|
|
||||||
} else if (val < 128)
|
|
||||||
digitalWrite(pin, LOW);
|
|
||||||
else
|
|
||||||
digitalWrite(pin, HIGH);
|
|
||||||
}
|
|
@@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring_digital.c - digital input and output functions
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
Modified 14-108-2009 for attiny45 Saposoft
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wiring_private.h"
|
|
||||||
#include "pins_arduino.h"
|
|
||||||
|
|
||||||
void pinMode(uint8_t pin, uint8_t mode)
|
|
||||||
{
|
|
||||||
uint8_t bit = digitalPinToBitMask(pin);
|
|
||||||
uint8_t port = digitalPinToPort(pin);
|
|
||||||
volatile uint8_t *reg;
|
|
||||||
|
|
||||||
if (port == NOT_A_PIN) return;
|
|
||||||
|
|
||||||
// JWS: can I let the optimizer do this?
|
|
||||||
reg = portModeRegister(port);
|
|
||||||
|
|
||||||
if (mode == INPUT) *reg &= ~bit;
|
|
||||||
else *reg |= bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forcing this inline keeps the callers from having to push their own stuff
|
|
||||||
// on the stack. It is a good performance win and only takes 1 more byte per
|
|
||||||
// user than calling. (It will take more bytes on the 168.)
|
|
||||||
//
|
|
||||||
// But shouldn't this be moved into pinMode? Seems silly to check and do on
|
|
||||||
// each digitalread or write.
|
|
||||||
//
|
|
||||||
//Only 2 PWM's
|
|
||||||
static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
|
|
||||||
static inline void turnOffPWM(uint8_t timer)
|
|
||||||
{
|
|
||||||
if (timer == TIMER1) cbi(TCCR1, COM1A1);
|
|
||||||
if (timer == TIMER1) cbi(TCCR1, COM1B1);
|
|
||||||
if (timer == TIMER0A) cbi(TCCR0A, COM0A1);
|
|
||||||
if (timer == TIMER0B) cbi(TCCR0A, COM0B1);
|
|
||||||
if (timer == TIMER0A) cbi(TCCR0A, COM0A0);
|
|
||||||
if (timer == TIMER0B) cbi(TCCR0A, COM0B0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void digitalWrite(uint8_t pin, uint8_t val)
|
|
||||||
{
|
|
||||||
uint8_t timer = digitalPinToTimer(pin);
|
|
||||||
uint8_t bit = digitalPinToBitMask(pin);
|
|
||||||
uint8_t port = digitalPinToPort(pin);
|
|
||||||
volatile uint8_t *out;
|
|
||||||
|
|
||||||
if (port == NOT_A_PIN) return;
|
|
||||||
|
|
||||||
// If the pin that support PWM output, we need to turn it off
|
|
||||||
// before doing a digital write.
|
|
||||||
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
|
|
||||||
|
|
||||||
out = portOutputRegister(port);
|
|
||||||
|
|
||||||
if (val == LOW) *out &= ~bit;
|
|
||||||
else *out |= bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
int digitalRead(uint8_t pin)
|
|
||||||
{
|
|
||||||
uint8_t timer = digitalPinToTimer(pin);
|
|
||||||
uint8_t bit = digitalPinToBitMask(pin);
|
|
||||||
uint8_t port = digitalPinToPort(pin);
|
|
||||||
|
|
||||||
if (port == NOT_A_PIN) return LOW;
|
|
||||||
|
|
||||||
// If the pin that support PWM output, we need to turn it off
|
|
||||||
// before getting a digital reading.
|
|
||||||
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
|
|
||||||
|
|
||||||
if (*portInputRegister(port) & bit) return HIGH;
|
|
||||||
return LOW;
|
|
||||||
}
|
|
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring_private.h - Internal header file.
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.h 239 2007-01-12 17:58:39Z mellis $
|
|
||||||
|
|
||||||
Modified 28-08-2009 for attiny84 R.Wiersma
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef WiringPrivate_h
|
|
||||||
#define WiringPrivate_h
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <avr/delay.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "wiring.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef cbi
|
|
||||||
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
|
||||||
#endif
|
|
||||||
#ifndef sbi
|
|
||||||
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Who needs more interrupts?
|
|
||||||
#define EXTERNAL_INT_0 0
|
|
||||||
|
|
||||||
#define EXTERNAL_NUM_INTERRUPTS 1
|
|
||||||
|
|
||||||
typedef void (*voidFuncPtr)(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring_pulse.c - pulseIn() function
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wiring_private.h"
|
|
||||||
#include "pins_arduino.h"
|
|
||||||
|
|
||||||
/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH
|
|
||||||
* or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds
|
|
||||||
* to 3 minutes in length, but must be called at least a few dozen microseconds
|
|
||||||
* before the start of the pulse. */
|
|
||||||
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
|
|
||||||
{
|
|
||||||
// cache the port and bit of the pin in order to speed up the
|
|
||||||
// pulse width measuring loop and achieve finer resolution. calling
|
|
||||||
// digitalRead() instead yields much coarser resolution.
|
|
||||||
uint8_t bit = digitalPinToBitMask(pin);
|
|
||||||
uint8_t port = digitalPinToPort(pin);
|
|
||||||
uint8_t stateMask = (state ? bit : 0);
|
|
||||||
unsigned long width = 0; // keep initialization out of time critical area
|
|
||||||
|
|
||||||
// convert the timeout from microseconds to a number of times through
|
|
||||||
// the initial loop; it takes 16 clock cycles per iteration.
|
|
||||||
unsigned long numloops = 0;
|
|
||||||
unsigned long maxloops = microsecondsToClockCycles(timeout) / 16;
|
|
||||||
|
|
||||||
// wait for any previous pulse to end
|
|
||||||
while ((*portInputRegister(port) & bit) == stateMask)
|
|
||||||
if (numloops++ == maxloops)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// wait for the pulse to start
|
|
||||||
while ((*portInputRegister(port) & bit) != stateMask)
|
|
||||||
if (numloops++ == maxloops)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// wait for the pulse to stop
|
|
||||||
while ((*portInputRegister(port) & bit) == stateMask)
|
|
||||||
width++;
|
|
||||||
|
|
||||||
// convert the reading to microseconds. The loop has been determined
|
|
||||||
// to be 10 clock cycles long and have about 16 clocks between the edge
|
|
||||||
// and the start of the loop. There will be some error introduced by
|
|
||||||
// the interrupt handlers.
|
|
||||||
return clockCyclesToMicroseconds(width * 10 + 16);
|
|
||||||
}
|
|
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
wiring_shift.c - shiftOut() function
|
|
||||||
Part of Arduino - http://www.arduino.cc/
|
|
||||||
|
|
||||||
Copyright (c) 2005-2006 David A. Mellis
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General
|
|
||||||
Public License along with this library; if not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wiring_private.h"
|
|
||||||
|
|
||||||
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
if (bitOrder == LSBFIRST)
|
|
||||||
digitalWrite(dataPin, !!(val & (1 << i)));
|
|
||||||
else
|
|
||||||
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
|
|
||||||
|
|
||||||
digitalWrite(clockPin, HIGH);
|
|
||||||
digitalWrite(clockPin, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user