@@ -0,0 +1 @@ | |||
*.o |
@@ -0,0 +1,196 @@ | |||
##########------------------------------------------------------########## | |||
########## Project-specific Details ########## | |||
########## Check these every time you start a new project ########## | |||
##########------------------------------------------------------########## | |||
MCU = atmega168 | |||
F_CPU = 1000000UL | |||
BAUD = 9600UL | |||
## Also try BAUD = 19200 or 38400 if you're feeling lucky. | |||
## A directory for common include files and the simple USART library. | |||
## If you move either the current folder or the Library folder, you'll | |||
## need to change this path to match. | |||
LIBDIR = ../../AVR-Programming-Library | |||
##########------------------------------------------------------########## | |||
########## Programmer Defaults ########## | |||
########## Set up once, then forget about it ########## | |||
########## (Can override. See bottom of file.) ########## | |||
##########------------------------------------------------------########## | |||
PROGRAMMER_TYPE = usbtiny | |||
# extra arguments to avrdude: baud rate, chip type, -F flag, etc. | |||
PROGRAMMER_ARGS = | |||
##########------------------------------------------------------########## | |||
########## Program Locations ########## | |||
########## Won't need to change if they're in your PATH ########## | |||
##########------------------------------------------------------########## | |||
CC = avr-gcc | |||
OBJCOPY = avr-objcopy | |||
OBJDUMP = avr-objdump | |||
AVRSIZE = avr-size | |||
AVRDUDE = avrdude | |||
##########------------------------------------------------------########## | |||
########## Makefile Magic! ########## | |||
########## Summary: ########## | |||
########## We want a .hex file ########## | |||
########## Compile source files into .elf ########## | |||
########## Convert .elf file into .hex ########## | |||
########## You shouldn't need to edit below. ########## | |||
##########------------------------------------------------------########## | |||
## The name of your project (without the .c) | |||
# TARGET = blinkLED | |||
## Or name it automatically after the enclosing directory | |||
TARGET = $(lastword $(subst /, ,$(CURDIR))) | |||
# Object files: will find all .c/.h files in current directory | |||
# and in LIBDIR. If you have any other (sub-)directories with code, | |||
# you can add them in to SOURCES below in the wildcard statement. | |||
SOURCES=$(wildcard *.c $(LIBDIR)/*.c) | |||
OBJECTS=$(SOURCES:.c=.o) | |||
HEADERS=$(SOURCES:.c=.h) | |||
## Compilation options, type man avr-gcc if you're curious. | |||
CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) | |||
CFLAGS = -Os -g -std=gnu99 -Wall | |||
## Use short (8-bit) data types | |||
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums | |||
## Splits up object files per function | |||
CFLAGS += -ffunction-sections -fdata-sections | |||
LDFLAGS = -Wl,-Map,$(TARGET).map | |||
## Optional, but often ends up with smaller code | |||
LDFLAGS += -Wl,--gc-sections | |||
## Relax shrinks code even more, but makes disassembly messy | |||
## LDFLAGS += -Wl,--relax | |||
## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf | |||
## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf | |||
TARGET_ARCH = -mmcu=$(MCU) | |||
## Explicit pattern rules: | |||
## To make .o files from .c files | |||
%.o: %.c $(HEADERS) Makefile | |||
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; | |||
$(TARGET).elf: $(OBJECTS) | |||
$(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ | |||
%.hex: %.elf | |||
$(OBJCOPY) -j .text -j .data -O ihex $< $@ | |||
%.eeprom: %.elf | |||
$(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ | |||
%.lst: %.elf | |||
$(OBJDUMP) -S $< > $@ | |||
## These targets don't have files named after them | |||
.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses | |||
all: $(TARGET).hex | |||
debug: | |||
@echo | |||
@echo "Source files:" $(SOURCES) | |||
@echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) | |||
@echo | |||
# Optionally create listing file from .elf | |||
# This creates approximate assembly-language equivalent of your code. | |||
# Useful for debugging time-sensitive bits, | |||
# or making sure the compiler does what you want. | |||
disassemble: $(TARGET).lst | |||
disasm: disassemble | |||
# Optionally show how big the resulting program is | |||
size: $(TARGET).elf | |||
$(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf | |||
clean: | |||
rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ | |||
$(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ | |||
$(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ | |||
$(TARGET).eeprom | |||
squeaky_clean: | |||
rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom | |||
##########------------------------------------------------------########## | |||
########## Programmer-specific details ########## | |||
########## Flashing code to AVR using avrdude ########## | |||
##########------------------------------------------------------########## | |||
flash: $(TARGET).hex | |||
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< | |||
## An alias | |||
program: flash | |||
flash_eeprom: $(TARGET).eeprom | |||
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< | |||
avrdude_terminal: | |||
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt | |||
## If you've got multiple programmers that you use, | |||
## you can define them here so that it's easy to switch. | |||
## To invoke, use something like `make flash_arduinoISP` | |||
flash_usbtiny: PROGRAMMER_TYPE = usbtiny | |||
flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments | |||
flash_usbtiny: flash | |||
flash_usbasp: PROGRAMMER_TYPE = usbasp | |||
flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments | |||
flash_usbasp: flash | |||
flash_arduinoISP: PROGRAMMER_TYPE = avrisp | |||
flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 | |||
## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 | |||
flash_arduinoISP: flash | |||
flash_109: PROGRAMMER_TYPE = avr109 | |||
flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 | |||
flash_109: flash | |||
##########------------------------------------------------------########## | |||
########## Fuse settings and suitable defaults ########## | |||
##########------------------------------------------------------########## | |||
## Mega 48, 88, 168, 328 default values | |||
LFUSE = 0x62 | |||
HFUSE = 0xdf | |||
EFUSE = 0x00 | |||
## Generic | |||
FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m | |||
fuses: | |||
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ | |||
$(PROGRAMMER_ARGS) $(FUSE_STRING) | |||
show_fuses: | |||
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv | |||
## Called with no extra definitions, sets to defaults | |||
set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m | |||
set_default_fuses: fuses | |||
## Set the fuse byte for full-speed mode | |||
## Note: can also be set in firmware for modern chips | |||
set_fast_fuse: LFUSE = 0xE2 | |||
set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m | |||
set_fast_fuse: fuses | |||
## Set the EESAVE fuse byte to preserve EEPROM across flashes | |||
set_eeprom_save_fuse: HFUSE = 0xD7 | |||
set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m | |||
set_eeprom_save_fuse: fuses | |||
## Clear the EESAVE fuse byte | |||
clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m | |||
clear_eeprom_save_fuse: fuses |
@@ -0,0 +1,60 @@ | |||
:100000000C9434000C9451000C9451000C94510049 | |||
:100010000C9451000C94A8000C9451000C945100C5 | |||
:100020000C9451000C9451000C9451000C9451000C | |||
:100030000C9451000C9451000C9451000C945100FC | |||
:100040000C9451000C9451000C9451000C945100EC | |||
:100050000C9451000C9451000C9451000C945100DC | |||
:100060000C9451000C94510011241FBECFEFD4E02A | |||
:10007000DEBFCDBF11E0A0E0B1E0E0EEF2E002C0F3 | |||
:1000800005900D92AC3CB107D9F721E0ACECB1E0A2 | |||
:1000900001C01D92A13DB207E1F70E9417010C9427 | |||
:1000A0006E010C9400001092C5008CE08093C40097 | |||
:1000B000E0ECF0E080818260808388E18093C10081 | |||
:1000C00086E08093C20008959091C00095FFFCCF18 | |||
:1000D0008093C60008958091C00087FFFCCF809177 | |||
:1000E000C60008950F931F93CF938C01C0E0F801D1 | |||
:1000F000EC0FF11D8081811104C0CF911F910F91F0 | |||
:1001000008950E946400CF5FF2CF0F931F93CF93A7 | |||
:10011000DF93C0E3D0E310E30E946B00082F0E943E | |||
:1001200064000D3089F4105380ED8C0F94E6199F14 | |||
:10013000800D1124D0539AE0D99F800D1124DF91B6 | |||
:10014000CF911F910F9108951D2FDC2FC02FE4CF69 | |||
:100150001F920F920FB60F9211242F933F934F933C | |||
:100160005F936F937F938F939F93AF93BF93EF931F | |||
:10017000FF93289B24C0289810920101109200013F | |||
:1001800080E090E02091CE013091CF01821793075B | |||
:100190000CF11092CD011092CC01DA9AFF91EF91FF | |||
:1001A000BF91AF919F918F917F916F915F914F918F | |||
:1001B0003F912F910F900FBE0F901F90189581E0E7 | |||
:1001C00090E0909301018093000182E091E00E9411 | |||
:1001D0007200D6CFE3ECF9E03197F1F700C00000F0 | |||
:1001E0000196D0CF81E291E00E9472000E948500CA | |||
:1001F0008093D0010E946B008091D00181508630A5 | |||
:1002000088F708958AE591E00E9472000E948500B7 | |||
:1002100090E09093CF018093CE010E946B0080917B | |||
:10022000CE019091CF01893C910560F708958091AE | |||
:100230007C00806480937C0080917A00846080934D | |||
:100240007A0080917A00806880937A0080916800BB | |||
:1002500084608093680080916D00846080936D005D | |||
:1002600085B7806185BF78940E9453008EE991E044 | |||
:100270000E947200209A0E94F2000E940201C1E0D6 | |||
:10028000D0E0809100019091010118161906CCF779 | |||
:1002900080917A00806480937A0080917A0086FD54 | |||
:1002A000FCCF8091780090917900880F892F881F6A | |||
:1002B000990B91959091D001981718F78091CC01E6 | |||
:1002C0009091CD01892BE9F6289A80EC91E00E946B | |||
:1002D0007200D093CD01C093CC01D3CFF894FFCF5F | |||
:1002E0000100596F7527726520616C6C207365740D | |||
:1002F00021204F666620746F20736C656570210A3B | |||
:1003000000576861742073656E73697469766974E7 | |||
:100310007920646F20796F752077616E742069741D | |||
:1003200020746F2062653F20285363616C65206FE5 | |||
:10033000662031202D2036290A00486F77206C6F07 | |||
:100340006E6720646F20796F752077616E742074FA | |||
:1003500068652064656C617920746F2062653F2058 | |||
:100360002831203D2031306D732C205363616C6542 | |||
:10037000206F662030202D20323030290A002D2DAC | |||
:100380002D2D2053756E7269736520416C61726DFD | |||
:1003900020436C6F636B202D2D2D2D2D2D0D0A000C | |||
:0C03A00057414B455550212121210A00F6 | |||
:00000001FF |
@@ -0,0 +1,554 @@ | |||
Archive member included to satisfy reference by file (symbol) | |||
/usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
USART.o (__udivmodqi4) | |||
/usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
USART.o (__udivmodhi4) | |||
/usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
/usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o (exit) | |||
/usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
sunlightAlarmClock.o (__do_copy_data) | |||
/usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
sunlightAlarmClock.o (__do_clear_bss) | |||
Allocating common symbols | |||
Common symbol size file | |||
delay 0x2 sunlightAlarmClock.o | |||
sensitivity 0x1 sunlightAlarmClock.o | |||
Discarded input sections | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.text 0x0000000000000000 0x0 USART.o | |||
.data 0x0000000000000000 0x0 USART.o | |||
.bss 0x0000000000000000 0x0 USART.o | |||
.text.readString | |||
0x0000000000000000 0x58 USART.o | |||
.text.printByte | |||
0x0000000000000000 0x32 USART.o | |||
.text.printWord | |||
0x0000000000000000 0x76 USART.o | |||
.text.printBinaryByte | |||
0x0000000000000000 0x44 USART.o | |||
.text.nibbleToHexCharacter | |||
0x0000000000000000 0xc USART.o | |||
.text.printHexByte | |||
0x0000000000000000 0x1e USART.o | |||
.text 0x0000000000000000 0x0 sunlightAlarmClock.o | |||
.data 0x0000000000000000 0x0 sunlightAlarmClock.o | |||
.bss 0x0000000000000000 0x0 sunlightAlarmClock.o | |||
.text 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.stab 0x0000000000000000 0xe4 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
0xf0 (size before relaxing) | |||
.text.libgcc.mul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc.div | |||
0x0000000000000000 0x18 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc.prologue | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc.builtins | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc.fmul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text.libgcc.fixed | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodqi4.o) | |||
.text 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.stab 0x0000000000000000 0x15c /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
0x168 (size before relaxing) | |||
.text.libgcc.mul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc.div | |||
0x0000000000000000 0x28 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc.prologue | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc.builtins | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc.fmul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text.libgcc.fixed | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_udivmodhi4.o) | |||
.text 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.mul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.div | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.prologue | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.builtins | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.fmul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text.libgcc.fixed | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
.text 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.mul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.div | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.prologue | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.builtins | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.fmul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text.libgcc.fixed | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
.text 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.data 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.bss 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.mul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.div | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc 0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.prologue | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.builtins | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.fmul | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
.text.libgcc.fixed | |||
0x0000000000000000 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
Memory Configuration | |||
Name Origin Length Attributes | |||
text 0x0000000000000000 0x0000000000020000 xr | |||
data 0x0000000000800060 0x000000000000ffa0 rw !x | |||
eeprom 0x0000000000810000 0x0000000000010000 rw !x | |||
fuse 0x0000000000820000 0x0000000000000400 rw !x | |||
lock 0x0000000000830000 0x0000000000000400 rw !x | |||
signature 0x0000000000840000 0x0000000000000400 rw !x | |||
user_signatures 0x0000000000850000 0x0000000000000400 rw !x | |||
*default* 0x0000000000000000 0xffffffffffffffff | |||
Linker script and memory map | |||
Address of section .data set to 0x800100 | |||
LOAD /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
LOAD USART.o | |||
LOAD sunlightAlarmClock.o | |||
START GROUP | |||
LOAD /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a | |||
LOAD /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/libm.a | |||
LOAD /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/libc.a | |||
LOAD /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/libatmega168.a | |||
END GROUP | |||
0x0000000000020000 __TEXT_REGION_LENGTH__ = DEFINED (__TEXT_REGION_LENGTH__)?__TEXT_REGION_LENGTH__:0x20000 | |||
0x000000000000ffa0 __DATA_REGION_LENGTH__ = DEFINED (__DATA_REGION_LENGTH__)?__DATA_REGION_LENGTH__:0xffa0 | |||
0x0000000000010000 __EEPROM_REGION_LENGTH__ = DEFINED (__EEPROM_REGION_LENGTH__)?__EEPROM_REGION_LENGTH__:0x10000 | |||
0x0000000000000400 __FUSE_REGION_LENGTH__ = DEFINED (__FUSE_REGION_LENGTH__)?__FUSE_REGION_LENGTH__:0x400 | |||
0x0000000000000400 __LOCK_REGION_LENGTH__ = DEFINED (__LOCK_REGION_LENGTH__)?__LOCK_REGION_LENGTH__:0x400 | |||
0x0000000000000400 __SIGNATURE_REGION_LENGTH__ = DEFINED (__SIGNATURE_REGION_LENGTH__)?__SIGNATURE_REGION_LENGTH__:0x400 | |||
0x0000000000000400 __USER_SIGNATURE_REGION_LENGTH__ = DEFINED (__USER_SIGNATURE_REGION_LENGTH__)?__USER_SIGNATURE_REGION_LENGTH__:0x400 | |||
.hash | |||
*(.hash) | |||
.dynsym | |||
*(.dynsym) | |||
.dynstr | |||
*(.dynstr) | |||
.gnu.version | |||
*(.gnu.version) | |||
.gnu.version_d | |||
*(.gnu.version_d) | |||
.gnu.version_r | |||
*(.gnu.version_r) | |||
.rel.init | |||
*(.rel.init) | |||
.rela.init | |||
*(.rela.init) | |||
.rel.text | |||
*(.rel.text) | |||
*(.rel.text.*) | |||
*(.rel.gnu.linkonce.t*) | |||
.rela.text | |||
*(.rela.text) | |||
*(.rela.text.*) | |||
*(.rela.gnu.linkonce.t*) | |||
.rel.fini | |||
*(.rel.fini) | |||
.rela.fini | |||
*(.rela.fini) | |||
.rel.rodata | |||
*(.rel.rodata) | |||
*(.rel.rodata.*) | |||
*(.rel.gnu.linkonce.r*) | |||
.rela.rodata | |||
*(.rela.rodata) | |||
*(.rela.rodata.*) | |||
*(.rela.gnu.linkonce.r*) | |||
.rel.data | |||
*(.rel.data) | |||
*(.rel.data.*) | |||
*(.rel.gnu.linkonce.d*) | |||
.rela.data | |||
*(.rela.data) | |||
*(.rela.data.*) | |||
*(.rela.gnu.linkonce.d*) | |||
.rel.ctors | |||
*(.rel.ctors) | |||
.rela.ctors | |||
*(.rela.ctors) | |||
.rel.dtors | |||
*(.rel.dtors) | |||
.rela.dtors | |||
*(.rela.dtors) | |||
.rel.got | |||
*(.rel.got) | |||
.rela.got | |||
*(.rela.got) | |||
.rel.bss | |||
*(.rel.bss) | |||
.rela.bss | |||
*(.rela.bss) | |||
.rel.plt | |||
*(.rel.plt) | |||
.rela.plt | |||
*(.rela.plt) | |||
.text 0x0000000000000000 0x2e0 | |||
*(.vectors) | |||
.vectors 0x0000000000000000 0x68 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
0x0000000000000000 __vectors | |||
0x0000000000000000 __vector_default | |||
*(.vectors) | |||
*(.progmem.gcc*) | |||
0x0000000000000068 . = ALIGN (0x2) | |||
0x0000000000000068 __trampolines_start = . | |||
*(.trampolines) | |||
.trampolines 0x0000000000000068 0x0 linker stubs | |||
*(.trampolines*) | |||
0x0000000000000068 __trampolines_end = . | |||
*libprintf_flt.a:*(.progmem.data) | |||
*libc.a:*(.progmem.data) | |||
*(.progmem*) | |||
0x0000000000000068 . = ALIGN (0x2) | |||
*(.jumptables) | |||
*(.jumptables*) | |||
*(.lowtext) | |||
*(.lowtext*) | |||
0x0000000000000068 __ctors_start = . | |||
*(.ctors) | |||
0x0000000000000068 __ctors_end = . | |||
0x0000000000000068 __dtors_start = . | |||
*(.dtors) | |||
0x0000000000000068 __dtors_end = . | |||
SORT(*)(.ctors) | |||
SORT(*)(.dtors) | |||
*(.init0) | |||
.init0 0x0000000000000068 0x0 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
0x0000000000000068 __init | |||
*(.init0) | |||
*(.init1) | |||
*(.init1) | |||
*(.init2) | |||
.init2 0x0000000000000068 0xc /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
*(.init2) | |||
*(.init3) | |||
*(.init3) | |||
*(.init4) | |||
.init4 0x0000000000000074 0x16 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
0x0000000000000074 __do_copy_data | |||
.init4 0x000000000000008a 0x10 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
0x000000000000008a __do_clear_bss | |||
*(.init4) | |||
*(.init5) | |||
*(.init5) | |||
*(.init6) | |||
*(.init6) | |||
*(.init7) | |||
*(.init7) | |||
*(.init8) | |||
*(.init8) | |||
*(.init9) | |||
.init9 0x000000000000009a 0x8 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
*(.init9) | |||
*(.text) | |||
.text 0x00000000000000a2 0x4 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
0x00000000000000a2 __vector_20 | |||
0x00000000000000a2 __vector_1 | |||
0x00000000000000a2 __vector_24 | |||
0x00000000000000a2 __vector_12 | |||
0x00000000000000a2 __bad_interrupt | |||
0x00000000000000a2 __vector_6 | |||
0x00000000000000a2 __vector_3 | |||
0x00000000000000a2 __vector_23 | |||
0x00000000000000a2 __vector_25 | |||
0x00000000000000a2 __vector_11 | |||
0x00000000000000a2 __vector_13 | |||
0x00000000000000a2 __vector_17 | |||
0x00000000000000a2 __vector_19 | |||
0x00000000000000a2 __vector_7 | |||
0x00000000000000a2 __vector_4 | |||
0x00000000000000a2 __vector_9 | |||
0x00000000000000a2 __vector_2 | |||
0x00000000000000a2 __vector_21 | |||
0x00000000000000a2 __vector_15 | |||
0x00000000000000a2 __vector_8 | |||
0x00000000000000a2 __vector_14 | |||
0x00000000000000a2 __vector_10 | |||
0x00000000000000a2 __vector_16 | |||
0x00000000000000a2 __vector_18 | |||
0x00000000000000a2 __vector_22 | |||
0x00000000000000a6 . = ALIGN (0x2) | |||
*(.text.*) | |||
.text.initUSART | |||
0x00000000000000a6 0x22 USART.o | |||
0x00000000000000a6 initUSART | |||
.text.transmitByte | |||
0x00000000000000c8 0xe USART.o | |||
0x00000000000000c8 transmitByte | |||
.text.receiveByte | |||
0x00000000000000d6 0xe USART.o | |||
0x00000000000000d6 receiveByte | |||
.text.printString | |||
0x00000000000000e4 0x26 USART.o | |||
0x00000000000000e4 printString | |||
.text.getNumber | |||
0x000000000000010a 0x46 USART.o | |||
0x000000000000010a getNumber | |||
.text.__vector_5 | |||
0x0000000000000150 0x94 sunlightAlarmClock.o | |||
0x0000000000000150 __vector_5 | |||
.text.setSensitivity | |||
0x00000000000001e4 0x20 sunlightAlarmClock.o | |||
0x00000000000001e4 setSensitivity | |||
.text.setDelay | |||
0x0000000000000204 0x2a sunlightAlarmClock.o | |||
0x0000000000000204 setDelay | |||
.text.startup.main | |||
0x000000000000022e 0xae sunlightAlarmClock.o | |||
0x000000000000022e main | |||
0x00000000000002dc . = ALIGN (0x2) | |||
*(.fini9) | |||
.fini9 0x00000000000002dc 0x0 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
0x00000000000002dc exit | |||
0x00000000000002dc _exit | |||
*(.fini9) | |||
*(.fini8) | |||
*(.fini8) | |||
*(.fini7) | |||
*(.fini7) | |||
*(.fini6) | |||
*(.fini6) | |||
*(.fini5) | |||
*(.fini5) | |||
*(.fini4) | |||
*(.fini4) | |||
*(.fini3) | |||
*(.fini3) | |||
*(.fini2) | |||
*(.fini2) | |||
*(.fini1) | |||
*(.fini1) | |||
*(.fini0) | |||
.fini0 0x00000000000002dc 0x4 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
*(.fini0) | |||
0x00000000000002e0 _etext = . | |||
.data 0x0000000000800100 0xcc load address 0x00000000000002e0 | |||
0x0000000000800100 PROVIDE (__data_start, .) | |||
*(.data) | |||
*(.data*) | |||
.data.enabled 0x0000000000800100 0x2 sunlightAlarmClock.o | |||
0x0000000000800100 enabled | |||
*(.rodata) | |||
*(.rodata*) | |||
.rodata.__vector_5.str1.1 | |||
0x0000000000800102 0x1f sunlightAlarmClock.o | |||
.rodata.setSensitivity.str1.1 | |||
0x0000000000800121 0x39 sunlightAlarmClock.o | |||
.rodata.setDelay.str1.1 | |||
0x000000000080015a 0x44 sunlightAlarmClock.o | |||
.rodata.main.str1.1 | |||
0x000000000080019e 0x2e sunlightAlarmClock.o | |||
*(.gnu.linkonce.d*) | |||
0x00000000008001cc . = ALIGN (0x2) | |||
0x00000000008001cc _edata = . | |||
0x00000000008001cc PROVIDE (__data_end, .) | |||
.bss 0x00000000008001cc 0x5 | |||
0x00000000008001cc PROVIDE (__bss_start, .) | |||
*(.bss) | |||
*(.bss*) | |||
.bss.printed 0x00000000008001cc 0x2 sunlightAlarmClock.o | |||
0x00000000008001cc printed | |||
*(COMMON) | |||
COMMON 0x00000000008001ce 0x3 sunlightAlarmClock.o | |||
0x00000000008001ce delay | |||
0x00000000008001d0 sensitivity | |||
0x00000000008001d1 PROVIDE (__bss_end, .) | |||
0x00000000000002e0 __data_load_start = LOADADDR (.data) | |||
0x00000000000003ac __data_load_end = (__data_load_start + SIZEOF (.data)) | |||
.noinit 0x00000000008001d1 0x0 | |||
[!provide] PROVIDE (__noinit_start, .) | |||
*(.noinit*) | |||
[!provide] PROVIDE (__noinit_end, .) | |||
0x00000000008001d1 _end = . | |||
[!provide] PROVIDE (__heap_start, .) | |||
.eeprom 0x0000000000810000 0x0 | |||
*(.eeprom*) | |||
0x0000000000810000 __eeprom_end = . | |||
.fuse | |||
*(.fuse) | |||
*(.lfuse) | |||
*(.hfuse) | |||
*(.efuse) | |||
.lock | |||
*(.lock*) | |||
.signature | |||
*(.signature*) | |||
.stab 0x0000000000000000 0xfcc | |||
*(.stab) | |||
.stab 0x0000000000000000 0x750 USART.o | |||
0xa98 (size before relaxing) | |||
.stab 0x0000000000000750 0x684 sunlightAlarmClock.o | |||
0x84c (size before relaxing) | |||
.stab 0x0000000000000dd4 0x6c /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_exit.o) | |||
0x78 (size before relaxing) | |||
.stab 0x0000000000000e40 0xd8 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_copy_data.o) | |||
0xe4 (size before relaxing) | |||
.stab 0x0000000000000f18 0xb4 /usr/local/lib/gcc/avr/6.2.0/avr5/libgcc.a(_clear_bss.o) | |||
0xc0 (size before relaxing) | |||
.stabstr 0x0000000000000000 0x113c | |||
*(.stabstr) | |||
.stabstr 0x0000000000000000 0x113c USART.o | |||
.stab.excl | |||
*(.stab.excl) | |||
.stab.exclstr | |||
*(.stab.exclstr) | |||
.stab.index | |||
*(.stab.index) | |||
.stab.indexstr | |||
*(.stab.indexstr) | |||
.comment 0x0000000000000000 0x11 | |||
*(.comment) | |||
.comment 0x0000000000000000 0x11 USART.o | |||
0x12 (size before relaxing) | |||
.comment 0x0000000000000011 0x12 sunlightAlarmClock.o | |||
.note.gnu.avr.deviceinfo | |||
0x0000000000000000 0x3c | |||
.note.gnu.avr.deviceinfo | |||
0x0000000000000000 0x3c /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.note.gnu.build-id | |||
*(.note.gnu.build-id) | |||
.debug | |||
*(.debug) | |||
.line | |||
*(.line) | |||
.debug_srcinfo | |||
*(.debug_srcinfo) | |||
.debug_sfnames | |||
*(.debug_sfnames) | |||
.debug_aranges | |||
*(.debug_aranges) | |||
.debug_pubnames | |||
*(.debug_pubnames) | |||
.debug_info 0x0000000000000000 0x5f4 | |||
*(.debug_info .gnu.linkonce.wi.*) | |||
.debug_info 0x0000000000000000 0x5f4 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.debug_abbrev 0x0000000000000000 0x5a2 | |||
*(.debug_abbrev) | |||
.debug_abbrev 0x0000000000000000 0x5a2 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.debug_line 0x0000000000000000 0x1d | |||
*(.debug_line .debug_line.* .debug_line_end) | |||
.debug_line 0x0000000000000000 0x1d /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.debug_frame | |||
*(.debug_frame) | |||
.debug_str 0x0000000000000000 0x208 | |||
*(.debug_str) | |||
.debug_str 0x0000000000000000 0x208 /usr/local/lib/gcc/avr/6.2.0/../../../../avr/lib/avr5/crtatmega168.o | |||
.debug_loc | |||
*(.debug_loc) | |||
.debug_macinfo | |||
*(.debug_macinfo) | |||
.debug_weaknames | |||
*(.debug_weaknames) | |||
.debug_funcnames | |||
*(.debug_funcnames) | |||
.debug_typenames | |||
*(.debug_typenames) | |||
.debug_varnames | |||
*(.debug_varnames) | |||
.debug_pubtypes | |||
*(.debug_pubtypes) | |||
.debug_ranges | |||
*(.debug_ranges) | |||
.debug_macro | |||
*(.debug_macro) | |||
OUTPUT(Project.elf elf32-avr) | |||
LOAD linker stubs |
@@ -0,0 +1,137 @@ | |||
/* | |||
Quick and dirty functions that make serial communications work. | |||
Note that receiveByte() blocks -- it sits and waits _forever_ for | |||
a byte to come in. If you're doing anything that's more interesting, | |||
you'll want to implement this with interrupts. | |||
initUSART requires BAUDRATE to be defined in order to calculate | |||
the bit-rate multiplier. 9600 is a reasonable default. | |||
May not work with some of the older chips: | |||
Tiny2313, Mega8, Mega16, Mega32 have different pin macros | |||
If you're using these chips, see (e.g.) iom8.h for how it's done. | |||
These old chips don't specify UDR0 vs UDR1. | |||
Correspondingly, the macros will just be defined as UDR. | |||
*/ | |||
#include <avr/io.h> | |||
#include "USART.h" | |||
#include <util/setbaud.h> | |||
void initUSART(void) { /* requires BAUD */ | |||
UBRR0H = UBRRH_VALUE; /* defined in setbaud.h */ | |||
UBRR0L = UBRRL_VALUE; | |||
#if USE_2X | |||
UCSR0A |= (1 << U2X0); | |||
#else | |||
UCSR0A &= ~(1 << U2X0); | |||
#endif | |||
/* Enable USART transmitter/receiver */ | |||
UCSR0B = (1 << TXEN0) | (1 << RXEN0); | |||
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, 1 stop bit */ | |||
} | |||
void transmitByte(uint8_t data) { | |||
/* Wait for empty transmit buffer */ | |||
loop_until_bit_is_set(UCSR0A, UDRE0); | |||
UDR0 = data; /* send data */ | |||
} | |||
uint8_t receiveByte(void) { | |||
loop_until_bit_is_set(UCSR0A, RXC0); /* Wait for incoming data */ | |||
return UDR0; /* return register value */ | |||
} | |||
/* Here are a bunch of useful printing commands */ | |||
void printString(const char myString[]) { | |||
uint8_t i = 0; | |||
while (myString[i]) { | |||
transmitByte(myString[i]); | |||
i++; | |||
} | |||
} | |||
void readString(char myString[], uint8_t maxLength) { | |||
char response; | |||
uint8_t i; | |||
i = 0; | |||
while (i < (maxLength - 1)) { /* prevent over-runs */ | |||
response = receiveByte(); | |||
transmitByte(response); /* echo */ | |||
if (response == '\r') { /* enter marks the end */ | |||
break; | |||
} | |||
else { | |||
myString[i] = response; /* add in a letter */ | |||
i++; | |||
} | |||
} | |||
myString[i] = 0; /* terminal NULL character */ | |||
} | |||
void printByte(uint8_t byte) { | |||
/* Converts a byte to a string of decimal text, sends it */ | |||
transmitByte('0' + (byte / 100)); /* Hundreds */ | |||
transmitByte('0' + ((byte / 10) % 10)); /* Tens */ | |||
transmitByte('0' + (byte % 10)); /* Ones */ | |||
} | |||
void printWord(uint16_t word) { | |||
transmitByte('0' + (word / 10000)); /* Ten-thousands */ | |||
transmitByte('0' + ((word / 1000) % 10)); /* Thousands */ | |||
transmitByte('0' + ((word / 100) % 10)); /* Hundreds */ | |||
transmitByte('0' + ((word / 10) % 10)); /* Tens */ | |||
transmitByte('0' + (word % 10)); /* Ones */ | |||
} | |||
void printBinaryByte(uint8_t byte) { | |||
/* Prints out a byte as a series of 1's and 0's */ | |||
uint8_t bit; | |||
for (bit = 7; bit < 255; bit--) { | |||
if (bit_is_set(byte, bit)) | |||
transmitByte('1'); | |||
else | |||
transmitByte('0'); | |||
} | |||
} | |||
char nibbleToHexCharacter(uint8_t nibble) { | |||
/* Converts 4 bits into hexadecimal */ | |||
if (nibble < 10) { | |||
return ('0' + nibble); | |||
} | |||
else { | |||
return ('A' + nibble - 10); | |||
} | |||
} | |||
void printHexByte(uint8_t byte) { | |||
/* Prints a byte as its hexadecimal equivalent */ | |||
uint8_t nibble; | |||
nibble = (byte & 0b11110000) >> 4; | |||
transmitByte(nibbleToHexCharacter(nibble)); | |||
nibble = byte & 0b00001111; | |||
transmitByte(nibbleToHexCharacter(nibble)); | |||
} | |||
uint8_t getNumber(void) { | |||
// Gets a numerical 0-255 from the serial port. | |||
// Converts from string to number. | |||
char hundreds = '0'; | |||
char tens = '0'; | |||
char ones = '0'; | |||
char thisChar = '0'; | |||
do { /* shift over */ | |||
hundreds = tens; | |||
tens = ones; | |||
ones = thisChar; | |||
thisChar = receiveByte(); /* get a new character */ | |||
transmitByte(thisChar); /* echo */ | |||
} while (thisChar != '\r'); /* until type return */ | |||
return (100 * (hundreds - '0') + 10 * (tens - '0') + ones - '0'); | |||
} |
@@ -0,0 +1,45 @@ | |||
/* Functions to initialize, send, receive over USART | |||
initUSART requires BAUD to be defined in order to calculate | |||
the bit-rate multiplier. | |||
*/ | |||
#ifndef BAUD /* if not defined in Makefile... */ | |||
#define BAUD 9600 /* set a safe default baud rate */ | |||
#endif | |||
/* These are defined for convenience */ | |||
#define USART_HAS_DATA bit_is_set(UCSR0A, RXC0) | |||
#define USART_READY bit_is_set(UCSR0A, UDRE0) | |||
/* Takes the defined BAUD and F_CPU, | |||
calculates the bit-clock multiplier, | |||
and configures the hardware USART */ | |||
void initUSART(void); | |||
/* Blocking transmit and receive functions. | |||
When you call receiveByte() your program will hang until | |||
data comes through. We'll improve on this later. */ | |||
void transmitByte(uint8_t data); | |||
uint8_t receiveByte(void); | |||
void printString(const char myString[]); | |||
/* Utility function to transmit an entire string from RAM */ | |||
void readString(char myString[], uint8_t maxLength); | |||
/* Define a string variable, pass it to this function | |||
The string will contain whatever you typed over serial */ | |||
void printByte(uint8_t byte); | |||
/* Prints a byte out as its 3-digit ascii equivalent */ | |||
void printWord(uint16_t word); | |||
/* Prints a word (16-bits) out as its 5-digit ascii equivalent */ | |||
void printBinaryByte(uint8_t byte); | |||
/* Prints a byte out in 1s and 0s */ | |||
char nibbleToHex(uint8_t nibble); | |||
char nibbleToHexCharacter(uint8_t nibble); | |||
void printHexByte(uint8_t byte); | |||
/* Prints a byte out in hexadecimal */ | |||
uint8_t getNumber(void); | |||
/* takes in up to three ascii digits, | |||
converts them to a byte when press enter */ |
@@ -0,0 +1,91 @@ | |||
// --------------- | |||
// Pin Defines | |||
// --------------- | |||
#define LED_PORT PORTB | |||
#define LED_PIN PINB | |||
#define LED_DDR DDRB | |||
#define LED0 PB0 | |||
#define LED1 PB1 | |||
#define LED2 PB2 | |||
#define LED3 PB3 | |||
#define LED4 PB4 | |||
#define LED5 PB5 | |||
#define LED6 PB6 | |||
#define LED7 PB7 | |||
#define BUTTON_PORT PORTD | |||
#define BUTTON_PIN PIND | |||
#define BUTTON_DDR DDRD | |||
#define BUTTON PD2 | |||
#define BUTTON2 PD3 | |||
#define BUTTON3 PD4 | |||
#define SPEAKER PD6 /* OC0A */ | |||
#define SPEAKER_PORT PORTD | |||
#define SPEAKER_PIN PIND | |||
#define SPEAKER_DDR DDRD | |||
#define ANTENNA PD5 /* OC0B */ | |||
#define ANTENNA_PORT PORTD | |||
#define ANTENNA_PIN PIND | |||
#define ANTENNA_DDR DDRD | |||
#define MODULATION PD3 /* OC2B */ | |||
#define MODULATION_PORT PORTD | |||
#define MODULATION_PIN PIND | |||
#define MODULATION_DDR DDRD | |||
#define LIGHT_SENSOR PC0 /* ADC0 */ | |||
#define LIGHT_SENSOR_PORT PORTC | |||
#define LIGHT_SENSOR_PIN PINC | |||
#define LIGHT_SENSOR_DDR DDRC | |||
#define CAP_SENSOR PC1 /* ADC1 */ | |||
#define CAP_SENSOR_PORT PORTC | |||
#define CAP_SENSOR_PIN PINC | |||
#define CAP_SENSOR_DDR DDRC | |||
#define PIEZO PC2 /* ADC2 */ | |||
#define PIEZO_PORT PORTC | |||
#define PIEZO_PIN PINC | |||
#define PIEZO_DDR DDRC | |||
#define POT PC3 /* ADC3 */ | |||
#define POT_PORT PORTC | |||
#define POT_PIN PINC | |||
#define POT_DDR DDRC | |||
// SPI and I2C serial mode defines | |||
#define SPI_SS PB2 | |||
#define SPI_SS_PORT PORTB | |||
#define SPI_SS_PIN PINB | |||
#define SPI_SS_DDR DDRB | |||
#define SPI_MOSI PB3 | |||
#define SPI_MOSI_PORT PORTB | |||
#define SPI_MOSI_PIN PINB | |||
#define SPI_MOSI_DDR DDRB | |||
#define SPI_MISO PB4 | |||
#define SPI_MISO_PORT PORTB | |||
#define SPI_MISO_PIN PINB | |||
#define SPI_MISO_DDR DDRB | |||
#define SPI_SCK PB5 | |||
#define SPI_SCK_PORT PORTB | |||
#define SPI_SCK_PIN PINB | |||
#define SPI_SCK_DDR DDRB | |||
#define I2C_SDA PC4 | |||
#define I2C_SDA_PORT PORTC | |||
#define I2C_SDA_PIN PINC | |||
#define I2C_SDA_DDR DDRC | |||
#define I2C_SCL PC5 | |||
#define I2C_SCL_PORT PORTC | |||
#define I2C_SCL_PIN PINC | |||
#define I2C_SCL_DDR DDRC |
@@ -0,0 +1,155 @@ | |||
/* Sunrise Alarm Clock */ | |||
//Including required libraries | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <avr/interrupt.h> | |||
#include "USART.h" | |||
#include "pinDefines.h" | |||
//Defining buzzer related ports | |||
#define ABuzz PB0 | |||
#define ABuzz_DDR DDRB | |||
#define ABuzz_PORT PORTB | |||
//Defining bit changer for buzzer | |||
#define setBit(sfr, bit) (_SFR_BYTE(sfr) |= (1 << bit)) | |||
#define clearBit(sfr, bit) (_SFR_BYTE(sfr) &= ~(1 << bit)) | |||
#define toggleBit(sfr, bit) (_SFR_BYTE(sfr) ^= (1 << bit)) | |||
//Declaring and initializing global variables | |||
volatile int enabled = 1; | |||
int printed = 0; | |||
uint8_t sensitivity; | |||
int delay; | |||
void setSensitivity(); | |||
void setDelay(); | |||
//Button interrupt | |||
ISR(PCINT2_vect) | |||
{ | |||
//Check if it the alarm is on | |||
if (bit_is_set(ABuzz_PORT, ABuzz)) | |||
{ | |||
//Turn the buzzer off | |||
clearBit(ABuzz_PORT, ABuzz); | |||
//Stop the loop | |||
enabled = 0; | |||
} | |||
else | |||
{ | |||
/* I found this to be too annoying personally so I decided to comment it out | |||
//Ask user if to reset sensitivity | |||
printString("Would you like to reset the sensor's sensitivity? (Yes = 1)\n"); | |||
uint8_t toReset = getNumber(); | |||
receiveByte(); | |||
if (toReset == 1) { setSensitivity(); } | |||
//Ask user if to reset delay | |||
printString("Would you like to reset the interrupt's delay? (Yes = 1)\n"); | |||
toReset = getNumber(); | |||
receiveByte(); | |||
if (toReset == 1) { setDelay(); } | |||
*/ | |||
//Set and print success message | |||
enabled = 1; | |||
printString("You're all set! Off to sleep!\n"); | |||
} | |||
/* Attempted to use delay to skip the second interrupt input but it didn't | |||
work as I hoped. So I decided to embrace it as a feature instead. | |||
*/ | |||
//Delay between interrupts to turn off alarm | |||
for(int i = 0; i < delay; i++) | |||
{ | |||
_delay_ms(10); | |||
} | |||
//Reset the sensor to run again | |||
printed = 0; | |||
PCIFR |= (1 << PCIF2); | |||
} | |||
int main(void) | |||
{ | |||
//Setting up for light sensor | |||
ADMUX |= (1 << REFS0); | |||
ADCSRA |= (1 << ADPS2); | |||
ADCSRA |= (1 << ADEN); | |||
//Setting up the button interrupt | |||
PCICR |= (1 << PCIE2); | |||
PCMSK2 |= (1 << PD2); | |||
MCUCR |= (1 << PUD); | |||
sei(); | |||
//Initializing USART | |||
initUSART(); | |||
//Print title to string | |||
printString("---- Sunrise Alarm Clock ------\r\n"); | |||
//Declaring variables | |||
uint16_t adcValue; | |||
uint8_t brightness; | |||
//Initialize buzzer | |||
setBit(ABuzz_DDR, ABuzz); | |||
setSensitivity(); | |||
setDelay(); | |||
//Main Loop | |||
while (1) | |||
{ | |||
if (enabled > 0) | |||
{ | |||
//Start ADC conversion | |||
ADCSRA |= (1 << ADSC); | |||
//Wait for the conversion to complete | |||
loop_until_bit_is_clear(ADCSRA, ADSC); | |||
//Get the ADC value | |||
adcValue = ADC; | |||
//Map it into a scale of 7 | |||
brightness = (adcValue >> 7); | |||
//Check if the light is brighter than the selected sensitivity | |||
if (brightness > sensitivity) | |||
{ | |||
if (printed == 0) | |||
{ | |||
setBit(ABuzz_PORT, ABuzz); | |||
printString("WAKEUP!!!!\n"); | |||
printed = 1; | |||
} | |||
} | |||
} | |||
} | |||
return 0; | |||
} | |||
void setSensitivity() | |||
{ | |||
do | |||
{ | |||
//Get sensitivity input from user | |||
printString("What sensitivity do you want it to be? (Scale of 1 - 6)\n"); | |||
sensitivity = getNumber(); | |||
receiveByte(); | |||
} while (sensitivity > 6 || sensitivity < 1); | |||
} | |||
void setDelay() | |||
{ | |||
do | |||
{ | |||
//Get delay input from user | |||
printString("How long do you want the delay to be? (1 = 10ms, Scale of 0 - 200)\n"); | |||
delay = getNumber(); | |||
receiveByte(); | |||
} while (delay > 200 || delay < 0); | |||
} |