From 74f17bf353b9fb6835e1f3f8f8560fee13cb6e8b Mon Sep 17 00:00:00 2001 From: WarL0ck Date: Mon, 9 Dec 2013 21:14:43 +0700 Subject: [PATCH] restore --- Rmodule/Rmodule.aps | 2 +- Rmodule/nrf24l01/nRF24L01.h | 130 ++++++ Rmodule/nrf24l01/nrf24.c | 351 ++++++++++++++ Rmodule/nrf24l01/nrf24.h | 116 +++++ Rmodule/nrf24l01/radioPinFunctions.c | 80 ++++ Rmodule/rmodule.aws | 2 +- Smodule/Smodule.aps | 1 + Smodule/default/Makefile | 89 ++++ Smodule/main.c | 123 +++++ Smodule/nrf24l01/nRF24L01.h | 130 ++++++ Smodule/nrf24l01/nrf24.c | 351 ++++++++++++++ Smodule/nrf24l01/nrf24.h | 116 +++++ Smodule/nrf24l01/radioPinFunctions.c | 80 ++++ Smodule/res/strings.h | 17 + Smodule/smodule.aws | 1 + Smodule/uart/uart.c | 663 +++++++++++++++++++++++++++ Smodule/uart/uart.h | 195 ++++++++ Smodule/uart/uart_addon.c | 118 +++++ Smodule/uart/uart_addon.h | 121 +++++ 19 files changed, 2684 insertions(+), 2 deletions(-) create mode 100644 Rmodule/nrf24l01/nRF24L01.h create mode 100644 Rmodule/nrf24l01/nrf24.c create mode 100644 Rmodule/nrf24l01/nrf24.h create mode 100644 Rmodule/nrf24l01/radioPinFunctions.c create mode 100644 Smodule/Smodule.aps create mode 100644 Smodule/default/Makefile create mode 100644 Smodule/main.c create mode 100644 Smodule/nrf24l01/nRF24L01.h create mode 100644 Smodule/nrf24l01/nrf24.c create mode 100644 Smodule/nrf24l01/nrf24.h create mode 100644 Smodule/nrf24l01/radioPinFunctions.c create mode 100644 Smodule/res/strings.h create mode 100644 Smodule/smodule.aws create mode 100644 Smodule/uart/uart.c create mode 100644 Smodule/uart/uart.h create mode 100644 Smodule/uart/uart_addon.c create mode 100644 Smodule/uart/uart_addon.h diff --git a/Rmodule/Rmodule.aps b/Rmodule/Rmodule.aps index a232a43..669788f 100755 --- a/Rmodule/Rmodule.aps +++ b/Rmodule/Rmodule.aps @@ -1 +1 @@ -Rmodule14-Nov-2013 11:48:5708-Dec-2013 20:52:55241014-Nov-2013 11:48:5744, 19, 0, 730AVR GCCdefault\Rmodule.elfC:\Hard\Git\Rmodule\AVR SimulatorATmega8.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cC:\Hard\Git\Rmodule\nrf24l01\radioPinFunctions.cC:\Hard\Git\Rmodule\nrf24l01\nrf24.cC:\Hard\Git\Rmodule\nrf24l01\nRF24L01.hC:\Hard\Git\Rmodule\nrf24l01\nrf24.hdefault\Rmodule.lssdefault\Rmodule.mapdefaultNOatmega8111Rmodule.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\avr-gcc.exeC:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\make.exeC:\Hard\Git\Rmodule\nrf24l01\nRF24L01.hC:\Hard\Git\Rmodule\nrf24l01\nrf24.hC:\Hard\Git\Rmodule\main.cC:\Hard\Git\Rmodule\nrf24l01\radioPinFunctions.cC:\Hard\Git\Rmodule\nrf24l01\nrf24.c00000main.c1 +Rmodule14-Nov-2013 11:48:5709-Dec-2013 21:08:58241014-Nov-2013 11:48:5744, 19, 0, 730AVR GCCdefault\Rmodule.elfc:\Hard\Git\Rmodule\AVR SimulatorATmega8.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cC:\Hard\Git\Rmodule\nrf24l01\radioPinFunctions.cC:\Hard\Git\Rmodule\nrf24l01\nrf24.cC:\Hard\Git\Rmodule\nrf24l01\nRF24L01.hC:\Hard\Git\Rmodule\nrf24l01\nrf24.hdefault\Rmodule.lssdefault\Rmodule.mapdefaultNOatmega8111Rmodule.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\avr-gcc.exeC:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\make.exeC:\Hard\Git\Rmodule\nrf24l01\nRF24L01.hC:\Hard\Git\Rmodule\nrf24l01\nrf24.hc:\Hard\Git\Rmodule\main.cC:\Hard\Git\Rmodule\nrf24l01\radioPinFunctions.cC:\Hard\Git\Rmodule\nrf24l01\nrf24.c00000main.c1 diff --git a/Rmodule/nrf24l01/nRF24L01.h b/Rmodule/nrf24l01/nRF24L01.h new file mode 100644 index 0000000..6ec69fe --- /dev/null +++ b/Rmodule/nrf24l01/nRF24L01.h @@ -0,0 +1,130 @@ +/* + Copyright (c) 2007 Stefan Engelke + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + $Id$ +*/ + +/* Memory Map */ +#define CONFIG 0x00 +#define EN_AA 0x01 +#define EN_RXADDR 0x02 +#define SETUP_AW 0x03 +#define SETUP_RETR 0x04 +#define RF_CH 0x05 +#define RF_SETUP 0x06 +#define STATUS 0x07 +#define OBSERVE_TX 0x08 +#define CD 0x09 +#define RX_ADDR_P0 0x0A +#define RX_ADDR_P1 0x0B +#define RX_ADDR_P2 0x0C +#define RX_ADDR_P3 0x0D +#define RX_ADDR_P4 0x0E +#define RX_ADDR_P5 0x0F +#define TX_ADDR 0x10 +#define RX_PW_P0 0x11 +#define RX_PW_P1 0x12 +#define RX_PW_P2 0x13 +#define RX_PW_P3 0x14 +#define RX_PW_P4 0x15 +#define RX_PW_P5 0x16 +#define FIFO_STATUS 0x17 +#define DYNPD 0x1C + +/* Bit Mnemonics */ + +/* configuratio nregister */ +#define MASK_RX_DR 6 +#define MASK_TX_DS 5 +#define MASK_MAX_RT 4 +#define EN_CRC 3 +#define CRCO 2 +#define PWR_UP 1 +#define PRIM_RX 0 + +/* enable auto acknowledgment */ +#define ENAA_P5 5 +#define ENAA_P4 4 +#define ENAA_P3 3 +#define ENAA_P2 2 +#define ENAA_P1 1 +#define ENAA_P0 0 + +/* enable rx addresses */ +#define ERX_P5 5 +#define ERX_P4 4 +#define ERX_P3 3 +#define ERX_P2 2 +#define ERX_P1 1 +#define ERX_P0 0 + +/* setup of address width */ +#define AW 0 /* 2 bits */ + +/* setup of auto re-transmission */ +#define ARD 4 /* 4 bits */ +#define ARC 0 /* 4 bits */ + +/* RF setup register */ +#define PLL_LOCK 4 +#define RF_DR 3 +#define RF_PWR 1 /* 2 bits */ + +/* general status register */ +#define RX_DR 6 +#define TX_DS 5 +#define MAX_RT 4 +#define RX_P_NO 1 /* 3 bits */ +#define TX_FULL 0 + +/* transmit observe register */ +#define PLOS_CNT 4 /* 4 bits */ +#define ARC_CNT 0 /* 4 bits */ + +/* fifo status */ +#define TX_REUSE 6 +#define FIFO_FULL 5 +#define TX_EMPTY 4 +#define RX_FULL 1 +#define RX_EMPTY 0 + +/* dynamic length */ +#define DPL_P0 0 +#define DPL_P1 1 +#define DPL_P2 2 +#define DPL_P3 3 +#define DPL_P4 4 +#define DPL_P5 5 + +/* Instruction Mnemonics */ +#define R_REGISTER 0x00 /* last 4 bits will indicate reg. address */ +#define W_REGISTER 0x20 /* last 4 bits will indicate reg. address */ +#define REGISTER_MASK 0x1F +#define R_RX_PAYLOAD 0x61 +#define W_TX_PAYLOAD 0xA0 +#define FLUSH_TX 0xE1 +#define FLUSH_RX 0xE2 +#define REUSE_TX_PL 0xE3 +#define ACTIVATE 0x50 +#define R_RX_PL_WID 0x60 +#define NOP 0xFF diff --git a/Rmodule/nrf24l01/nrf24.c b/Rmodule/nrf24l01/nrf24.c new file mode 100644 index 0000000..fd96818 --- /dev/null +++ b/Rmodule/nrf24l01/nrf24.c @@ -0,0 +1,351 @@ +/* +* ---------------------------------------------------------------------------- +* “THE COFFEEWARE LICENSE” (Revision 1): +* wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* This library is based on this library: +* https://github.com/aaronds/arduino-nrf24l01 +* Which is based on this library: +* http://www.tinkerer.eu/AVRLib/nRF24L01 +* ----------------------------------------------------------------------------- +*/ +#include "nrf24.h" + +uint8_t payload_len; + +/* init the hardware pins */ +void nrf24_init() +{ + nrf24_setupPins(); + nrf24_ce_digitalWrite(LOW); + nrf24_csn_digitalWrite(HIGH); +} + +/* configure the module */ +void nrf24_config(uint8_t channel, uint8_t pay_length) +{ + /* Use static payload length ... */ + payload_len = pay_length; + + // Set RF channel + nrf24_configRegister(RF_CH,channel); + + // Set length of incoming payload + nrf24_configRegister(RX_PW_P0, 0x00); // Auto-ACK pipe ... + nrf24_configRegister(RX_PW_P1, payload_len); // Data payload pipe + nrf24_configRegister(RX_PW_P2, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P3, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P4, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P5, 0x00); // Pipe not used + + // 1 Mbps, TX gain: 0dbm + nrf24_configRegister(RF_SETUP, (0< wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* This library is based on this library: +* https://github.com/aaronds/arduino-nrf24l01 +* Which is based on this library: +* http://www.tinkerer.eu/AVRLib/nRF24L01 +* ----------------------------------------------------------------------------- +*/ +#ifndef NRF24 +#define NRF24 + +#include "nRF24L01.h" +#include + +#define LOW 0 +#define HIGH 1 + +#define nrf24_ADDR_LEN 5 +#define nrf24_CONFIG ((1< Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_ce_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 CE pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_csn_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 SCK pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_sck_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 MOSI pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_mosi_digitalWrite(uint8_t state); + +/* -----------------------------------------*/ +/* nrf24 MISO pin read function */ +/* - returns: Non-zero if the pin is high */ +/* -----------------------------------------*/ +extern uint8_t nrf24_miso_digitalRead(); + +#endif diff --git a/Rmodule/nrf24l01/radioPinFunctions.c b/Rmodule/nrf24l01/radioPinFunctions.c new file mode 100644 index 0000000..311528b --- /dev/null +++ b/Rmodule/nrf24l01/radioPinFunctions.c @@ -0,0 +1,80 @@ +/* +* ---------------------------------------------------------------------------- +* “THE COFFEEWARE LICENSE” (Revision 1): +* wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* Please define your platform spesific functions in this file ... +* ----------------------------------------------------------------------------- +*/ + +#include + +#define set_bit(reg,bit) reg |= (1< + diff --git a/Smodule/Smodule.aps b/Smodule/Smodule.aps new file mode 100644 index 0000000..2b8ea54 --- /dev/null +++ b/Smodule/Smodule.aps @@ -0,0 +1 @@ +Smodule04-Dec-2013 09:22:0908-Dec-2013 13:26:42241004-Dec-2013 09:22:0944, 19, 0, 730AVR GCCdefault\Smodule.elfc:\Hard\Git\Smodule\AVR SimulatorATmega8.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cuart\uart_addon.cuart\uart.cnrf24l01\nrf24.cnrf24l01\radioPinFunctions.cres\strings.huart\uart.huart\uart_addon.hnrf24l01\nrf24.hnrf24l01\nRF24L01.hdefault\Smodule.lssdefault\Smodule.mapdefaultNOatmega8111Smodule.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\avr-gcc.exeC:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin\make.exec:\Hard\Git\Smodule\res\strings.hc:\Hard\Git\Smodule\uart\uart.hc:\Hard\Git\Smodule\uart\uart_addon.hc:\Hard\Git\Smodule\nrf24l01\nrf24.hc:\Hard\Git\Smodule\nrf24l01\nRF24L01.hc:\Hard\Git\Smodule\main.cc:\Hard\Git\Smodule\uart\uart_addon.cc:\Hard\Git\Smodule\uart\uart.cc:\Hard\Git\Smodule\nrf24l01\nrf24.cc:\Hard\Git\Smodule\nrf24l01\radioPinFunctions.c00000main.c100001res\strings.h1 diff --git a/Smodule/default/Makefile b/Smodule/default/Makefile new file mode 100644 index 0000000..a994629 --- /dev/null +++ b/Smodule/default/Makefile @@ -0,0 +1,89 @@ +############################################################################### +# Makefile for the project Smodule +############################################################################### + +## General Flags +PROJECT = Smodule +MCU = atmega8 +TARGET = Smodule.elf +CC = avr-gcc + +CPP = avr-g++ + +## Options common to compile, link and assembly rules +COMMON = -mmcu=$(MCU) + +## Compile options common for all C compilation units. +CFLAGS = $(COMMON) +CFLAGS += -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d + +## Assembly specific flags +ASMFLAGS = $(COMMON) +ASMFLAGS += $(CFLAGS) +ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 + +## Linker flags +LDFLAGS = $(COMMON) +LDFLAGS += -Wl,-Map=Smodule.map + + +## Intel Hex file production flags +HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature + +HEX_EEPROM_FLAGS = -j .eeprom +HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" +HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings + + +## Objects that must be built in order to link +OBJECTS = main.o uart_addon.o uart.o nrf24.o radioPinFunctions.o + +## Objects explicitly added by the user +LINKONLYOBJECTS = + +## Build +all: $(TARGET) Smodule.hex Smodule.eep Smodule.lss size + +## Compile +main.o: ../main.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< + +uart_addon.o: ../uart/uart_addon.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< + +uart.o: ../uart/uart.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< + +nrf24.o: ../nrf24l01/nrf24.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< + +radioPinFunctions.o: ../nrf24l01/radioPinFunctions.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< + +##Link +$(TARGET): $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET) + +%.hex: $(TARGET) + avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ + +%.eep: $(TARGET) + -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0 + +%.lss: $(TARGET) + avr-objdump -h -S $< > $@ + +size: ${TARGET} + @echo + @avr-size -C --mcu=${MCU} ${TARGET} + +## Clean target +.PHONY: clean +clean: + -rm -rf $(OBJECTS) Smodule.elf dep/* Smodule.hex Smodule.eep Smodule.lss Smodule.map + + +## Other dependencies +-include $(shell mkdir dep 2>NUL) $(wildcard dep/*) + diff --git a/Smodule/main.c b/Smodule/main.c new file mode 100644 index 0000000..778aecc --- /dev/null +++ b/Smodule/main.c @@ -0,0 +1,123 @@ +// + +#include +#include +#include +#include +#include "uart/uart.h" +#include "uart/uart_addon.h" +#include "res/strings.h" +#include "nrf24l01/nrf24.h" + +#define UART_BAUD_RATE 9600 + +unsigned char get_uart_char(void){ + unsigned int res; + do{ + res = uart_getc(); + } while(res & UART_NO_DATA); + return (unsigned char) res; +} + +static int get_uart_line(char *pbuf, int len_ln){ + int i = 0; + unsigned char c; + len_ln=len_ln-1; + + while((c=get_uart_char()) != 0x0D && i0){ + if (strcmp(cmd, CmdLD)==0){ + /* Automatically goes to TX mode */ + nrf24_send((uint8_t*) &cmd); + + /* Wait for transmission to end */ + while(nrf24_isSending()); + + /* Make analysis on last tranmission attempt */ + temp = nrf24_lastMessageStatus(); + + if(temp == NRF24_TRANSMISSON_OK){ + uart_puts_p(TransOK); + }else if(temp == NRF24_MESSAGE_LOST){ + uart_puts_p(TransLost); + } + + /* Retranmission count indicates the tranmission quality */ + temp = nrf24_retransmissionCount(); + uart_puts_p(ReTransCnt); + uart_put_int(temp); + + uart_puts_p(CmdPrompt); + + /* Optionally, go back to RX mode ... */ + nrf24_powerUpRx(); + + /* Or you might want to power down after TX */ + // nrf24_powerDown(); + + /* Wait a little ... */ + _delay_ms(10); + } + if (strcmp(cmd, CmdHelp)==0){ + uart_puts_p(HelpTitle); + uart_puts_p(HelpItem1); + uart_puts_p(HelpItem2); + uart_puts_p(CmdPrompt); + } + } + } + if(nrf24_dataReady()){ + nrf24_getData((uint8_t *) &buff); + for ( i=0; i < sizeof(buff.buffer); i++ ){ + uart_puthex_byte(buff.buffer[i]); + uart_putc(' '); + } + uart_puts(CRLF); + } + } +} diff --git a/Smodule/nrf24l01/nRF24L01.h b/Smodule/nrf24l01/nRF24L01.h new file mode 100644 index 0000000..6ec69fe --- /dev/null +++ b/Smodule/nrf24l01/nRF24L01.h @@ -0,0 +1,130 @@ +/* + Copyright (c) 2007 Stefan Engelke + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + $Id$ +*/ + +/* Memory Map */ +#define CONFIG 0x00 +#define EN_AA 0x01 +#define EN_RXADDR 0x02 +#define SETUP_AW 0x03 +#define SETUP_RETR 0x04 +#define RF_CH 0x05 +#define RF_SETUP 0x06 +#define STATUS 0x07 +#define OBSERVE_TX 0x08 +#define CD 0x09 +#define RX_ADDR_P0 0x0A +#define RX_ADDR_P1 0x0B +#define RX_ADDR_P2 0x0C +#define RX_ADDR_P3 0x0D +#define RX_ADDR_P4 0x0E +#define RX_ADDR_P5 0x0F +#define TX_ADDR 0x10 +#define RX_PW_P0 0x11 +#define RX_PW_P1 0x12 +#define RX_PW_P2 0x13 +#define RX_PW_P3 0x14 +#define RX_PW_P4 0x15 +#define RX_PW_P5 0x16 +#define FIFO_STATUS 0x17 +#define DYNPD 0x1C + +/* Bit Mnemonics */ + +/* configuratio nregister */ +#define MASK_RX_DR 6 +#define MASK_TX_DS 5 +#define MASK_MAX_RT 4 +#define EN_CRC 3 +#define CRCO 2 +#define PWR_UP 1 +#define PRIM_RX 0 + +/* enable auto acknowledgment */ +#define ENAA_P5 5 +#define ENAA_P4 4 +#define ENAA_P3 3 +#define ENAA_P2 2 +#define ENAA_P1 1 +#define ENAA_P0 0 + +/* enable rx addresses */ +#define ERX_P5 5 +#define ERX_P4 4 +#define ERX_P3 3 +#define ERX_P2 2 +#define ERX_P1 1 +#define ERX_P0 0 + +/* setup of address width */ +#define AW 0 /* 2 bits */ + +/* setup of auto re-transmission */ +#define ARD 4 /* 4 bits */ +#define ARC 0 /* 4 bits */ + +/* RF setup register */ +#define PLL_LOCK 4 +#define RF_DR 3 +#define RF_PWR 1 /* 2 bits */ + +/* general status register */ +#define RX_DR 6 +#define TX_DS 5 +#define MAX_RT 4 +#define RX_P_NO 1 /* 3 bits */ +#define TX_FULL 0 + +/* transmit observe register */ +#define PLOS_CNT 4 /* 4 bits */ +#define ARC_CNT 0 /* 4 bits */ + +/* fifo status */ +#define TX_REUSE 6 +#define FIFO_FULL 5 +#define TX_EMPTY 4 +#define RX_FULL 1 +#define RX_EMPTY 0 + +/* dynamic length */ +#define DPL_P0 0 +#define DPL_P1 1 +#define DPL_P2 2 +#define DPL_P3 3 +#define DPL_P4 4 +#define DPL_P5 5 + +/* Instruction Mnemonics */ +#define R_REGISTER 0x00 /* last 4 bits will indicate reg. address */ +#define W_REGISTER 0x20 /* last 4 bits will indicate reg. address */ +#define REGISTER_MASK 0x1F +#define R_RX_PAYLOAD 0x61 +#define W_TX_PAYLOAD 0xA0 +#define FLUSH_TX 0xE1 +#define FLUSH_RX 0xE2 +#define REUSE_TX_PL 0xE3 +#define ACTIVATE 0x50 +#define R_RX_PL_WID 0x60 +#define NOP 0xFF diff --git a/Smodule/nrf24l01/nrf24.c b/Smodule/nrf24l01/nrf24.c new file mode 100644 index 0000000..fd96818 --- /dev/null +++ b/Smodule/nrf24l01/nrf24.c @@ -0,0 +1,351 @@ +/* +* ---------------------------------------------------------------------------- +* “THE COFFEEWARE LICENSE” (Revision 1): +* wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* This library is based on this library: +* https://github.com/aaronds/arduino-nrf24l01 +* Which is based on this library: +* http://www.tinkerer.eu/AVRLib/nRF24L01 +* ----------------------------------------------------------------------------- +*/ +#include "nrf24.h" + +uint8_t payload_len; + +/* init the hardware pins */ +void nrf24_init() +{ + nrf24_setupPins(); + nrf24_ce_digitalWrite(LOW); + nrf24_csn_digitalWrite(HIGH); +} + +/* configure the module */ +void nrf24_config(uint8_t channel, uint8_t pay_length) +{ + /* Use static payload length ... */ + payload_len = pay_length; + + // Set RF channel + nrf24_configRegister(RF_CH,channel); + + // Set length of incoming payload + nrf24_configRegister(RX_PW_P0, 0x00); // Auto-ACK pipe ... + nrf24_configRegister(RX_PW_P1, payload_len); // Data payload pipe + nrf24_configRegister(RX_PW_P2, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P3, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P4, 0x00); // Pipe not used + nrf24_configRegister(RX_PW_P5, 0x00); // Pipe not used + + // 1 Mbps, TX gain: 0dbm + nrf24_configRegister(RF_SETUP, (0< wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* This library is based on this library: +* https://github.com/aaronds/arduino-nrf24l01 +* Which is based on this library: +* http://www.tinkerer.eu/AVRLib/nRF24L01 +* ----------------------------------------------------------------------------- +*/ +#ifndef NRF24 +#define NRF24 + +#include "nRF24L01.h" +#include + +#define LOW 0 +#define HIGH 1 + +#define nrf24_ADDR_LEN 5 +#define nrf24_CONFIG ((1< Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_ce_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 CE pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_csn_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 SCK pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_sck_digitalWrite(uint8_t state); + +/* -------------------------------------------------------------------------- */ +/* nrf24 MOSI pin control function + * - state:1 => Pin HIGH + * - state:0 => Pin LOW */ +/* -------------------------------------------------------------------------- */ +extern void nrf24_mosi_digitalWrite(uint8_t state); + +/* -----------------------------------------*/ +/* nrf24 MISO pin read function */ +/* - returns: Non-zero if the pin is high */ +/* -----------------------------------------*/ +extern uint8_t nrf24_miso_digitalRead(); + +#endif diff --git a/Smodule/nrf24l01/radioPinFunctions.c b/Smodule/nrf24l01/radioPinFunctions.c new file mode 100644 index 0000000..311528b --- /dev/null +++ b/Smodule/nrf24l01/radioPinFunctions.c @@ -0,0 +1,80 @@ +/* +* ---------------------------------------------------------------------------- +* “THE COFFEEWARE LICENSE” (Revision 1): +* wrote this file. As long as you retain this notice you +* can do whatever you want with this stuff. If we meet some day, and you think +* this stuff is worth it, you can buy me a coffee in return. +* ----------------------------------------------------------------------------- +* Please define your platform spesific functions in this file ... +* ----------------------------------------------------------------------------- +*/ + +#include + +#define set_bit(reg,bit) reg |= (1< + +#define CRLF "\r\n" +#define CmdLD "ld" +#define CmdHelp "h" + +// +const char HelpTitle[] PROGMEM = CRLF "Command list:"; +const char HelpItem1[] PROGMEM = CRLF CmdLD " - List devices"; +const char HelpItem2[] PROGMEM = CRLF CmdHelp " - Show this help"; +const char CmdPrompt[] PROGMEM = CRLF "# "; + +// +const char ScanStr[] PROGMEM = CRLF "Scanning 1-wire bus" CRLF; +const char TransOK[] PROGMEM = CRLF "> Tranmission went OK"; +const char TransLost[] PROGMEM = CRLF "> Message is lost ..."; +const char ReTransCnt[] PROGMEM = CRLF "> Retranmission count: "; diff --git a/Smodule/smodule.aws b/Smodule/smodule.aws new file mode 100644 index 0000000..d82f183 --- /dev/null +++ b/Smodule/smodule.aws @@ -0,0 +1 @@ + diff --git a/Smodule/uart/uart.c b/Smodule/uart/uart.c new file mode 100644 index 0000000..3cb2a81 --- /dev/null +++ b/Smodule/uart/uart.c @@ -0,0 +1,663 @@ +/************************************************************************* +Title: Interrupt UART library with receive/transmit circular buffers +Author: Peter Fleury http://jump.to/fleury +File: $Id: uart.c,v 1.10 2013/06/02 07:27:04 peter Exp $ +Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher +Hardware: any AVR with built-in UART, +License: GNU General Public License + +DESCRIPTION: + An interrupt is generated when the UART has finished transmitting or + receiving a byte. The interrupt handling routines use circular buffers + for buffering received and transmitted data. + + The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define + the buffer size in bytes. Note that these variables must be a + power of 2. + +USAGE: + Refere to the header file uart.h for a description of the routines. + See also example test_uart.c. + +NOTES: + Based on Atmel Application Note AVR306 + +LICENSE: + Copyright (C) 2006 Peter Fleury + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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 General Public License for more details. + +*************************************************************************/ +#include +#include +#include +#include "uart.h" + + +/* + * constants and macros + */ + +/* size of RX/TX buffers */ +#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1) +#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1) + +#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK ) +#error RX buffer size is not a power of 2 +#endif +#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK ) +#error TX buffer size is not a power of 2 +#endif + +#if defined(__AVR_AT90S2313__) \ + || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \ + || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \ + || defined(__AVR_ATmega103__) + /* old AVR classic or ATmega103 with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS USR + #define UART0_CONTROL UCR + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__) + /* old AVR classic with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ + || defined(__AVR_ATmega323__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RXC_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined (__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega163__) + /* ATmega163 with one UART */ + #define ATMEGA_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega162__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RXC_vect + #define UART1_RECEIVE_INTERRUPT USART1_RXC_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega161__) + /* ATmega with UART */ + #error "AVR ATmega161 currently not supported by this libaray !" +#elif defined(__AVR_ATmega169__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) \ + || defined(__AVR_ATmega3250__) || defined(__AVR_ATmega3290__) ||defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6490__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATtiny2313__) + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega329__) || \ + defined(__AVR_ATmega649__) || \ + defined(__AVR_ATmega325__) || \ + defined(__AVR_ATmega645__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega640__) +/* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega644__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#else + #error "no UART definition for MCU available" +#endif + + +/* + * module global variables + */ +static volatile unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE]; +static volatile unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE]; +static volatile unsigned char UART_TxHead; +static volatile unsigned char UART_TxTail; +static volatile unsigned char UART_RxHead; +static volatile unsigned char UART_RxTail; +static volatile unsigned char UART_LastRxError; + +#if defined( ATMEGA_USART1 ) +static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE]; +static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE]; +static volatile unsigned char UART1_TxHead; +static volatile unsigned char UART1_TxTail; +static volatile unsigned char UART1_RxHead; +static volatile unsigned char UART1_RxTail; +static volatile unsigned char UART1_LastRxError; +#endif + + + +ISR (UART0_RECEIVE_INTERRUPT) +/************************************************************************* +Function: UART Receive Complete interrupt +Purpose: called when the UART has received a character +**************************************************************************/ +{ + unsigned char tmphead; + unsigned char data; + unsigned char usr; + unsigned char lastRxError; + + + /* read UART status register and UART data register */ + usr = UART0_STATUS; + data = UART0_DATA; + + /* */ +#if defined( AT90_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART0 ) + lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) ); +#elif defined ( ATMEGA_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#endif + + /* calculate buffer index */ + tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK; + + if ( tmphead == UART_RxTail ) { + /* error: receive buffer overflow */ + lastRxError = UART_BUFFER_OVERFLOW >> 8; + }else{ + /* store new index */ + UART_RxHead = tmphead; + /* store received data in buffer */ + UART_RxBuf[tmphead] = data; + } + UART_LastRxError |= lastRxError; +} + + +ISR (UART0_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART Data Register Empty interrupt +Purpose: called when the UART is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART_TxHead != UART_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK; + UART_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART0_CONTROL &= ~_BV(UART0_UDRIE); + } +} + + +/************************************************************************* +Function: uart_init() +Purpose: initialize UART and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart_init(unsigned int baudrate) +{ + UART_TxHead = 0; + UART_TxTail = 0; + UART_RxHead = 0; + UART_RxTail = 0; + +#if defined( AT90_UART ) + /* set baud rate */ + UBRR = (unsigned char)baudrate; + + /* enable UART receiver and transmmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN); + +#elif defined (ATMEGA_USART) + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART0_STATUS = (1<>8); + UBRRL = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<>8); + UBRR0L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE0)|(1<>8); + UBRR = (unsigned char) baudrate; + + /* Enable UART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<> 8; + }else{ + /* store new index */ + UART1_RxHead = tmphead; + /* store received data in buffer */ + UART1_RxBuf[tmphead] = data; + } + UART1_LastRxError |= lastRxError; +} + + +ISR(UART1_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART1 Data Register Empty interrupt +Purpose: called when the UART1 is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART1_TxHead != UART1_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK; + UART1_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART1_DATA = UART1_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART1_CONTROL &= ~_BV(UART1_UDRIE); + } +} + + +/************************************************************************* +Function: uart1_init() +Purpose: initialize UART1 and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart1_init(unsigned int baudrate) +{ + UART1_TxHead = 0; + UART1_TxTail = 0; + UART1_RxHead = 0; + UART1_RxTail = 0; + + + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART1_STATUS = (1<>8); + UBRR1L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART1_CONTROL = _BV(RXCIE1)|(1< http://jump.to/fleury +File: $Id: uart.h,v 1.12 2012/11/19 19:52:27 peter Exp $ +Software: AVR-GCC 4.1, AVR Libc 1.4 +Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz +License: GNU General Public License +Usage: see Doxygen manual + +LICENSE: + Copyright (C) 2006 Peter Fleury + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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 General Public License for more details. + +************************************************************************/ + +/** + * @defgroup pfleury_uart UART Library + * @code #include @endcode + * + * @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers. + * + * This library can be used to transmit and receive data through the built in UART. + * + * An interrupt is generated when the UART has finished transmitting or + * receiving a byte. The interrupt handling routines use circular buffers + * for buffering received and transmitted data. + * + * The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define + * the size of the circular buffers in bytes. Note that these constants must be a power of 2. + * You may need to adapt this constants to your target and your application by adding + * CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile. + * + * @note Based on Atmel Application Note AVR306 + * @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury + */ + +/**@{*/ + + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" +#endif + + +/* +** constants and macros +*/ + +/** @brief UART Baudrate Expression + * @param xtalcpu system clock in Mhz, e.g. 4000000UL for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL) + +/** @brief UART Baudrate Expression for ATmega double speed mode + * @param xtalcpu system clock in Mhz, e.g. 4000000UL for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000) + + +/** Size of the circular receive buffer, must be power of 2 */ +#ifndef UART_RX_BUFFER_SIZE +#define UART_RX_BUFFER_SIZE 32 +#endif +/** Size of the circular transmit buffer, must be power of 2 */ +#ifndef UART_TX_BUFFER_SIZE +#define UART_TX_BUFFER_SIZE 32 +#endif + +/* test if the size of the circular buffers fits into SRAM */ +#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) +#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM" +#endif + +/* +** high byte error return code of uart_getc() +*/ +#define UART_FRAME_ERROR 0x1000 /* Framing Error by UART */ +#define UART_OVERRUN_ERROR 0x0800 /* Overrun condition by UART */ +#define UART_PARITY_ERROR 0x0400 /* Parity Error by UART */ +#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ +#define UART_NO_DATA 0x0100 /* no receive data available */ + + +/* +** function prototypes +*/ + +/** + @brief Initialize UART and set baudrate + @param baudrate Specify baudrate using macro UART_BAUD_SELECT() + @return none +*/ +extern void uart_init(unsigned int baudrate); + + +/** + * @brief Get received byte from ringbuffer + * + * Returns in the lower byte the received character and in the + * higher byte the last receive error. + * UART_NO_DATA is returned when no data is available. + * + * @param void + * @return lower byte: received byte from ringbuffer + * @return higher byte: last receive status + * - \b 0 successfully received data from UART + * - \b UART_NO_DATA + *
no receive data available + * - \b UART_BUFFER_OVERFLOW + *
Receive ringbuffer overflow. + * We are not reading the receive buffer fast enough, + * one or more received character have been dropped + * - \b UART_OVERRUN_ERROR + *
Overrun condition by UART. + * A character already present in the UART UDR register was + * not read by the interrupt handler before the next character arrived, + * one or more received characters have been dropped. + * - \b UART_FRAME_ERROR + *
Framing Error by UART + */ +extern unsigned int uart_getc(void); + + +/** + * @brief Put byte to ringbuffer for transmitting via UART + * @param data byte to be transmitted + * @return none + */ +extern void uart_putc(unsigned char data); + + +/** + * @brief Put string to ringbuffer for transmitting via UART + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s string to be transmitted + * @return none + */ +extern void uart_puts(const char *s ); + + +/** + * @brief Put string from program memory to ringbuffer for transmitting via UART. + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s program memory string to be transmitted + * @return none + * @see uart_puts_P + */ +extern void uart_puts_p(const char *s ); + +/** + * @brief Macro to automatically put a string constant into program memory + */ +#define uart_puts_P(__s) uart_puts_p(PSTR(__s)) + + + +/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ +extern void uart1_init(unsigned int baudrate); +/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ +extern unsigned int uart1_getc(void); +/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ +extern void uart1_putc(unsigned char data); +/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ +extern void uart1_puts(const char *s ); +/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ +extern void uart1_puts_p(const char *s ); +/** @brief Macro to automatically put a string constant into program memory */ +#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) + +/**@}*/ + + +#endif // UART_H + diff --git a/Smodule/uart/uart_addon.c b/Smodule/uart/uart_addon.c new file mode 100644 index 0000000..b2544da --- /dev/null +++ b/Smodule/uart/uart_addon.c @@ -0,0 +1,118 @@ +/************************************************************************* +Title: UART addon-library +Author: Martin Thomas + http://www.siwawi.arubi.uni-kl.de/avr_projects +Software: AVR-GCC 3.3/3.4, Peter Fleury's UART-Library + +DESCRIPTION: + +USAGE: + Refere to the header file uart_addon.h for a description of the routines. + +*************************************************************************/ + +#include + +#include +#include "uart.h" + + +/************************************************************************* +Function: uart_put_int() +Purpose: transmit integer as ASCII to UART +Input: integer value +Returns: none +**************************************************************************/ +void uart_put_int( const int val ) +{ + char buffer[10]; + uart_puts( itoa( val, buffer, 10 ) ); +} /* uart_puti */ + +/************************************************************************* +Function: uart_put_longint() +Purpose: transmit long integer as ASCII to UART +Input: integer value +Returns: none +**************************************************************************/ +void uart_put_longint( const long int val ) +{ + char buffer[15]; + uart_puts( ltoa( val, buffer, 10 ) ); +} /* uart_puti */ + +/************************************************************************* +Function: uart_put_ulongint() +Purpose: transmit long integer as ASCII to UART +Input: integer value +Returns: none +**************************************************************************/ +void uart_put_ulongint( const unsigned long int val ) +{ + char buffer[15]; + uart_puts( utoa( val, buffer, 10 ) ); +} /* uart_puti */ + +/************************************************************************* +Function: uart_puthex_nibble() +Purpose: transmit lower nibble as ASCII-hex to UART +Input: byte value +Returns: none +**************************************************************************/ +void uart_puthex_nibble(const unsigned char b) +{ + unsigned char c = b & 0x0f; + if ( c > 9 ) { + c += 'A'-10; + } + else { + c += '0'; + } + uart_putc(c); +} /* uart_puthex_nibble */ + +/************************************************************************* +Function: uart_puthex_byte() +Purpose: transmit upper and lower nibble as ASCII-hex to UART +Input: byte value +Returns: none +**************************************************************************/ +void uart_puthex_byte( const unsigned char b ) +{ + uart_puthex_nibble( b >> 4 ); + uart_puthex_nibble( b ); +} /* uart_puthex_byte */ + +/************************************************************************* +Function: uart_puthex_long() +Purpose: transmit unsigned long as ASCII-hex to UART +Input: uint32_t value +Returns: none +**************************************************************************/ +void uart_puthex_long( const unsigned long l ) +{ + uart_puthex_byte( (unsigned char)( l >> 24 ) ); + uart_puthex_byte( (unsigned char)( l >> 16 ) ); + uart_puthex_byte( (unsigned char)( l >> 8 ) ); + uart_puthex_byte( (unsigned char)( l ) ); +} /* uart_puthex_byte */ + + +/************************************************************************* +Function: uart_putbin_byte() +Purpose: transmit byte as ASCII-bin to UART +Input: byte value +Returns: none +**************************************************************************/ +void uart_putbin_byte( const unsigned char b ) +{ + signed char i; + for ( i= 7;i >= 0;i-- ) { + if ( b & ( 1 << i ) ) { + uart_putc( '1' ); + } + else { + uart_putc( '0' ); + } + } +} /* uart_putbin_byte */ diff --git a/Smodule/uart/uart_addon.h b/Smodule/uart/uart_addon.h new file mode 100644 index 0000000..3c4ff91 --- /dev/null +++ b/Smodule/uart/uart_addon.h @@ -0,0 +1,121 @@ +#ifndef UART_ADDON_H +#define UART_ADDON_H +/************************************************************************ +Title: UART addon-library +Author: Martin Thomas + http://www.siwawi.arubi.uni-kl.de/avr_projects +Software: AVR-GCC 3.3/3.4, Peter Fleury's UART-Library +************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup UART library-addon + * @code #include @endcode + * + * @brief Additional functions for send numbers as decimal and hex to UART + * + * @note needs Peter Fleury's UART-Library http://jump.to/fleury + * @author Martin Thomas eversmith@heizung-thomas.de + */ + +/*@{*/ + +/** + * @brief Put long integer to ringbuffer for transmitting via UART. + * + * The integer is converted to a string which is buffered by the uart + * library in a circular buffer and one character at a time is transmitted + * to the UART using interrupts. + * + * @param value to transfer + * @return none + * @see uart_puts_p + */ +extern void uart_put_longint( long int i ); + + +/** + * @brief Put unsigned long integer to ringbuffer for transmitting via UART. + * + * The integer is converted to a string which is buffered by the uart + * library in a circular buffer and one character at a time is transmitted + * to the UART using interrupts. + * + * @param value to transfer + * @return none + * @see uart_puts_p + */ +extern void uart_put_ulongint( unsigned long int i ); + + +/** + * @brief Put integer to ringbuffer for transmitting via UART. + * + * The integer is converted to a string which is buffered by the uart + * library in a circular buffer and one character at a time is transmitted + * to the UART using interrupts. + * + * @param value to transfer + * @return none + * @see uart_puts_p + */ +extern void uart_put_int( int i ); + + +/** + * @brief Put nibble as hex to ringbuffer for transmit via UART. + * + * The lower nibble of the parameter is convertet to correspondig + * hex-char and put in a circular buffer and one character at a time + * is transmitted to the UART using interrupts. + * + * @param value to transfer (byte, only lower nibble converted) + * @return none + * @see uart_putc + */ +extern void uart_puthex_nibble( const unsigned char b ); + +/** + * @brief Put byte as hex to ringbuffer for transmit via UART. + * + * The upper and lower nibble of the parameter are convertet to + * correspondig hex-chars and put in a circular buffer and one + * character at a time is transmitted to the UART using interrupts. + * + * @param value to transfer + * @return none + * @see uart_puthex_nibble + */ +extern void uart_puthex_byte( const unsigned char b ); + +/** + * @brief Put unsigned long as ASCII to ringbuffer for transmit via UART. + * + * @param value to transfer + * @return none + * @see none + */ +extern void uart_puthex_long( unsigned long l ); + +/** + * @brief Put byte as bin to ringbuffer for transmit via UART. + * + * @param value to transfer + * @return none + * @see uart_putc + */ +extern void uart_putbin_byte( const unsigned char b ); + + +/*@}*/ + +#ifdef __cplusplus +} +#endif + + +#endif /* UART_ADDON_H */ +