/programy/C/avr/akcelerometr/uart.h |
---|
File deleted |
Property changes: |
Deleted: svn:executable |
-* |
\ No newline at end of property |
/programy/C/avr/akcelerometr/uart.c |
---|
File deleted |
Property changes: |
Deleted: svn:executable |
-* |
\ No newline at end of property |
/programy/C/avr/akcelerometr/a2dtest.c |
---|
23,13 → 23,13 |
*sec=(u08)round((pom-(*min))*60); |
} |
inline double quadraticerror(double average, double buf[], u16 size) |
inline double quadraticerror(double average, double buf[], u16 size) // compute average quadratic error |
{ |
u16 i; |
double err=0; |
for(i=0; i<size; i++) err += square(buf[i]-average); // sum quadratic errors |
err = sqrt(err/(size-1))/sqrt(size); // compute average quadratic error |
err = sqrt((1/size)*err); |
return err; |
} |
36,11 → 36,11 |
int main(void) |
{ |
u16 i,x,y; |
double fi, err, fibuf[BUFLEN]; |
u08 fi_min, fi_sec, err_min, err_sec; |
u16 fi_deg, err_deg; |
double fi, err, fibuf[BUFLEN]; // buffer for recorded and computed values |
u08 fi_min, fi_sec, err_min, err_sec; // computed angles |
u16 fi_deg, err_deg; // computed angles in whole degrees |
// initialize our libraries |
// initialize some libraries |
// initialize the UART (serial port) |
uartInit(); |
uartSetBaudRate(0,9600); |
86,11 → 86,6 |
for(i=0; i<BUFLEN; i++) fi += fibuf[i]; // sum recorded angles |
fi = (fi/BUFLEN)+PI; // average recorded angles and expand product to whole circle |
/*for(i=0; i<BUFLEN; i++) |
{ |
fibuf[i]=i; |
}*/ |
err=quadraticerror(fi,fibuf,BUFLEN); |
radtodeg(fi,&fi_deg,&fi_min,&fi_sec); |
radtodeg(err,&err_deg,&err_min,&err_sec); |
/programy/C/avr/akcelerometr/uart2.c |
---|
0,0 → 1,379 |
/*! \file uart2.c \brief Dual UART driver with buffer support. */ |
//***************************************************************************** |
// |
// File Name : 'uart2.c' |
// Title : Dual UART driver with buffer support |
// Author : Pascal Stang - Copyright (C) 2000-2004 |
// Created : 11/20/2000 |
// Revised : 07/04/2004 |
// Version : 1.0 |
// Target MCU : ATMEL AVR Series |
// Editor Tabs : 4 |
// |
// Description : This is a UART driver for AVR-series processors with two |
// hardware UARTs such as the mega161 and mega128 |
// |
// This code is distributed under the GNU Public License |
// which can be found at http://www.gnu.org/licenses/gpl.txt |
// |
//***************************************************************************** |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include "buffer.h" |
#include "uart2.h" |
// UART global variables |
// flag variables |
volatile u08 uartReadyTx[2]; |
volatile u08 uartBufferedTx[2]; |
// receive and transmit buffers |
cBuffer uartRxBuffer[2]; |
cBuffer uartTxBuffer[2]; |
unsigned short uartRxOverflow[2]; |
#ifndef UART_BUFFER_EXTERNAL_RAM |
// using internal ram, |
// automatically allocate space in ram for each buffer |
static char uart0RxData[UART0_RX_BUFFER_SIZE]; |
static char uart0TxData[UART0_TX_BUFFER_SIZE]; |
static char uart1RxData[UART1_RX_BUFFER_SIZE]; |
static char uart1TxData[UART1_TX_BUFFER_SIZE]; |
#endif |
typedef void (*voidFuncPtru08)(unsigned char); |
volatile static voidFuncPtru08 UartRxFunc[2]; |
void uartInit(void) |
{ |
// initialize both uarts |
uart0Init(); |
uart1Init(); |
} |
void uart0Init(void) |
{ |
// initialize the buffers |
uart0InitBuffers(); |
// initialize user receive handlers |
UartRxFunc[0] = 0; |
// enable RxD/TxD and interrupts |
outb(UCSR0B, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN)); |
// set default baud rate |
uartSetBaudRate(0, UART0_DEFAULT_BAUD_RATE); |
// initialize states |
uartReadyTx[0] = TRUE; |
uartBufferedTx[0] = FALSE; |
// clear overflow count |
uartRxOverflow[0] = 0; |
// enable interrupts |
sei(); |
} |
void uart1Init(void) |
{ |
// initialize the buffers |
uart1InitBuffers(); |
// initialize user receive handlers |
UartRxFunc[1] = 0; |
// enable RxD/TxD and interrupts |
outb(UCSR1B, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN)); |
// set default baud rate |
uartSetBaudRate(1, UART1_DEFAULT_BAUD_RATE); |
// initialize states |
uartReadyTx[1] = TRUE; |
uartBufferedTx[1] = FALSE; |
// clear overflow count |
uartRxOverflow[1] = 0; |
// enable interrupts |
sei(); |
} |
void uart0InitBuffers(void) |
{ |
#ifndef UART_BUFFER_EXTERNAL_RAM |
// initialize the UART0 buffers |
bufferInit(&uartRxBuffer[0], uart0RxData, UART0_RX_BUFFER_SIZE); |
bufferInit(&uartTxBuffer[0], uart0TxData, UART0_TX_BUFFER_SIZE); |
#else |
// initialize the UART0 buffers |
bufferInit(&uartRxBuffer[0], (u08*) UART0_RX_BUFFER_ADDR, UART0_RX_BUFFER_SIZE); |
bufferInit(&uartTxBuffer[0], (u08*) UART0_TX_BUFFER_ADDR, UART0_TX_BUFFER_SIZE); |
#endif |
} |
void uart1InitBuffers(void) |
{ |
#ifndef UART_BUFFER_EXTERNAL_RAM |
// initialize the UART1 buffers |
bufferInit(&uartRxBuffer[1], uart1RxData, UART1_RX_BUFFER_SIZE); |
bufferInit(&uartTxBuffer[1], uart1TxData, UART1_TX_BUFFER_SIZE); |
#else |
// initialize the UART1 buffers |
bufferInit(&uartRxBuffer[1], (u08*) UART1_RX_BUFFER_ADDR, UART1_RX_BUFFER_SIZE); |
bufferInit(&uartTxBuffer[1], (u08*) UART1_TX_BUFFER_ADDR, UART1_TX_BUFFER_SIZE); |
#endif |
} |
void uartSetRxHandler(u08 nUart, void (*rx_func)(unsigned char c)) |
{ |
// make sure the uart number is within bounds |
if(nUart < 2) |
{ |
// set the receive interrupt to run the supplied user function |
UartRxFunc[nUart] = rx_func; |
} |
} |
void uartSetBaudRate(u08 nUart, u32 baudrate) |
{ |
// calculate division factor for requested baud rate, and set it |
u16 bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1); |
if(nUart) |
{ |
outb(UBRR1L, bauddiv); |
#ifdef UBRR1H |
outb(UBRR1H, bauddiv>>8); |
#endif |
} |
else |
{ |
outb(UBRR0L, bauddiv); |
#ifdef UBRR0H |
outb(UBRR0H, bauddiv>>8); |
#endif |
} |
} |
cBuffer* uartGetRxBuffer(u08 nUart) |
{ |
// return rx buffer pointer |
return &uartRxBuffer[nUart]; |
} |
cBuffer* uartGetTxBuffer(u08 nUart) |
{ |
// return tx buffer pointer |
return &uartTxBuffer[nUart]; |
} |
void uartSendByte(u08 nUart, u08 txData) |
{ |
// wait for the transmitter to be ready |
// while(!uartReadyTx[nUart]); |
// send byte |
if(nUart) |
{ |
while(!(UCSR1A & (1<<UDRE))); |
outb(UDR1, txData); |
} |
else |
{ |
while(!(UCSR0A & (1<<UDRE))); |
outb(UDR0, txData); |
} |
// set ready state to FALSE |
uartReadyTx[nUart] = FALSE; |
} |
void uart0SendByte(u08 data) |
{ |
// send byte on UART0 |
uartSendByte(0, data); |
} |
void uart1SendByte(u08 data) |
{ |
// send byte on UART1 |
uartSendByte(1, data); |
} |
int uart0GetByte(void) |
{ |
// get single byte from receive buffer (if available) |
u08 c; |
if(uartReceiveByte(0,&c)) |
return c; |
else |
return -1; |
} |
int uart1GetByte(void) |
{ |
// get single byte from receive buffer (if available) |
u08 c; |
if(uartReceiveByte(1,&c)) |
return c; |
else |
return -1; |
} |
u08 uartReceiveByte(u08 nUart, u08* rxData) |
{ |
// make sure we have a receive buffer |
if(uartRxBuffer[nUart].size) |
{ |
// make sure we have data |
if(uartRxBuffer[nUart].datalength) |
{ |
// get byte from beginning of buffer |
*rxData = bufferGetFromFront(&uartRxBuffer[nUart]); |
return TRUE; |
} |
else |
return FALSE; // no data |
} |
else |
return FALSE; // no buffer |
} |
void uartFlushReceiveBuffer(u08 nUart) |
{ |
// flush all data from receive buffer |
bufferFlush(&uartRxBuffer[nUart]); |
} |
u08 uartReceiveBufferIsEmpty(u08 nUart) |
{ |
return (uartRxBuffer[nUart].datalength == 0); |
} |
void uartAddToTxBuffer(u08 nUart, u08 data) |
{ |
// add data byte to the end of the tx buffer |
bufferAddToEnd(&uartTxBuffer[nUart], data); |
} |
void uart0AddToTxBuffer(u08 data) |
{ |
uartAddToTxBuffer(0,data); |
} |
void uart1AddToTxBuffer(u08 data) |
{ |
uartAddToTxBuffer(1,data); |
} |
void uartSendTxBuffer(u08 nUart) |
{ |
// turn on buffered transmit |
uartBufferedTx[nUart] = TRUE; |
// send the first byte to get things going by interrupts |
uartSendByte(nUart, bufferGetFromFront(&uartTxBuffer[nUart])); |
} |
u08 uartSendBuffer(u08 nUart, char *buffer, u16 nBytes) |
{ |
register u08 first; |
register u16 i; |
// check if there's space (and that we have any bytes to send at all) |
if((uartTxBuffer[nUart].datalength + nBytes < uartTxBuffer[nUart].size) && nBytes) |
{ |
// grab first character |
first = *buffer++; |
// copy user buffer to uart transmit buffer |
for(i = 0; i < nBytes-1; i++) |
{ |
// put data bytes at end of buffer |
bufferAddToEnd(&uartTxBuffer[nUart], *buffer++); |
} |
// send the first byte to get things going by interrupts |
uartBufferedTx[nUart] = TRUE; |
uartSendByte(nUart, first); |
// return success |
return TRUE; |
} |
else |
{ |
// return failure |
return FALSE; |
} |
} |
// UART Transmit Complete Interrupt Function |
void uartTransmitService(u08 nUart) |
{ |
// check if buffered tx is enabled |
if(uartBufferedTx[nUart]) |
{ |
// check if there's data left in the buffer |
if(uartTxBuffer[nUart].datalength) |
{ |
// send byte from top of buffer |
if(nUart) |
outb(UDR1, bufferGetFromFront(&uartTxBuffer[1]) ); |
else |
outb(UDR0, bufferGetFromFront(&uartTxBuffer[0]) ); |
} |
else |
{ |
// no data left |
uartBufferedTx[nUart] = FALSE; |
// return to ready state |
uartReadyTx[nUart] = TRUE; |
} |
} |
else |
{ |
// we're using single-byte tx mode |
// indicate transmit complete, back to ready |
uartReadyTx[nUart] = TRUE; |
} |
} |
// UART Receive Complete Interrupt Function |
void uartReceiveService(u08 nUart) |
{ |
u08 c; |
// get received char |
if(nUart) |
c = inb(UDR1); |
else |
c = inb(UDR0); |
// if there's a user function to handle this receive event |
if(UartRxFunc[nUart]) |
{ |
// call it and pass the received data |
UartRxFunc[nUart](c); |
} |
else |
{ |
// otherwise do default processing |
// put received char in buffer |
// check if there's space |
if( !bufferAddToEnd(&uartRxBuffer[nUart], c) ) |
{ |
// no space in buffer |
// count overflow |
uartRxOverflow[nUart]++; |
} |
} |
} |
UART_INTERRUPT_HANDLER(SIG_UART0_TRANS) |
{ |
// service UART0 transmit interrupt |
uartTransmitService(0); |
} |
UART_INTERRUPT_HANDLER(SIG_UART1_TRANS) |
{ |
// service UART1 transmit interrupt |
uartTransmitService(1); |
} |
UART_INTERRUPT_HANDLER(SIG_UART0_RECV) |
{ |
// service UART0 receive interrupt |
uartReceiveService(0); |
} |
UART_INTERRUPT_HANDLER(SIG_UART1_RECV) |
{ |
// service UART1 receive interrupt |
uartReceiveService(1); |
} |
/programy/C/avr/akcelerometr/uart2.h |
---|
0,0 → 1,213 |
/*! \file uart2.h \brief Dual UART driver with buffer support. */ |
//***************************************************************************** |
// |
// File Name : 'uart2.h' |
// Title : Dual UART driver with buffer support |
// Author : Pascal Stang - Copyright (C) 2000-2002 |
// Created : 11/20/2000 |
// Revised : 07/04/2004 |
// Version : 1.0 |
// Target MCU : ATMEL AVR Series |
// Editor Tabs : 4 |
// |
// This code is distributed under the GNU Public License |
// which can be found at http://www.gnu.org/licenses/gpl.txt |
// |
/// \ingroup driver_avr |
/// \defgroup uart2 UART Driver/Function Library for dual-UART processors (uart2.c) |
/// \code #include "uart2.h" \endcode |
/// \par Overview |
/// This is a UART driver for AVR-series processors with two hardware |
/// UARTs such as the mega161 and mega128. This library provides both |
/// buffered and unbuffered transmit and receive functions for the AVR |
/// processor UART. Buffered access means that the UART can transmit |
/// and receive data in the "background", while your code continues |
/// executing. Also included are functions to initialize the UARTs, |
/// set the baud rate, flush the buffers, and check buffer status. |
/// |
/// \note For full text output functionality, you may wish to use the rprintf |
/// functions along with this driver. |
/// |
/// \par About UART operations |
/// Most Atmel AVR-series processors contain one or more hardware UARTs |
/// (aka, serial ports). UART serial ports can communicate with other |
/// serial ports of the same type, like those used on PCs. In general, |
/// UARTs are used to communicate with devices that are RS-232 compatible |
/// (RS-232 is a certain kind of serial port). |
/// \par |
/// By far, the most common use for serial communications on AVR processors |
/// is for sending information and data to a PC running a terminal program. |
/// Here is an exmaple: |
/// \code |
/// uartInit(); // initialize UARTs (serial ports) |
/// uartSetBaudRate(0, 9600); // set UART0 speed to 9600 baud |
/// uartSetBaudRate(1, 115200); // set UART1 speed to 115200 baud |
/// |
/// rprintfInit(uart0SendByte); // configure rprintf to use UART0 for output |
/// rprintf("Hello UART0\r\n"); // send "hello world" message via UART0 |
/// |
/// rprintfInit(uart1SendByte); // configure rprintf to use UART1 for output |
/// rprintf("Hello UART1\r\n"); // send "hello world" message via UART1 |
/// \endcode |
/// |
/// \warning The CPU frequency (F_CPU) must be set correctly in \c global.h |
/// for the UART library to calculate correct baud rates. Furthermore, |
/// certain CPU frequencies will not produce exact baud rates due to |
/// integer frequency division round-off. See your AVR processor's |
/// datasheet for full details. |
// |
//***************************************************************************** |
//@{ |
#ifndef UART2_H |
#define UART2_H |
#include "global.h" |
#include "buffer.h" |
//! Default uart baud rate. |
/// This is the default speed after a uartInit() command, |
/// and can be changed by using uartSetBaudRate(). |
#define UART0_DEFAULT_BAUD_RATE 9600 ///< default baud rate for UART0 |
#define UART1_DEFAULT_BAUD_RATE 9600 ///< default baud rate for UART1 |
// buffer memory allocation defines |
// buffer sizes |
#ifndef UART0_TX_BUFFER_SIZE |
#define UART0_TX_BUFFER_SIZE 0x0010 ///< number of bytes for uart0 transmit buffer |
#endif |
#ifndef UART0_RX_BUFFER_SIZE |
#define UART0_RX_BUFFER_SIZE 0x0080 ///< number of bytes for uart0 receive buffer |
#endif |
#ifndef UART1_TX_BUFFER_SIZE |
#define UART1_TX_BUFFER_SIZE 0x0010 ///< number of bytes for uart1 transmit buffer |
#endif |
#ifndef UART1_RX_BUFFER_SIZE |
#define UART1_RX_BUFFER_SIZE 0x0080 ///< number of bytes for uart1 receive buffer |
#endif |
// define this key if you wish to use |
// external RAM for the UART buffers |
//#define UART_BUFFER_EXTERNAL_RAM |
#ifdef UART_BUFFER_EXTERNAL_RAM |
// absolute address of uart0 buffers |
#define UART0_TX_BUFFER_ADDR 0x1000 |
#define UART0_RX_BUFFER_ADDR 0x1100 |
// absolute address of uart1 buffers |
#define UART1_TX_BUFFER_ADDR 0x1200 |
#define UART1_RX_BUFFER_ADDR 0x1300 |
#endif |
//! Type of interrupt handler to use for uart interrupts. |
/// Value may be SIGNAL or INTERRUPT. |
/// \warning Do not change unless you know what you're doing. |
#ifndef UART_INTERRUPT_HANDLER |
#define UART_INTERRUPT_HANDLER SIGNAL |
#endif |
// compatibility for the mega161 |
#ifndef RXCIE |
#define RXCIE RXCIE0 |
#define TXCIE TXCIE0 |
#define UDRIE UDRIE0 |
#define RXEN RXEN0 |
#define TXEN TXEN0 |
#define CHR9 CHR90 |
#define RXB8 RXB80 |
#define TXB8 TXB80 |
#endif |
#ifndef UBRR0L |
#define UBRR0L UBRR0 |
#define UBRR1L UBRR1 |
#endif |
// functions |
//! Initializes UARTs. |
/// \note After running this init function, the processor |
/// I/O pins that used for uart communications (RXD, TXD) |
/// are no long available for general purpose I/O. |
void uartInit(void); |
//! Initializes UART0 only. |
void uart0Init(void); |
//! Initializes UART1 only. |
void uart1Init(void); |
//! Initializes transmit and receive buffers. |
/// Automatically called from uartInit() |
void uart0InitBuffers(void); |
void uart1InitBuffers(void); |
//! Redirects received data to a user function. |
/// |
void uartSetRxHandler(u08 nUart, void (*rx_func)(unsigned char c)); |
//! Sets the uart baud rate. |
/// Argument should be in bits-per-second, like \c uartSetBaudRate(9600); |
void uartSetBaudRate(u08 nUart, u32 baudrate); |
//! Returns pointer to the receive buffer structure. |
/// |
cBuffer* uartGetRxBuffer(u08 nUart); |
//! Returns pointer to the transmit buffer structure. |
/// |
cBuffer* uartGetTxBuffer(u08 nUart); |
//! Sends a single byte over the uart. |
/// |
void uartSendByte(u08 nUart, u08 data); |
//! SendByte commands with the UART number hardcoded |
/// Use these with printfInit() - example: \c printfInit(uart0SendByte); |
void uart0SendByte(u08 data); |
void uart1SendByte(u08 data); |
//! Gets a single byte from the uart receive buffer. |
/// Returns the byte, or -1 if no byte is available (getchar-style). |
int uart0GetByte(void); |
int uart1GetByte(void); |
//! Gets a single byte from the uart receive buffer. |
/// Function returns TRUE if data was available, FALSE if not. |
/// Actual data is returned in variable pointed to by "data". |
/// Example usage: |
/// \code |
/// char myReceivedByte; |
/// uartReceiveByte(0, &myReceivedByte ); |
/// \endcode |
u08 uartReceiveByte(u08 nUart, u08* data); |
//! Returns TRUE/FALSE if receive buffer is empty/not-empty. |
/// |
u08 uartReceiveBufferIsEmpty(u08 nUart); |
//! Flushes (deletes) all data from receive buffer. |
/// |
void uartFlushReceiveBuffer(u08 nUart); |
//! Add byte to end of uart Tx buffer. |
/// |
void uartAddToTxBuffer(u08 nUart, u08 data); |
//! AddToTxBuffer commands with the UART number hardcoded |
/// Use this with printfInit() - example: \c printfInit(uart0AddToTxBuffer); |
void uart0AddToTxBuffer(u08 data); |
void uart1AddToTxBuffer(u08 data); |
//! Begins transmission of the transmit buffer under interrupt control. |
/// |
void uartSendTxBuffer(u08 nUart); |
//! sends a buffer of length nBytes via the uart using interrupt control. |
/// |
u08 uartSendBuffer(u08 nUart, char *buffer, u16 nBytes); |
//! interrupt service handlers |
void uartTransmitService(u08 nUart); |
void uartReceiveService(u08 nUart); |
#endif |