PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst]16 Bit integer aufsplitten und wieder zusammensetzen



vklaffehn
05.06.2010, 15:02
//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



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 :




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

wkrug
05.06.2010, 15:13
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.

vklaffehn
05.06.2010, 15:46
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 :-)