-
        

Ergebnis 1 bis 3 von 3

Thema: einfaches 'variable++' verdreifacht code?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685

    einfaches 'variable++' verdreifacht code?

    Anzeige

    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?

    Code:
    #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,0b00000010,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 :
    Code:
    Program:    1296 bytes (63.3% Full)
    (.text + .data + .bootloader)
    Data:         85 bytes (66.4% Full)
    (.data + .bss + .noinit)
    und einmal drin :

    Code:
    Program:    4892 bytes (238.9% Full)
    (.text + .data + .bootloader)
    Data:        349 bytes (272.7% Full)
    (.data + .bss + .noinit)
    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    _delay_ms darf nur mit einer Konstante aufgerufen werden.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    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!!!
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

Ähnliche Themen

  1. Code-Schloss mit Tastatur, LCD und Logger. Code-Beispiel
    Von Stray_Cat im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 05.06.2009, 11:31
  2. Bascom Code in GCC Code umschreiben
    Von Martin. im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 13.07.2008, 20:14
  3. asm-code-einblick vom bascom-code
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 16.10.2007, 07:39
  4. Einfaches printf() über RS232 ausgeben //Stimmt der Code???
    Von STS-Robotics im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.05.2007, 09:32
  5. Einfaches Aufrollproblem
    Von konservator im Forum Mechanik
    Antworten: 9
    Letzter Beitrag: 06.03.2007, 13:50

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •