Add Rmodule project
This commit is contained in:
		
							
								
								
									
										86
									
								
								Rmodule/default/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								Rmodule/default/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  | ############################################################################### | ||||||
|  | # Makefile for the project Rmodule | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | ## General Flags | ||||||
|  | PROJECT = Rmodule | ||||||
|  | MCU = atmega8 | ||||||
|  | TARGET = Rmodule.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=Rmodule.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.o onewire.o uart_addon.o  | ||||||
|  |  | ||||||
|  | ## Objects explicitly added by the user | ||||||
|  | LINKONLYOBJECTS =  | ||||||
|  |  | ||||||
|  | ## Build | ||||||
|  | all: $(TARGET) Rmodule.hex Rmodule.eep Rmodule.lss size | ||||||
|  |  | ||||||
|  | ## Compile | ||||||
|  | main.o: ../main.c | ||||||
|  | 	$(CC) $(INCLUDES) $(CFLAGS) -c  $< | ||||||
|  |  | ||||||
|  | uart.o: ../uart/uart.c | ||||||
|  | 	$(CC) $(INCLUDES) $(CFLAGS) -c  $< | ||||||
|  |  | ||||||
|  | onewire.o: ../onewire/onewire.c | ||||||
|  | 	$(CC) $(INCLUDES) $(CFLAGS) -c  $< | ||||||
|  |  | ||||||
|  | uart_addon.o: ../uart/uart_addon.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) Rmodule.elf dep/* Rmodule.hex Rmodule.eep Rmodule.lss Rmodule.map | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## Other dependencies | ||||||
|  | -include $(shell mkdir dep 2>NUL) $(wildcard dep/*) | ||||||
|  |  | ||||||
							
								
								
									
										62
									
								
								Rmodule/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								Rmodule/main.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ||||||
|  |  | ||||||
|  | #include <avr/io.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <avr/interrupt.h> | ||||||
|  | #include "uart/uart.h" | ||||||
|  | #include "uart/uart_addon.h" | ||||||
|  | #include "res/strings.h" | ||||||
|  | #include "onewire/onewire.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define UART_BAUD_RATE      19200   | ||||||
|  |  | ||||||
|  | unsigned char getcmd(void){ | ||||||
|  | 	unsigned int res; | ||||||
|  | 	do{ | ||||||
|  | 		res = uart_getc(); | ||||||
|  | 	} while(res & UART_NO_DATA); | ||||||
|  | 	return (unsigned char) res; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void getListDevices(void){ | ||||||
|  | 	uint8_t i; | ||||||
|  | 	uint8_t id[OW_ROMCODE_SIZE]; | ||||||
|  | 	uint8_t diff, nSensors; | ||||||
|  |  | ||||||
|  | 	uart_puts_p("\r\nScanning 1-wire bus\r\n"); | ||||||
|  | 	ow_reset(); | ||||||
|  | 	nSensors = 0; | ||||||
|  | 	diff = OW_SEARCH_FIRST; | ||||||
|  | 	while ( diff != OW_LAST_DEVICE) { | ||||||
|  | 		diff = ow_rom_search( diff, &id[0] ); | ||||||
|  | 		if ( diff != OW_PRESENCE_ERR && diff != OW_DATA_ERR && diff != OW_LAST_DEVICE ) {  | ||||||
|  | 			for ( i=0; i < OW_ROMCODE_SIZE; i++ ){ | ||||||
|  | 				uart_puthex_byte(id[i]); | ||||||
|  | 				uart_puts_p( " " ); | ||||||
|  | 			} | ||||||
|  | 			uart_puts("\r\n"); | ||||||
|  | 		} | ||||||
|  | 		nSensors++; | ||||||
|  | 	}	 | ||||||
|  | }  | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  | 	uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); | ||||||
|  | 	char cmd = '0'; | ||||||
|  | 	while (cmd != 'q'){ | ||||||
|  | 		uart_puts_p(MainMenuItemTitle); | ||||||
|  | 		uart_puts_p(MainMenuItem1); | ||||||
|  | 		uart_puts_p(MainMenuItem2); | ||||||
|  | 		uart_puts_p(MainMenuItemQuit); | ||||||
|  | 		uart_puts_p(MainMenuItemPrompt); | ||||||
|  | 		cmd = getcmd(); | ||||||
|  | 		if (cmd == '1'){ | ||||||
|  | 			getListDevices(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	while(1){	} | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								Rmodule/onewire/crc8.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Rmodule/onewire/crc8.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | /* please read copyright-notice at EOF */ | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | #define CRC8INIT    0x00 | ||||||
|  | #define CRC8POLY    0x18              //0X18 = X^8+X^5+X^4+X^0 | ||||||
|  |  | ||||||
|  | uint8_t crc8( uint8_t *data, uint16_t number_of_bytes_in_data ) | ||||||
|  | { | ||||||
|  | 	uint8_t  crc; | ||||||
|  | 	uint16_t loop_count; | ||||||
|  | 	uint8_t  bit_counter; | ||||||
|  | 	uint8_t  b; | ||||||
|  | 	uint8_t  feedback_bit; | ||||||
|  | 	 | ||||||
|  | 	crc = CRC8INIT; | ||||||
|  |  | ||||||
|  | 	for (loop_count = 0; loop_count != number_of_bytes_in_data; loop_count++) | ||||||
|  | 	{ | ||||||
|  | 		b = data[loop_count]; | ||||||
|  | 		 | ||||||
|  | 		bit_counter = 8; | ||||||
|  | 		do { | ||||||
|  | 			feedback_bit = (crc ^ b) & 0x01; | ||||||
|  | 	 | ||||||
|  | 			if ( feedback_bit == 0x01 ) { | ||||||
|  | 				crc = crc ^ CRC8POLY; | ||||||
|  | 			} | ||||||
|  | 			crc = (crc >> 1) & 0x7F; | ||||||
|  | 			if ( feedback_bit == 0x01 ) { | ||||||
|  | 				crc = crc | 0x80; | ||||||
|  | 			} | ||||||
|  | 		 | ||||||
|  | 			b = b >> 1; | ||||||
|  | 			bit_counter--; | ||||||
|  | 		 | ||||||
|  | 		} while (bit_counter > 0); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return crc; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This code is from Colin O'Flynn - Copyright (c) 2002  | ||||||
|  | only minor changes by M.Thomas 9/2004 | ||||||
|  |  | ||||||
|  | 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. | ||||||
|  | */ | ||||||
							
								
								
									
										40
									
								
								Rmodule/onewire/crc8.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Rmodule/onewire/crc8.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | #ifndef CRC8_H_ | ||||||
|  | #define CRC8_H_ | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | uint8_t crc8( uint8_t* data, uint16_t number_of_bytes_in_data ); | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | This is based on code from : | ||||||
|  |  | ||||||
|  | Copyright (c) 2002 Colin O'Flynn | ||||||
|  |  | ||||||
|  | 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. | ||||||
|  | */ | ||||||
|  |  | ||||||
							
								
								
									
										287
									
								
								Rmodule/onewire/onewire.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								Rmodule/onewire/onewire.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,287 @@ | |||||||
|  | /*  | ||||||
|  | Access Dallas 1-Wire Devices with ATMEL AVRs | ||||||
|  | Author of the initial code: Peter Dannegger (danni(at)specs.de) | ||||||
|  | modified by Martin Thomas (mthomas(at)rhrk.uni-kl.de) | ||||||
|  |  9/2004 - use of delay.h, optional bus configuration at runtime | ||||||
|  | 10/2009 - additional delay in ow_bit_io for recovery | ||||||
|  |  5/2010 - timing modifcations, additonal config-values and comments, | ||||||
|  |           use of atomic.h macros, internal pull-up support | ||||||
|  |  7/2010 - added method to skip recovery time after last bit transfered | ||||||
|  |           via ow_command_skip_last_recovery | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <avr/io.h> | ||||||
|  | #include <util/delay.h> | ||||||
|  | #include <util/atomic.h> | ||||||
|  |  | ||||||
|  | #include "onewire.h" | ||||||
|  |  | ||||||
|  | #ifdef OW_ONE_BUS | ||||||
|  |  | ||||||
|  | #define OW_GET_IN()   ( OW_IN & (1<<OW_PIN)) | ||||||
|  | #define OW_OUT_LOW()  ( OW_OUT &= (~(1 << OW_PIN)) ) | ||||||
|  | #define OW_OUT_HIGH() ( OW_OUT |= (1 << OW_PIN) ) | ||||||
|  | #define OW_DIR_IN()   ( OW_DDR &= (~(1 << OW_PIN )) ) | ||||||
|  | #define OW_DIR_OUT()  ( OW_DDR |= (1 << OW_PIN) ) | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |  | ||||||
|  | /* set bus-config with ow_set_bus() */ | ||||||
|  | uint8_t OW_PIN_MASK;  | ||||||
|  | volatile uint8_t* OW_IN; | ||||||
|  | volatile uint8_t* OW_OUT; | ||||||
|  | volatile uint8_t* OW_DDR; | ||||||
|  |  | ||||||
|  | #define OW_GET_IN()   ( *OW_IN & OW_PIN_MASK ) | ||||||
|  | #define OW_OUT_LOW()  ( *OW_OUT &= (uint8_t) ~OW_PIN_MASK ) | ||||||
|  | #define OW_OUT_HIGH() ( *OW_OUT |= (uint8_t)  OW_PIN_MASK ) | ||||||
|  | #define OW_DIR_IN()   ( *OW_DDR &= (uint8_t) ~OW_PIN_MASK ) | ||||||
|  | #define OW_DIR_OUT()  ( *OW_DDR |= (uint8_t)  OW_PIN_MASK ) | ||||||
|  |  | ||||||
|  | void ow_set_bus(volatile uint8_t* in, | ||||||
|  | 	volatile uint8_t* out, | ||||||
|  | 	volatile uint8_t* ddr, | ||||||
|  | 	uint8_t pin) | ||||||
|  | { | ||||||
|  | 	OW_DDR=ddr; | ||||||
|  | 	OW_OUT=out; | ||||||
|  | 	OW_IN=in; | ||||||
|  | 	OW_PIN_MASK = (1 << pin); | ||||||
|  | 	ow_reset(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | uint8_t ow_input_pin_state() | ||||||
|  | { | ||||||
|  | 	return OW_GET_IN(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ow_parasite_enable(void) | ||||||
|  | { | ||||||
|  | 	OW_OUT_HIGH(); | ||||||
|  | 	OW_DIR_OUT(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ow_parasite_disable(void) | ||||||
|  | { | ||||||
|  | 	OW_DIR_IN(); | ||||||
|  | #if (!OW_USE_INTERNAL_PULLUP) | ||||||
|  | 	OW_OUT_LOW(); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | uint8_t ow_reset(void) | ||||||
|  | { | ||||||
|  | 	uint8_t err; | ||||||
|  | 	 | ||||||
|  | 	OW_OUT_LOW(); | ||||||
|  | 	OW_DIR_OUT();            // pull OW-Pin low for 480us | ||||||
|  | 	_delay_us(480); | ||||||
|  |  | ||||||
|  | 	ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | ||||||
|  | 		// set Pin as input - wait for clients to pull low | ||||||
|  | 		OW_DIR_IN(); // input | ||||||
|  | #if OW_USE_INTERNAL_PULLUP | ||||||
|  | 		OW_OUT_HIGH(); | ||||||
|  | #endif | ||||||
|  | 	 | ||||||
|  | 		_delay_us(64);       // was 66 | ||||||
|  | 		err = OW_GET_IN();   // no presence detect | ||||||
|  | 		                     // if err!=0: nobody pulled to low, still high | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// after a delay the clients should release the line | ||||||
|  | 	// and input-pin gets back to high by pull-up-resistor | ||||||
|  | 	_delay_us(480 - 64);       // was 480-66 | ||||||
|  | 	if( OW_GET_IN() == 0 ) { | ||||||
|  | 		err = 1;             // short circuit, expected low but got high | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return err; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Timing issue when using runtime-bus-selection (!OW_ONE_BUS): | ||||||
|  |    The master should sample at the end of the 15-slot after initiating | ||||||
|  |    the read-time-slot. The variable bus-settings need more | ||||||
|  |    cycles than the constant ones so the delays had to be shortened  | ||||||
|  |    to achive a 15uS overall delay  | ||||||
|  |    Setting/clearing a bit in I/O Register needs 1 cyle in OW_ONE_BUS | ||||||
|  |    but around 14 cyles in configureable bus (us-Delay is 4 cyles per uS) */ | ||||||
|  | static uint8_t ow_bit_io_intern( uint8_t b, uint8_t with_parasite_enable ) | ||||||
|  | { | ||||||
|  | 	ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { | ||||||
|  | #if OW_USE_INTERNAL_PULLUP | ||||||
|  | 		OW_OUT_LOW(); | ||||||
|  | #endif | ||||||
|  | 		OW_DIR_OUT();    // drive bus low | ||||||
|  | 		_delay_us(2);    // T_INT > 1usec accoding to timing-diagramm | ||||||
|  | 		if ( b ) { | ||||||
|  | 			OW_DIR_IN(); // to write "1" release bus, resistor pulls high | ||||||
|  | #if OW_USE_INTERNAL_PULLUP | ||||||
|  | 			OW_OUT_HIGH(); | ||||||
|  | #endif | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// "Output data from the DS18B20 is valid for 15usec after the falling | ||||||
|  | 		// edge that initiated the read time slot. Therefore, the master must  | ||||||
|  | 		// release the bus and then sample the bus state within 15ussec from  | ||||||
|  | 		// the start of the slot." | ||||||
|  | 		_delay_us(15-2-OW_CONF_DELAYOFFSET); | ||||||
|  | 		 | ||||||
|  | 		if( OW_GET_IN() == 0 ) { | ||||||
|  | 			b = 0;  // sample at end of read-timeslot | ||||||
|  | 		} | ||||||
|  | 	 | ||||||
|  | 		_delay_us(60-15-2+OW_CONF_DELAYOFFSET); | ||||||
|  | #if OW_USE_INTERNAL_PULLUP | ||||||
|  | 		OW_OUT_HIGH(); | ||||||
|  | #endif | ||||||
|  | 		OW_DIR_IN(); | ||||||
|  | 	 | ||||||
|  | 		if ( with_parasite_enable ) { | ||||||
|  | 			ow_parasite_enable(); | ||||||
|  | 		} | ||||||
|  | 	 | ||||||
|  | 	} /* ATOMIC_BLOCK */ | ||||||
|  |  | ||||||
|  | 	_delay_us(OW_RECOVERY_TIME); // may be increased for longer wires | ||||||
|  |  | ||||||
|  | 	return b; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t ow_bit_io( uint8_t b ) | ||||||
|  | { | ||||||
|  | 	return ow_bit_io_intern( b & 1, 0 ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t ow_byte_wr( uint8_t b ) | ||||||
|  | { | ||||||
|  | 	uint8_t i = 8, j; | ||||||
|  | 	 | ||||||
|  | 	do { | ||||||
|  | 		j = ow_bit_io( b & 1 ); | ||||||
|  | 		b >>= 1; | ||||||
|  | 		if( j ) { | ||||||
|  | 			b |= 0x80; | ||||||
|  | 		} | ||||||
|  | 	} while( --i ); | ||||||
|  | 	 | ||||||
|  | 	return b; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint8_t ow_byte_wr_with_parasite_enable( uint8_t b ) | ||||||
|  | { | ||||||
|  | 	uint8_t i = 8, j; | ||||||
|  | 	 | ||||||
|  | 	do { | ||||||
|  | 		if ( i != 1 ) { | ||||||
|  | 			j = ow_bit_io_intern( b & 1, 0 ); | ||||||
|  | 		} else { | ||||||
|  | 			j = ow_bit_io_intern( b & 1, 1 ); | ||||||
|  | 		} | ||||||
|  | 		b >>= 1; | ||||||
|  | 		if( j ) { | ||||||
|  | 			b |= 0x80; | ||||||
|  | 		} | ||||||
|  | 	} while( --i ); | ||||||
|  | 	 | ||||||
|  | 	return b; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | uint8_t ow_byte_rd( void ) | ||||||
|  | { | ||||||
|  | 	// read by sending only "1"s, so bus gets released | ||||||
|  | 	// after the init low-pulse in every slot | ||||||
|  | 	return ow_byte_wr( 0xFF );  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | uint8_t ow_rom_search( uint8_t diff, uint8_t *id ) | ||||||
|  | { | ||||||
|  | 	uint8_t i, j, next_diff; | ||||||
|  | 	uint8_t b; | ||||||
|  | 	 | ||||||
|  | 	if( ow_reset() ) { | ||||||
|  | 		return OW_PRESENCE_ERR;         // error, no device found <--- early exit! | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	ow_byte_wr( OW_SEARCH_ROM );        // ROM search command | ||||||
|  | 	next_diff = OW_LAST_DEVICE;         // unchanged on last device | ||||||
|  | 	 | ||||||
|  | 	i = OW_ROMCODE_SIZE * 8;            // 8 bytes | ||||||
|  | 	 | ||||||
|  | 	do { | ||||||
|  | 		j = 8;                          // 8 bits | ||||||
|  | 		do { | ||||||
|  | 			b = ow_bit_io( 1 );         // read bit | ||||||
|  | 			if( ow_bit_io( 1 ) ) {      // read complement bit | ||||||
|  | 				if( b ) {               // 0b11 | ||||||
|  | 					return OW_DATA_ERR; // data error <--- early exit! | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				if( !b ) {              // 0b00 = 2 devices | ||||||
|  | 					if( diff > i || ((*id & 1) && diff != i) ) { | ||||||
|  | 						b = 1;          // now 1 | ||||||
|  | 						next_diff = i;  // next pass 0 | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			ow_bit_io( b );             // write bit | ||||||
|  | 			*id >>= 1; | ||||||
|  | 			if( b ) { | ||||||
|  | 				*id |= 0x80;            // store bit | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			i--; | ||||||
|  | 			 | ||||||
|  | 		} while( --j ); | ||||||
|  | 		 | ||||||
|  | 		id++;                           // next byte | ||||||
|  | 	 | ||||||
|  | 	} while( i ); | ||||||
|  | 	 | ||||||
|  | 	return next_diff;                   // to continue search | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void ow_command_intern( uint8_t command, uint8_t *id, uint8_t with_parasite_enable ) | ||||||
|  | { | ||||||
|  | 	uint8_t i; | ||||||
|  |  | ||||||
|  | 	ow_reset(); | ||||||
|  |  | ||||||
|  | 	if( id ) { | ||||||
|  | 		ow_byte_wr( OW_MATCH_ROM );     // to a single device | ||||||
|  | 		i = OW_ROMCODE_SIZE; | ||||||
|  | 		do { | ||||||
|  | 			ow_byte_wr( *id ); | ||||||
|  | 			id++; | ||||||
|  | 		} while( --i ); | ||||||
|  | 	}  | ||||||
|  | 	else { | ||||||
|  | 		ow_byte_wr( OW_SKIP_ROM );      // to all devices | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if ( with_parasite_enable  ) { | ||||||
|  | 		ow_byte_wr_with_parasite_enable( command ); | ||||||
|  | 	} else { | ||||||
|  | 		ow_byte_wr( command ); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ow_command( uint8_t command, uint8_t *id ) | ||||||
|  | { | ||||||
|  | 	ow_command_intern( command, id, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ow_command_with_parasite_enable( uint8_t command, uint8_t *id ) | ||||||
|  | { | ||||||
|  | 	ow_command_intern( command, id, 1 ); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										93
									
								
								Rmodule/onewire/onewire.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								Rmodule/onewire/onewire.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | #ifndef ONEWIRE_H_ | ||||||
|  | #define ONEWIRE_H_ | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | /*******************************************/ | ||||||
|  | /* Hardware connection                     */ | ||||||
|  | /*******************************************/ | ||||||
|  |  | ||||||
|  | /* Define OW_ONE_BUS if only one 1-Wire-Bus is used | ||||||
|  |    in the application -> shorter code. | ||||||
|  |    If not defined make sure to call ow_set_bus() before using  | ||||||
|  |    a bus. Runtime bus-select increases code size by around 300  | ||||||
|  |    bytes so use OW_ONE_BUS if possible */ | ||||||
|  | // #define OW_ONE_BUS | ||||||
|  |  | ||||||
|  | #ifdef OW_ONE_BUS | ||||||
|  |  | ||||||
|  | #define OW_PIN  PD6 | ||||||
|  | #define OW_IN   PIND | ||||||
|  | #define OW_OUT  PORTD | ||||||
|  | #define OW_DDR  DDRD | ||||||
|  | #define OW_CONF_DELAYOFFSET 0 | ||||||
|  |  | ||||||
|  | #else  | ||||||
|  | #if ( F_CPU < 1843200 ) | ||||||
|  | #warning | Experimental multi-bus-mode is not tested for  | ||||||
|  | #warning | frequencies below 1,84MHz. Use OW_ONE_WIRE or | ||||||
|  | #warning | faster clock-source (i.e. internal 2MHz R/C-Osc.). | ||||||
|  | #endif | ||||||
|  | #define OW_CONF_CYCLESPERACCESS 13 | ||||||
|  | #define OW_CONF_DELAYOFFSET ( (uint16_t)( ((OW_CONF_CYCLESPERACCESS) * 1000000L) / F_CPU ) ) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // Recovery time (T_Rec) minimum 1usec - increase for long lines  | ||||||
|  | // 5 usecs is a value give in some Maxim AppNotes | ||||||
|  | // 30u secs seem to be reliable for longer lines | ||||||
|  | //#define OW_RECOVERY_TIME        5  /* usec */ | ||||||
|  | //#define OW_RECOVERY_TIME      300 /* usec */ | ||||||
|  | #define OW_RECOVERY_TIME         10 /* usec */ | ||||||
|  |  | ||||||
|  | // Use AVR's internal pull-up resistor instead of external 4,7k resistor. | ||||||
|  | // Based on information from Sascha Schade. Experimental but worked in tests | ||||||
|  | // with one DS18B20 and one DS18S20 on a rather short bus (60cm), where both  | ||||||
|  | // sensores have been parasite-powered. | ||||||
|  | #define OW_USE_INTERNAL_PULLUP     1  /* 0=external, 1=internal */ | ||||||
|  |  | ||||||
|  | /*******************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define OW_MATCH_ROM    0x55 | ||||||
|  | #define OW_SKIP_ROM     0xCC | ||||||
|  | #define OW_SEARCH_ROM   0xF0 | ||||||
|  |  | ||||||
|  | #define OW_SEARCH_FIRST 0xFF        // start new search | ||||||
|  | #define OW_PRESENCE_ERR 0xFF | ||||||
|  | #define OW_DATA_ERR     0xFE | ||||||
|  | #define OW_LAST_DEVICE  0x00        // last device found | ||||||
|  |  | ||||||
|  | // rom-code size including CRC | ||||||
|  | #define OW_ROMCODE_SIZE 8 | ||||||
|  |  | ||||||
|  | extern uint8_t ow_reset(void); | ||||||
|  |  | ||||||
|  | extern uint8_t ow_bit_io( uint8_t b ); | ||||||
|  | extern uint8_t ow_byte_wr( uint8_t b ); | ||||||
|  | extern uint8_t ow_byte_rd( void ); | ||||||
|  |  | ||||||
|  | extern uint8_t ow_rom_search( uint8_t diff, uint8_t *id ); | ||||||
|  |  | ||||||
|  | extern void ow_command( uint8_t command, uint8_t *id ); | ||||||
|  | extern void ow_command_with_parasite_enable( uint8_t command, uint8_t *id ); | ||||||
|  |  | ||||||
|  | extern void ow_parasite_enable( void ); | ||||||
|  | extern void ow_parasite_disable( void ); | ||||||
|  | extern uint8_t ow_input_pin_state( void ); | ||||||
|  |  | ||||||
|  | #ifndef OW_ONE_BUS | ||||||
|  | extern void ow_set_bus( volatile uint8_t* in, | ||||||
|  | 	volatile uint8_t* out, | ||||||
|  | 	volatile uint8_t* ddr, | ||||||
|  | 	uint8_t pin ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										10
									
								
								Rmodule/res/strings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Rmodule/res/strings.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | #include <avr/pgmspace.h> | ||||||
|  |  | ||||||
|  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> | ||||||
|  | const char MainMenuItemTitle[]	PROGMEM = "\r\n---==== Main menu ---"; | ||||||
|  | const char MainMenuItem1[] 		PROGMEM = "\r\n1) List devices"; | ||||||
|  | const char MainMenuItem2[]		PROGMEM = "\r\n2) Selected device : "; | ||||||
|  | const char MainMenuItemQuit[]	PROGMEM = "\r\nq) Quit"; | ||||||
|  | const char MainMenuItemPrompt[]	PROGMEM = "\r\n# "; | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								Rmodule/rmodule.aws
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Rmodule/rmodule.aws
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | <AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA8"/><Files><File00000 Name="C:\Hard\Git\Rmodule\main.c" Position="268 118 1398 608" LineCol="7 0"/><File00001 Name="C:\Hard\Git\Rmodule\res\strings.h" Position="290 140 1434 622" LineCol="10 0"/></Files></AVRWorkspace> | ||||||
							
								
								
									
										663
									
								
								Rmodule/uart/uart.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										663
									
								
								Rmodule/uart/uart.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,663 @@ | |||||||
|  | /************************************************************************* | ||||||
|  | Title:    Interrupt UART library with receive/transmit circular buffers | ||||||
|  | Author:   Peter Fleury <pfleury@gmx.ch>   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 <avr/io.h> | ||||||
|  | #include <avr/interrupt.h> | ||||||
|  | #include <avr/pgmspace.h> | ||||||
|  | #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<<U2X);  //Enable 2x speed  | ||||||
|  |     	 baudrate &= ~0x8000; | ||||||
|  |     } | ||||||
|  |     UBRRH = (unsigned char)(baudrate>>8); | ||||||
|  |     UBRRL = (unsigned char) baudrate; | ||||||
|  |     | ||||||
|  |     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||||
|  |     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN); | ||||||
|  |      | ||||||
|  |     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */ | ||||||
|  |     #ifdef URSEL | ||||||
|  |     UCSRC = (1<<URSEL)|(3<<UCSZ0); | ||||||
|  |     #else | ||||||
|  |     UCSRC = (3<<UCSZ0); | ||||||
|  |     #endif  | ||||||
|  |      | ||||||
|  | #elif defined (ATMEGA_USART0 ) | ||||||
|  |     /* Set baud rate */ | ||||||
|  |     if ( baudrate & 0x8000 )  | ||||||
|  |     { | ||||||
|  |    		UART0_STATUS = (1<<U2X0);  //Enable 2x speed  | ||||||
|  |    		baudrate &= ~0x8000; | ||||||
|  |    	} | ||||||
|  |     UBRR0H = (unsigned char)(baudrate>>8); | ||||||
|  |     UBRR0L = (unsigned char) baudrate; | ||||||
|  |  | ||||||
|  |     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||||
|  |     UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0); | ||||||
|  |      | ||||||
|  |     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */ | ||||||
|  |     #ifdef URSEL0 | ||||||
|  |     UCSR0C = (1<<URSEL0)|(3<<UCSZ00); | ||||||
|  |     #else | ||||||
|  |     UCSR0C = (3<<UCSZ00); | ||||||
|  |     #endif  | ||||||
|  |  | ||||||
|  | #elif defined ( ATMEGA_UART ) | ||||||
|  |     /* set baud rate */ | ||||||
|  |     if ( baudrate & 0x8000 )  | ||||||
|  |     { | ||||||
|  |     	UART0_STATUS = (1<<U2X);  //Enable 2x speed  | ||||||
|  |     	baudrate &= ~0x8000; | ||||||
|  |     } | ||||||
|  |     UBRRHI = (unsigned char)(baudrate>>8); | ||||||
|  |     UBRR   = (unsigned char) baudrate; | ||||||
|  |  | ||||||
|  |     /* Enable UART receiver and transmitter and receive complete interrupt */ | ||||||
|  |     UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN); | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | }/* uart_init */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart_getc() | ||||||
|  | Purpose:  return byte from ringbuffer   | ||||||
|  | Returns:  lower byte:  received byte from ringbuffer | ||||||
|  |           higher byte: last receive error | ||||||
|  | **************************************************************************/ | ||||||
|  | unsigned int uart_getc(void) | ||||||
|  | {     | ||||||
|  |     unsigned char tmptail; | ||||||
|  |     unsigned char data; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     if ( UART_RxHead == UART_RxTail ) { | ||||||
|  |         return UART_NO_DATA;   /* no data available */ | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /* calculate /store buffer index */ | ||||||
|  |     tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK; | ||||||
|  |     UART_RxTail = tmptail;  | ||||||
|  |      | ||||||
|  |     /* get data from receive buffer */ | ||||||
|  |     data = UART_RxBuf[tmptail]; | ||||||
|  |      | ||||||
|  |     data = (UART_LastRxError << 8) + data; | ||||||
|  |     UART_LastRxError = 0; | ||||||
|  |     return data; | ||||||
|  |  | ||||||
|  | }/* uart_getc */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart_putc() | ||||||
|  | Purpose:  write byte to ringbuffer for transmitting via UART | ||||||
|  | Input:    byte to be transmitted | ||||||
|  | Returns:  none           | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart_putc(unsigned char data) | ||||||
|  | { | ||||||
|  |     unsigned char tmphead; | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK; | ||||||
|  |      | ||||||
|  |     while ( tmphead == UART_TxTail ){ | ||||||
|  |         ;/* wait for free space in buffer */ | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     UART_TxBuf[tmphead] = data; | ||||||
|  |     UART_TxHead = tmphead; | ||||||
|  |  | ||||||
|  |     /* enable UDRE interrupt */ | ||||||
|  |     UART0_CONTROL    |= _BV(UART0_UDRIE); | ||||||
|  |  | ||||||
|  | }/* uart_putc */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart_puts() | ||||||
|  | Purpose:  transmit string to UART | ||||||
|  | Input:    string to be transmitted | ||||||
|  | Returns:  none           | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart_puts(const char *s ) | ||||||
|  | { | ||||||
|  |     while (*s)  | ||||||
|  |       uart_putc(*s++); | ||||||
|  |  | ||||||
|  | }/* uart_puts */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart_puts_p() | ||||||
|  | Purpose:  transmit string from program memory to UART | ||||||
|  | Input:    program memory string to be transmitted | ||||||
|  | Returns:  none | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart_puts_p(const char *progmem_s ) | ||||||
|  | { | ||||||
|  |     register char c; | ||||||
|  |      | ||||||
|  |     while ( (c = pgm_read_byte(progmem_s++)) )  | ||||||
|  |       uart_putc(c); | ||||||
|  |  | ||||||
|  | }/* uart_puts_p */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * these functions are only for ATmegas with two USART | ||||||
|  |  */ | ||||||
|  | #if defined( ATMEGA_USART1 ) | ||||||
|  |  | ||||||
|  | ISR(UART1_RECEIVE_INTERRUPT) | ||||||
|  | /************************************************************************* | ||||||
|  | Function: UART1 Receive Complete interrupt | ||||||
|  | Purpose:  called when the UART1 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  = UART1_STATUS; | ||||||
|  |     data = UART1_DATA; | ||||||
|  |      | ||||||
|  |     /* */ | ||||||
|  |     lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); | ||||||
|  |          | ||||||
|  |     /* calculate buffer index */  | ||||||
|  |     tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK; | ||||||
|  |      | ||||||
|  |     if ( tmphead == UART1_RxTail ) { | ||||||
|  |         /* error: receive buffer overflow */ | ||||||
|  |         lastRxError = UART_BUFFER_OVERFLOW >> 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<<U2X1);  //Enable 2x speed  | ||||||
|  |       baudrate &= ~0x8000; | ||||||
|  |     } | ||||||
|  |     UBRR1H = (unsigned char)(baudrate>>8); | ||||||
|  |     UBRR1L = (unsigned char) baudrate; | ||||||
|  |  | ||||||
|  |     /* Enable USART receiver and transmitter and receive complete interrupt */ | ||||||
|  |     UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1); | ||||||
|  |      | ||||||
|  |     /* Set frame format: asynchronous, 8data, no parity, 1stop bit */    | ||||||
|  |     #ifdef URSEL1 | ||||||
|  |     UCSR1C = (1<<URSEL1)|(3<<UCSZ10); | ||||||
|  |     #else | ||||||
|  |     UCSR1C = (3<<UCSZ10); | ||||||
|  |     #endif  | ||||||
|  | }/* uart_init */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart1_getc() | ||||||
|  | Purpose:  return byte from ringbuffer   | ||||||
|  | Returns:  lower byte:  received byte from ringbuffer | ||||||
|  |           higher byte: last receive error | ||||||
|  | **************************************************************************/ | ||||||
|  | unsigned int uart1_getc(void) | ||||||
|  | {     | ||||||
|  |     unsigned char tmptail; | ||||||
|  |     unsigned char data; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     if ( UART1_RxHead == UART1_RxTail ) { | ||||||
|  |         return UART_NO_DATA;   /* no data available */ | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /* calculate /store buffer index */ | ||||||
|  |     tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK; | ||||||
|  |     UART1_RxTail = tmptail;  | ||||||
|  |      | ||||||
|  |     /* get data from receive buffer */ | ||||||
|  |     data = UART1_RxBuf[tmptail]; | ||||||
|  |      | ||||||
|  |     data = (UART1_LastRxError << 8) + data; | ||||||
|  |     UART1_LastRxError = 0; | ||||||
|  |     return data; | ||||||
|  |  | ||||||
|  | }/* uart1_getc */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart1_putc() | ||||||
|  | Purpose:  write byte to ringbuffer for transmitting via UART | ||||||
|  | Input:    byte to be transmitted | ||||||
|  | Returns:  none           | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart1_putc(unsigned char data) | ||||||
|  | { | ||||||
|  |     unsigned char tmphead; | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     tmphead  = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK; | ||||||
|  |      | ||||||
|  |     while ( tmphead == UART1_TxTail ){ | ||||||
|  |         ;/* wait for free space in buffer */ | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     UART1_TxBuf[tmphead] = data; | ||||||
|  |     UART1_TxHead = tmphead; | ||||||
|  |  | ||||||
|  |     /* enable UDRE interrupt */ | ||||||
|  |     UART1_CONTROL    |= _BV(UART1_UDRIE); | ||||||
|  |  | ||||||
|  | }/* uart1_putc */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart1_puts() | ||||||
|  | Purpose:  transmit string to UART1 | ||||||
|  | Input:    string to be transmitted | ||||||
|  | Returns:  none           | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart1_puts(const char *s ) | ||||||
|  | { | ||||||
|  |     while (*s)  | ||||||
|  |       uart1_putc(*s++); | ||||||
|  |  | ||||||
|  | }/* uart1_puts */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************* | ||||||
|  | Function: uart1_puts_p() | ||||||
|  | Purpose:  transmit string from program memory to UART1 | ||||||
|  | Input:    program memory string to be transmitted | ||||||
|  | Returns:  none | ||||||
|  | **************************************************************************/ | ||||||
|  | void uart1_puts_p(const char *progmem_s ) | ||||||
|  | { | ||||||
|  |     register char c; | ||||||
|  |      | ||||||
|  |     while ( (c = pgm_read_byte(progmem_s++)) )  | ||||||
|  |       uart1_putc(c); | ||||||
|  |  | ||||||
|  | }/* uart1_puts_p */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										195
									
								
								Rmodule/uart/uart.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								Rmodule/uart/uart.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,195 @@ | |||||||
|  | #ifndef UART_H | ||||||
|  | #define UART_H | ||||||
|  | /************************************************************************ | ||||||
|  | Title:    Interrupt UART library with receive/transmit circular buffers | ||||||
|  | Author:   Peter Fleury <pfleury@gmx.ch>   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 <uart.h> @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            | ||||||
|  |  *             <br>no receive data available | ||||||
|  |  *           - \b UART_BUFFER_OVERFLOW    | ||||||
|  |  *             <br>Receive ringbuffer overflow. | ||||||
|  |  *             We are not reading the receive buffer fast enough,  | ||||||
|  |  *             one or more received character have been dropped  | ||||||
|  |  *           - \b UART_OVERRUN_ERROR      | ||||||
|  |  *             <br>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        | ||||||
|  |  *             <br>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  | ||||||
|  |  | ||||||
							
								
								
									
										118
									
								
								Rmodule/uart/uart_addon.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								Rmodule/uart/uart_addon.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | |||||||
|  | /************************************************************************* | ||||||
|  | Title:     UART addon-library  | ||||||
|  | Author:    Martin Thomas <eversmith@heizung-thomas.de>    | ||||||
|  |            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 <stdlib.h> | ||||||
|  |  | ||||||
|  | #include <avr/io.h> | ||||||
|  | #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 */ | ||||||
							
								
								
									
										121
									
								
								Rmodule/uart/uart_addon.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								Rmodule/uart/uart_addon.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | |||||||
|  | #ifndef UART_ADDON_H | ||||||
|  | #define UART_ADDON_H | ||||||
|  | /************************************************************************ | ||||||
|  | Title:     UART addon-library  | ||||||
|  | Author:    Martin Thomas <eversmith@heizung-thomas.de>    | ||||||
|  |            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 <uart_addon.h> @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 */ | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user