From ed8753a873b8b04f0d201745446457a4b6609631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Ple=C3=9F?= Date: Tue, 25 Mar 2014 18:08:27 +0100 Subject: [PATCH] moved new servo display code accordingly --- display/software/displayboard_servo/Makefile | 276 ++++++++++ .../displayboard_servo/displayboard.iml | 12 + .../displayboard_servo/src/.main.c.swp | Bin 0 -> 20480 bytes .../software/displayboard_servo/src/main.c | 254 ++++++++++ .../software/displayboard_servo/src/main.h | 29 ++ .../software/displayboard_servo/src/uart.c | 479 ++++++++++++++++++ .../software/displayboard_servo/src/uart.h | 180 +++++++ .../software/displayboard_servo/src/utils.c | 39 ++ .../software/displayboard_servo/src/utils.h | 12 + 9 files changed, 1281 insertions(+) create mode 100644 display/software/displayboard_servo/Makefile create mode 100644 display/software/displayboard_servo/displayboard.iml create mode 100644 display/software/displayboard_servo/src/.main.c.swp create mode 100644 display/software/displayboard_servo/src/main.c create mode 100644 display/software/displayboard_servo/src/main.h create mode 100644 display/software/displayboard_servo/src/uart.c create mode 100644 display/software/displayboard_servo/src/uart.h create mode 100644 display/software/displayboard_servo/src/utils.c create mode 100644 display/software/displayboard_servo/src/utils.h diff --git a/display/software/displayboard_servo/Makefile b/display/software/displayboard_servo/Makefile new file mode 100644 index 0000000..bbb562c --- /dev/null +++ b/display/software/displayboard_servo/Makefile @@ -0,0 +1,276 @@ +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# To rebuild project do "make clean" then "make all". +# + +MCU = atmega32 +F_CPU = 8000000 + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main + +SRC = src/$(TARGET).c src/utils.c src/uart.c + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = src/ + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +# Compiler flags. +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) +CFLAGS += -DF_CPU=$(F_CPU) #-DDEBUG + + + +# External memory options + + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref + + +# Programming support using avrdude. Settings and variables. +AVRDUDE_PROGRAMMER = usbasp +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + +AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER) + + +# --------------------------------------------------------------------------- + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp + + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + + +# Compiler flags to generate dependency files. +### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program + diff --git a/display/software/displayboard_servo/displayboard.iml b/display/software/displayboard_servo/displayboard.iml new file mode 100644 index 0000000..7694e87 --- /dev/null +++ b/display/software/displayboard_servo/displayboard.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/display/software/displayboard_servo/src/.main.c.swp b/display/software/displayboard_servo/src/.main.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..9dfaf30fdf57e086e7628e1ac4055f0986f7d15b GIT binary patch literal 20480 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 +#include +#include +#include +#include +#include +#include "utils.h" +#include "main.h" +#include "uart.h" + +#define BUFSIZE 40 +#define CURRENT_MAX 30000 // 30 Ampere is max + +volatile uint16_t syscounter = 0; +volatile uint8_t digitbuffer[6] = { 0,0,0,0,0,0 }; +volatile uint8_t leddigitbuffer[4] = { 0,0,0,0 }; +uint8_t digit = 0; +uint8_t leddigit = 0; + +// values send over uart from powerboard +uint16_t voltage = 0; +int16_t current_in = 0; +int16_t current_out = 0; +uint8_t dumpsw = 0; //TODO: make bitfield +uint8_t loadsw = 0; //TODO: make bitfield +uint8_t gensw = 0; //TODO: make bitfield +uint16_t display = 0; + +uint16_t power_gen = 0; +uint16_t power_load = 0; + +unsigned char data_count = 0; +unsigned char data_in[BUFSIZE]; +char command_in[BUFSIZE]; + +const uint8_t segment_translate[10] = { + 63, 6, 91, 79, 102, 109, 125, 7, 127, 111 +}; + +const uint8_t smallbar_translate[9] = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff +}; + +const uint8_t bigbar_translate[15][2] = { + { 0x00, 0xc0}, + { 0x00, 0x60}, + { 0x00, 0x30}, + { 0x00, 0x18}, + { 0x00, 0x0c}, + { 0x00, 0x06}, + { 0x00, 0x03}, + { 0x01, 0x01}, + { 0x03, 0x00}, + { 0x06, 0x00}, + { 0x0c, 0x00}, + { 0x18, 0x00}, + { 0x30, 0x00}, + { 0x60, 0x00}, + { 0xc0, 0x00} +}; + + + +//static void timer_init(void) { + // clock is 8MHz + //TCCR1B |= _BV(WGM12) | _BV(CS11) | _BV(CS10) ; // CTC Mode for Timer 1 (16Bit) with prescale of 64 + //OCR1A = 250; // 500Hz + //TIMSK = _BV(OCIE1A); + //sei(); // enable interrupts +//} +// Timer init +ISR( TIMER1_COMPA_vect ) // Interruptbehandlungsroutine +{ + OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von + // Periodenlänge (2500*0,008ms=20ms) und letztem + // Vergleichswert (OCR1A) gebildet +} + +static void ports_init(void) { + // make column / digit driver pins to output + DDRB = 0b11111100; + PORTB = (1<= 100) { + uart_putc('a'); // send a to receive values + set_servo(power_gen) + + + + syscounter = 0; + } + } + + return(0); +} + +// system timer +SIGNAL(TIMER1_COMPA_vect) { + syscounter++; + + // output to sevensegment and leds + // make this here to reduce display flicker + digit++; + if(digit >5) digit = 0; + leddigit++; + if(leddigit >3) leddigit = 0; + + SEVENSEG_PORT = digitbuffer[digit]; + SEVENSEGDIG_PORT = _BV(digit+DIG0); + + LED_PORT = leddigitbuffer[leddigit]; + LEDDIG_PORT = _BV(leddigit); +} + + diff --git a/display/software/displayboard_servo/src/main.h b/display/software/displayboard_servo/src/main.h new file mode 100644 index 0000000..f4f9033 --- /dev/null +++ b/display/software/displayboard_servo/src/main.h @@ -0,0 +1,29 @@ +#ifndef _main_h + #define _main_h + + #define SEVENSEG_PORT PORTA + #define SEVENSEG_DDR DDRA + + #define LED_PORT PORTC + #define LED_DDR DDRC + + #define DIG0 PD2 + #define DIG1 PD3 + #define DIG2 PD4 + #define DIG3 PD5 + #define DIG4 PD6 + #define DIG5 PD7 + #define LEDS_MID1 PB0 + #define LEDS_MID2 PB1 + #define LEDS_LOAD PB2 + #define LEDS_GEN PB3 + + #define SEVENSEGDIG_PORT PORTD + #define SEVENSEGDIG_DDR DDRD + + #define LEDDIG_PORT PORTB + #define LEDDIG_DDR DDRB + + +#endif + diff --git a/display/software/displayboard_servo/src/uart.c b/display/software/displayboard_servo/src/uart.c new file mode 100644 index 0000000..c29ef62 --- /dev/null +++ b/display/software/displayboard_servo/src/uart.c @@ -0,0 +1,479 @@ +/************************************************************************* +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< 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)) + + + + +#endif // UART_H + diff --git a/display/software/displayboard_servo/src/utils.c b/display/software/displayboard_servo/src/utils.c new file mode 100644 index 0000000..6a5caca --- /dev/null +++ b/display/software/displayboard_servo/src/utils.c @@ -0,0 +1,39 @@ +#include +#include +#include "uart.h" + +void wait(uint8_t count) { + uint8_t i; + if(count == 0) count = 100; + for(i=0;i