- LiTime Speicher und Akkus         
Ergebnis 1 bis 3 von 3

Thema: [gelöst]16 Bit integer aufsplitten und wieder zusammensetzen

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

    [gelöst]16 Bit integer aufsplitten und wieder zusammensetzen

    Anzeige

    Praxistest und DIY Projekte
    //edit: Tja, manchmal muß man es nur hier posten und nach dem Fischfilet gucken.... Habe mal auf beiden Seiten stdint.h min eingebaut und alle beteiligten Variablen als INT16_T deklariert....


    Moin, hab irgendwie grad ein Brett vor dem Kopf :

    Ich übertrage 2 16bit signed integer seriell von einem Mega8 auf einen Tiny2313, zerlege sie auf der einen Seite in Low und Highbyte und baue sie auf der anderen wieder zusammen, gleichzeitig werde die beiden Werte beim Mega8 auf einem LCD angezeigt. Sobald jetzt aber ein Wert negativ wird, geht etwas schief, mein seriell übertragenes Highbyte wechselt dann von 0x00 zu 0xff, und nicht, wie ich geplant hatte, zu 0x80, aber auf dem LCD wird der selbe integer brav als z.B. -1 angezeigt?

    hier mal ein Codeschnipsel, xpos und ypos sind 'volatile int', x und y gehen von -180 bis 180, die 1 ist quasi ein Startkennzeichen
    Code:
    void gotoxy(signed int x,signed int y)
    {
    	unsigned char c;
    	if ((xpos-x)>180)
    	{
    		x=(360-x);
    	}
    		//update absolute direction
    	xpos = x;
    	ypos = y;
    	
    	char buffer[16];
    	
    	itoa(xpos,buffer,10);
    	lcd_gotoxy(0,1);
    	lcd_puts_P("                ");
    	lcd_gotoxy(0,1);
    	lcd_puts(buffer);
    	itoa(ypos,buffer,10);
    	lcd_gotoxy(5,1);
    	lcd_puts(buffer);
    	
    	//move
    	uart_putc(1);
    	uart_putc(xpos & 255);
    	uart_putc(xpos >> 8);
    	uart_putc(ypos & 255);
    	uart_putc(ypos >> 8);
    	
    	c = serialin();
    		
    
    }
    und hiermit wird, nachdem erst eine 1 empfangen wurde, das ganze auf dem Tiny2313 wieder zusammengebaut und am Ende eine 0 zurückgeschickt :


    Code:
    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));
    	xpos = x;
    	ypos = y;
    	uart_putc(0);
    }
    Kann mir jemand evtl. das Brett vorm Kopf wegnehmen??

    Danke

    P.S. : ist dringend, ist mein Panoramakopf, der morgen mit in Urlaub muß

    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 Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Ich weiß ja nicht, was dein Compiler da anstellt, aber XPOS und YPOS sind doch immer Integer variablen mit 16Bit.
    Wärs nicht möglich, das da immer 2 Bytes übertragen werden?
    Dann könnte ich mir das Fehlverhalten erklären.

    Versuch mal die Integer zu teilen, die Teilergebnisse in Chars zu puffern und diese Chars dann zu übertragen.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    47
    Beiträge
    685
    Moin!

    Ich vermute, meine Interpretation der Ziffern ist irgendwie nicht so, wie der Compiler das will, auf alle Fälle funktioniert es jetzt, ich hab allerdings nicht mehr na´chgeschaut, was da wirklich über die Leitung geht, aber anscheinend baut der Tiny das jetzt genauso zusammen, wie es der Mega aufgesplittet hat....

    MfG
    Volker

    Grundlagenforschung mach ich erst nach dem Urlaub
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

Berechtigungen

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

LiFePO4 Speicher Test