Created
December 3, 2014 07:39
-
-
Save snt/b2fd6bad1d50f7c858f3 to your computer and use it in GitHub Desktop.
ATmega328P + XBee-zb sends ZigBee message to coordinator (simple test).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define F_CPU 8000000UL | |
#include <avr/io.h> | |
#include <util/delay.h> | |
#include <stdint.h> | |
#define _BAUD 9600 | |
#define RX_BUFF 10 | |
void initUART() { | |
DDRD |= _BV(PD1); | |
DDRD &= ~_BV(PD0); | |
uint16_t rate = (F_CPU / _BAUD / 16) - 1; | |
UBRR0H = (rate >> 8) & 0xF00; | |
UBRR0L = (uint8_t) ((rate) & 0xFF);; | |
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); | |
UCSR0B = _BV(RXEN0) | _BV(TXEN0); | |
} | |
/*! \brief Returns a byte from the serial buffer | |
* Use this function if the RX interrupt is not enabled. | |
* Returns 0 on empty buffer | |
*/ | |
uint8_t getByte(void) | |
{ | |
// Check to see if something was received | |
while (!(UCSR0A & _BV(RXC0))) { | |
} | |
return (uint8_t) UDR0; | |
} | |
/*! \brief Transmits a byte | |
* Use this function if the TX interrupt is not enabled. | |
* Blocks the serial port while TX completes | |
*/ | |
void putByte(unsigned char data) | |
{ | |
// Stay here until data buffer is empty | |
while (!(UCSR0A & _BV(UDRE0))) { | |
} | |
UDR0 = (unsigned char) data; | |
} | |
/*! \brief Writes an ASCII string to the TX buffer */ | |
void writeData(char *str, int size) | |
{ | |
for (int i = 0; i<size; i++){ | |
putByte(*str); | |
++str; | |
} | |
} | |
const char* readData(void) | |
{ | |
static char rxstr[RX_BUFF]; | |
static char* temp; | |
temp = rxstr; | |
while((*temp = getByte()) != '\n') { | |
++temp; | |
} | |
return rxstr; | |
} | |
int main (void) | |
{ | |
DDRB |= _BV(DDB0); | |
char xs[] = { | |
0x7E, | |
0x00, 0x14, | |
0x10, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, | |
0x00, | |
0x00, | |
0x00, | |
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, | |
0xE0 | |
}; | |
initUART(); | |
while(1) { | |
PORTB ^= _BV(PB0); | |
writeData(xs, sizeof(xs)); | |
_delay_ms(1000); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Name: Makefile | |
# Author: <insert your name here> | |
# Copyright: <insert your copyright message here> | |
# License: <insert your license reference here> | |
# This is a prototype Makefile. Modify it according to your needs. | |
# You should at least check the settings for | |
# DEVICE ....... The AVR device you compile for | |
# CLOCK ........ Target AVR clock rate in Hertz | |
# OBJECTS ...... The object files created from your source files. This list is | |
# usually the same as the list of source files with suffix ".o". | |
# PROGRAMMER ... Options to avrdude which define the hardware you use for | |
# uploading to the AVR and the interface where this hardware | |
# is connected. We recommend that you leave it undefined and | |
# add settings like this to your ~/.avrduderc file: | |
# default_programmer = "stk500v2" | |
# default_serial = "avrdoper" | |
# FUSES ........ Parameters for avrdude to flash the fuses appropriately. | |
DEVICE = atmega328p | |
CLOCK = 8000000 | |
PROGRAMMER = -c avrispmkII -P usb #-c stk500v2 -P avrdoper | |
OBJECTS = main.o | |
FUSES = -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m # -U efuse:w:0xff:m | |
# http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p | |
# ATMega8 fuse bits used above (fuse bits for other devices are different!): | |
# Example for 8 MHz internal oscillator | |
# Fuse high byte: | |
# 0xd9 = 1 1 0 1 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) | |
# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 | |
# | | | | | +-------- BOOTSZ1 | |
# | | | | +---------- EESAVE (set to 0 to preserve EEPROM over chip erase) | |
# | | | +-------------- CKOPT (clock option, depends on oscillator type) | |
# | | +---------------- SPIEN (if set to 1, serial programming is disabled) | |
# | +------------------ WDTON (if set to 0, watchdog is always on) | |
# +-------------------- RSTDISBL (if set to 0, RESET pin is disabled) | |
# Fuse low byte: | |
# 0x24 = 0 0 1 0 0 1 0 0 | |
# ^ ^ \ / \--+--/ | |
# | | | +------- CKSEL 3..0 (8M internal RC) | |
# | | +--------------- SUT 1..0 (slowly rising power) | |
# | +------------------ BODEN (if 0, brown-out detector is enabled) | |
# +-------------------- BODLEVEL (if 0: 4V, if 1: 2.7V) | |
# | |
# For computing fuse byte values for other devices and options see | |
# the fuse bit calculator at http://www.engbedded.com/fusecalc/ | |
# Tune the lines below only if you know what you are doing: | |
AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE) | |
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -std=c99 | |
# symbolic targets: | |
all: main.hex | |
.c.o: | |
$(COMPILE) -c $< -o $@ | |
.S.o: | |
$(COMPILE) -x assembler-with-cpp -c $< -o $@ | |
# "-x assembler-with-cpp" should not be necessary since this is the default | |
# file type for the .S (with capital S) extension. However, upper case | |
# characters are not always preserved on Windows. To ensure WinAVR | |
# compatibility define the file type manually. | |
.c.s: | |
$(COMPILE) -S $< -o $@ | |
flash: all | |
$(AVRDUDE) -U flash:w:main.hex:i | |
fuse: | |
$(AVRDUDE) $(FUSES) | |
# Xcode uses the Makefile targets "", "clean" and "install" | |
install: flash fuse | |
# if you use a bootloader, change the command below appropriately: | |
load: all | |
bootloadHID main.hex | |
clean: | |
rm -f main.hex main.elf $(OBJECTS) | |
# file targets: | |
main.elf: $(OBJECTS) | |
$(COMPILE) -o main.elf $(OBJECTS) | |
main.hex: main.elf | |
rm -f main.hex | |
avr-objcopy -j .text -j .data -O ihex main.elf main.hex | |
avr-size --format=avr --mcu=$(DEVICE) main.elf | |
# If you have an EEPROM section, you must also create a hex file for the | |
# EEPROM and add it to the "flash" target. | |
# Targets for code debugging and analysis: | |
disasm: main.elf | |
avr-objdump -d main.elf | |
cpp: | |
$(COMPILE) -E main.c |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment