Nur in src/: #main.c#. Nur in src/: .#main.c. diff -uwr IAR/main.c src/main.c --- IAR/main.c 2006-05-08 14:25:58.000000000 +0200 +++ src/main.c 2008-04-24 13:40:44.000000000 +0200 @@ -21,8 +21,14 @@ * $Date: 2006/05/08 12:25:58 $ *****************************************************************************/ +#ifdef __GNUC__ +#include +#include +#include +#else #include #include +#endif #include #include "global.h" #include "uart.h" @@ -52,14 +58,23 @@ // Init of Timer/Counter1 speed_cntr_Init_Timer1(); +#ifdef __GNUC__ + sei(); +#else __enable_interrupt(); +#endif } /*! \brief Demo of linear speed controller. * * Serial interface frontend to test linear speed controller. */ -void main(void) +#ifdef __GNUC__ +int +#else +void +#endif +main(void) { // Number of steps to move. int steps = 1000; @@ -164,7 +179,15 @@ } //! Help message -__flash char Help[] = {"\n\r--------------------------------------------------------------\n\rAtmel AVR446 - Linear speed control of stepper motor\n\r\n\r? - Show help\n\ra [data] - Set acceleration (range: 71 - 32000)\n\rd [data] - Set deceleration (range: 71 - 32000)\n\rs [data] - Set speed (range: 12 - motor limit)\n\rm [data] - Move [data] steps (range: -64000 - 64000)\n\rmove [steps] [accel] [decel] [speed]\n\r - Move with all parameters given\n\r - Repeat last move\n\r\n\r acc/dec data given in 0.01*rad/sec^2 (100 = 1 rad/sec^2)\n\r speed data given in 0.01*rad/sec (100 = 1 rad/sec)\n\r--------------------------------------------------------------\n\r"}; +#ifdef __GNUC__ +const prog_char *help_p; +const prog_char +#else +#define pgm_read_byte(prg_str) prg_str +char *help_p; +__flash char +#endif +Help[] = {"\n\r--------------------------------------------------------------\n\rAtmel AVR446 - Linear speed control of stepper motor\n\r\n\r? - Show help\n\ra [data] - Set acceleration (range: 71 - 32000)\n\rd [data] - Set deceleration (range: 71 - 32000)\n\rs [data] - Set speed (range: 12 - motor limit)\n\rm [data] - Move [data] steps (range: -64000 - 64000)\n\rmove [steps] [accel] [decel] [speed]\n\r - Move with all parameters given\n\r - Repeat last move\n\r\n\r acc/dec data given in 0.01*rad/sec^2 (100 = 1 rad/sec^2)\n\r speed data given in 0.01*rad/sec (100 = 1 rad/sec)\n\r--------------------------------------------------------------\n\r"}; /*! \brief Sends help message. * @@ -172,9 +195,9 @@ */ void ShowHelp(void) { - unsigned int i = 0; - while(Help[i] != 0) - uart_SendByte(Help[i++]); + help_p = Help; + while(pgm_read_byte(help_p) != 0) + uart_SendByte(pgm_read_byte(help_p++)); } /*! \brief Sends out data. diff -uwr IAR/sm_driver.c src/sm_driver.c --- IAR/sm_driver.c 2006-05-08 14:25:58.000000000 +0200 +++ src/sm_driver.c 2008-04-24 14:50:08.000000000 +0200 @@ -21,7 +21,11 @@ * $Date: 2006/05/08 12:25:58 $ *****************************************************************************/ +#ifdef __GNUC__ +#include +#else #include +#endif #include "global.h" #include "sm_driver.h" @@ -32,7 +36,11 @@ #define BIT_B2 0 //! Table with control signals for stepper motor -__flash unsigned char steptab[] = {((1< +#include +#else #include +#endif #include "global.h" #include "sm_driver.h" #include "speed_cntr.h" @@ -81,9 +86,9 @@ srd.min_delay = A_T_x100 / speed; // Set accelration by calc the first (c0) step delay . - // step_delay = 1/tt * sqrt(2*alpha/accel) - // step_delay = ( tfreq*0.676/100 )*100 * sqrt( (2*alpha*10000000000) / (accel*100) )/10000 - srd.step_delay = (T1_FREQ_148 * sqrt(A_SQ / accel))/100; + // step_delay = 1/tt * l_sqrt(2*alpha/accel) + // step_delay = ( tfreq*0.676/100 )*100 * l_sqrt( (2*alpha*10000000000) / (accel*100) )/10000 + srd.step_delay = (T1_FREQ_148 * l_sqrt(A_SQ / accel))/100; // Find out after how many steps does the speed hit the max speed limit. // max_s_lim = speed^2 / (2*alpha*accel) @@ -160,8 +165,14 @@ * A new step delay is calculated to follow wanted speed profile * on basis of accel/decel parameters. */ +#ifdef __GNUC__ +//void TIMER1_COMPA_vect (void) __attribute__((interrupt)); +//void TIMER1_COMPA_vect (void) +ISR(TIMER1_COMPA_vect) +#else #pragma vector=TIMER1_COMPA_vect __interrupt void speed_cntr_TIMER1_COMPA_interrupt( void ) +#endif { // Holds next delay period. unsigned int new_step_delay; @@ -241,7 +252,7 @@ * \param x Value to find square root of. * \return Square root of x. */ -static unsigned long sqrt(unsigned long x) +static unsigned long l_sqrt(unsigned long x) { register unsigned long xr; // result register register unsigned long q2; // scan-bit register diff -uwr IAR/speed_cntr.h src/speed_cntr.h --- IAR/speed_cntr.h 2006-05-08 14:25:58.000000000 +0200 +++ src/speed_cntr.h 2008-04-22 19:08:39.000000000 +0200 @@ -50,7 +50,9 @@ * the timer1 frequency is the clock frequency divided by 8. */ // Timer/Counter 1 running on 3,686MHz / 8 = 460,75kHz (2,17uS). (T1-FREQ 460750) -#define T1_FREQ 460750 +//#define T1_FREQ 460750 +// Timer/Counter 1 running on 16MHz / 8 = 2000kHz (0.5uS). (T1-FREQ 460750) +#define T1_FREQ 2000000 //! Number of (full)steps per round on stepper motor in use. #define FSPR 200 @@ -73,7 +75,7 @@ #define ALPHA (2*3.14159/SPR) // 2*pi/spr #define A_T_x100 ((long)(ALPHA*T1_FREQ*100)) // (ALPHA / T1_FREQ)*100 #define T1_FREQ_148 ((int)((T1_FREQ*0.676)/100)) // divided by 100 and scaled by 0.676 -#define A_SQ (long)(ALPHA*2*10000000000) // ALPHA*2*10000000000 +#define A_SQ (long long )(ALPHA*2*10000000000LL) // ALPHA*2*10000000000 #define A_x20000 (int)(ALPHA*20000) // ALPHA*20000 // Speed ramp states @@ -84,7 +86,7 @@ void speed_cntr_Move(signed int step, unsigned int accel, unsigned int decel, unsigned int speed); void speed_cntr_Init_Timer1(void); -static unsigned long sqrt(unsigned long v); +static unsigned long l_sqrt(unsigned long v); unsigned int min(unsigned int x, unsigned int y); //! Global status flags Nur in src/: stepper.fus. diff -uwr IAR/uart.c src/uart.c --- IAR/uart.c 2006-05-08 14:25:58.000000000 +0200 +++ src/uart.c 2008-04-24 13:36:22.000000000 +0200 @@ -17,7 +17,12 @@ * $RCSfile: uart.c,v $ * $Date: 2006/05/08 12:25:58 $ *****************************************************************************/ +#ifdef __GNUC__ +#include +#include +#else #include +#endif #include "global.h" #include "uart.h" #include "sm_driver.h" @@ -44,10 +49,12 @@ */ void InitUART(void) { + // Set baud rate. 19.2 kbps trasfer speed running at 16 MHz. +#define BAUD 51 // Set baud rate. 19.2 kbps trasfer speed running at 8 MHz. //#define BAUD 25 // Set baud rate. 19.2 kbps trasfer speed running at 3.6864 MHz. -#define BAUD 11 + //#define BAUD 11 UBRR0H = (unsigned char)(BAUD>>8); UBRR0L = (unsigned char)BAUD; @@ -142,8 +149,14 @@ * RX interrupt handler. * RX interrupt always enabled. */ +#ifdef __GNUC__ +//void USART0_RX_vect (void) __attribute__((interrupt)); +//void USART0_RX_vect (void) +ISR(SIG_UART0_RECV) +#else #pragma vector=USART_RX_vect __interrupt void UART_RX_interrupt( void ) +#endif { unsigned char data; @@ -190,14 +203,23 @@ } } + /*! \brief TX interrupt handler. * * TX interrupt handler. * TX interrupt turned on by uart_SendByte, * turned off when TX buffer is empty. */ +#ifdef __GNUC__ +void USART0_TX_vect (void) __attribute__((interrupt)); +void USART0_TX_vect (void) {} +//void USART0_UDRE_vect (void) __attribute__((interrupt)); +//void USART0_UDRE_vect (void) +ISR(SIG_UART0_DATA) +#else #pragma vector=USART_UDRE_vect __interrupt void UART_TX_interrupt( void ) +#endif { unsigned char UART_TxTail_tmp; UART_TxTail_tmp = UART_TxTail; diff -uwr IAR/uart.h src/uart.h --- IAR/uart.h 2006-05-08 14:25:58.000000000 +0200 +++ src/uart.h 2008-04-24 14:59:47.000000000 +0200 @@ -45,9 +45,12 @@ //! Buffer with received string from uart. extern unsigned char UART_RxBuffer[UART_RX_BUFFER_SIZE]; +#ifdef __GNUC__ +#else #pragma vector=USART_RX_vect __interrupt void UART_RX_interrupt( void ); #pragma vector=USART_UDRE_vect __interrupt void UART_TX_interrupt( void ); +#endif #endif