PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] einfaches 'variable++' verdreifacht code?



vklaffehn
26.07.2011, 19:13
Moin!
Hab am Samstag ein kleines Projekt angefangen, bestehend aus einem Tiny2313, 2 L293D Motortreibern sowie einem BTM400 Bluetoothmodul aus Hong Kong :-) Die wichtigen Dinge funktionieren wunderbar, ich kann den Tiny2313 per Bluetooth ansprechen, die Motoren ansteuern etc. bisher sind 1,2KB vom Flash belegt, also ca.62%. Nun wollte ich den Bresenham, der die beiden L293D ansteuert, mit einer Beschleunigungsrampe versehen, nichts aufwendiges, nur eine Lineare Rampe. Ich habe also zusätzlich eine Variable 'rampe' als char deklariert und an passender Stelle ein 'delay' eingebaut. Alles kein Problem, aber wenn ich dann nach dem delay ein 'rampe--' einbaue, damit es auch eine Rampe wird, wächst das Programm con 1200 auf 4800 bytes an, und passt damit natürlich auch nicht mehr ins FlashROM.... Anbei mal der komplette Code, hat einer eine spontane Idee?


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "uart.h"
#include <avr/interrupt.h>
#include <stdint.h>

#include <avr/pgmspace.h>

#define UART_BAUD_RATE 9600
//#define m_delay 1500
volatile uint16_t motor1=0;
volatile uint16_t motor2=0;
//absolute direction in degree (-180 to 180, -90 to 90)
volatile int16_t xpos = 0;
volatile int16_t ypos = 0;
#define speed 400

//const unsigned char step[4]={5,9,10,6};
const unsigned char halfstep[8]={5,1,9,8,10,2,6,4};
//const unsigned char halfstep[8]={0b00001010,0b00001000,0b00001001,0b00000001,0b00 000010,0b00000110,0b00000100,0b00000101};

void init()
{
DDRA = 0b00000011;
DDRB = 0b11111111;
DDRD = 0b00000100;
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
sei();
}
void _vdelay_us(int delay)
{
int cnt;
for (cnt=0;cnt<delay;cnt++)
{
_delay_us(1);
}
}
void _vdelay_ms(int delay)
{
int cnt;
for (cnt=0;cnt<delay;cnt++)
{
_delay_ms(1);
}
}
void step_x(int dir)
{
motor1 = motor1 + dir;
PORTB = (halfstep[(motor1 & 7)])| (PORTB & (0b11110000));
_vdelay_us(speed);
}
void step_y(int dir)
{
motor2 = motor2 + dir;
PORTB = (halfstep[(motor2 & 7)]) << 4| (PORTB & (0b00001111));
_vdelay_us(speed);
}

/* signum function */
int sgn(int x){
return (x > 0) ? 1 : (x < 0) ? -1 : 0;
}

void line(int xstart,int ystart,int xend,int yend)
/*--------------------------------------------------------------
* Bresenham-Algorithmus: Linien auf Rastergeräten zeichnen
*
* Eingabeparameter:
* int xstart, ystart = Koordinaten des Startpunkts
* int xend, yend = Koordinaten des Endpunkts
*
* Ausgabe:
* void SetPixel(int x, int y) setze ein Pixel in der Grafik
* (wird in dieser oder aehnlicher Form vorausgesetzt)
*---------------------------------------------------------------
*/
{
int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
char rampe = 80;
/* Entfernung in beiden Dimensionen berechnen */
dx = xend - xstart;
dy = yend - ystart;

/* Vorzeichen des Inkrements bestimmen */
incx = sgn(dx);
incy = sgn(dy);
if(dx<0) dx = -dx;
if(dy<0) dy = -dy;

/* feststellen, welche Entfernung größer ist */
if (dx>dy)
{
/* x ist schnelle Richtung */
pdx=incx; pdy=0; /* pd. ist Parallelschritt */
ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */
es =dy; el =dx; /* Fehlerschritte schnell, langsam */
} else
{
/* y ist schnelle Richtung */
pdx=0; pdy=incy; /* pd. ist Parallelschritt */
ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */
es =dx; el =dy; /* Fehlerschritte schnell, langsam */
}

/* Initialisierungen vor Schleifenbeginn */
x = xstart;
y = ystart;
err = el/2;
//SetPixel(x,y);

/* Pixel berechnen */
PORTA=0b00000011; //Motortreiber aktivieren

for(t=0; t<el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */
{
/* Aktualisierung Fehlerterm */
err -= es;
if(err<0)
{
/* Fehlerterm wieder positiv (>=0) machen */
err += el;
/* Schritt in langsame Richtung, Diagonalschritt */
x += ddx;
y += ddy;
step_x(ddx);
step_y(ddy);
} else
{
/* Schritt in schnelle Richtung, Parallelschritt */
x += pdx;
y += pdy;
step_x(pdx);
step_y(pdy);
}
_delay_ms(rampe);
//rampe--;
//SetPixel(x,y);
}
PORTA=0b00000000 ;
} /* gbham() */
void moveto(int x,int y)
{
line(xpos,ypos,x,y);
xpos=x;
ypos=y;
}

unsigned char serialin(void)
{
unsigned int c;
c = uart_getc();
while ( c & UART_NO_DATA )
c = uart_getc();
return c;
}
void remote_move()
{
int16_t x,y;
x=serialin()+(serialin()<<8);
y=serialin()+(serialin()<<8);
// turn_deg_x(x-(xpos));
// turn_deg_y(y-(ypos));
moveto(x,y);
xpos = x;
ypos = y;
uart_putc(0);
}
void remote(void)
{
unsigned int c;
c = uart_getc();
if ( c & UART_NO_DATA )
{
/*
* no data available from UART
*/
}
else
{
/*
* new data available from UART
* check for Frame or Overrun error
*/
if ( c & UART_FRAME_ERROR )
{
/* Framing Error detected, i.e no stop bit detected */
//uart_puts_P("UART Frame Error: ");
}
if ( c & UART_OVERRUN_ERROR )
{
/*
* Overrun, 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
*/
//uart_puts_P("UART Overrun Error: ");
}
if ( c & UART_BUFFER_OVERFLOW )
{
/*
* We are not reading the receive buffer fast enough,
* one or more received character have been dropped
*/
//uart_puts_P("Buffer overflow error: ");
}
//doing commands
switch(c)
{
case 0:
uart_puts_P("OK\n");
//turn_x(100);
//turn_y(100);
break;
case 1:
remote_move();
//turn_x(-100);
//turn_y(-100);
break;
}
}
}

int main(void)
{
init();
PORTD=0b00000100;

uart_puts_P("AT+NAME=MiniPanoBot_BT\r\n");
uart_puts_P("AT+PSWD=0815\r\n");
uart_puts_P("AT+UART=9600,0,0\r\n");

uart_puts_P("AT+RESET\r\n");
_delay_ms(500);
PORTD=0b00000000;
moveto(1000,1000);
moveto(500,750);
moveto(0,0);

while (1)
{

remote();
}
}


Einmal mit rampe-- auskommentiert :

Program: 1296 bytes (63.3% Full)
(.text + .data + .bootloader)
Data: 85 bytes (66.4% Full)
(.data + .bss + .noinit)



und einmal drin :


Program: 4892 bytes (238.9% Full)
(.text + .data + .bootloader)
Data: 349 bytes (272.7% Full)
(.data + .bss + .noinit)


MfG
Volker

sternst
26.07.2011, 19:28
_delay_ms darf nur mit einer Konstante aufgerufen werden.

vklaffehn
26.07.2011, 19:41
Sputz, jetzt, wo Du es sagst.... ich hab ein Gedächtnis wie ein Sieb, da bin ich schonmal drauf hereingefallen.....

Und wenn man seinen eigenen Code auch mal liest......

Hab _delay_ms jetzt mal durch _vdelay_ms ersetzt, und alles ist gut. Argl...
Danke!!!