Forum: Compiler & IDEs AVR verrechnet sich


von Alan (Gast)


Lesenswert?

Um aus 8 bits(lsb first) ein byte zu machen verwende ich folgenden Code
1
int i = 0;
2
  
3
  int bit;
4
  char byte = 0;
5
  int c = 1;
6
  byte = 0;
7
  while(i < 8) {
8
    bit = get_bit();
9
    uart_puts(intToString(bit, 1));
10
    uart_putc(':');
11
    byte = byte + (bit*c);
12
    uart_puts(intToString(bit*c ,3));
13
    uart_putc('+');
14
    i++;
15
    c *= 2;
16
  }
17
  //uart_puts(":");
18
19
  uart_puts(intToString(byte, 3));
1:1+1:2+0:0+0:0+0:0+0:0+0:0+1:128+65411
Rein theoretisch müsste 131 rauskommen, warum kommt aber 65411 raus, 
obwohl nur drei Stellen (uart_puts(intToString(byte, 3));) ausgegeben 
werden sollen?

von hownottobeseen (Gast)


Lesenswert?

Hallo,

ich kann dir zwar bei deinem konkreten Problem nicht helfen,
anstatt ewig viel zu multiplizieren (was auf dem AVR relativ lange 
dauert), kannst du Bits schubsen:

uint8_t i = 8;
int bit;
uint8_t out = 0;
while(i) {
  bit = get_bit();
  if(bit) out |= 128;
  out >>= 1;
  i--;
}

Viele Grüße

hownottobeseen

von Waldemar F. (wally)


Lesenswert?

hi. kenne mich mit den geräten noch nicht aus. aber 2^16 = 65536 ... 
das ist bniär 1 00000000 00000000 ...
oder aber auch darstellbar als eigentlich negative Zahl
11111111 11111111
vielleicht findest du ja so dein fehler ;)
außerdem würde ich nicht so viele rechnungen machen sondern 
bitoperatoren verwenden. google hilft da mit einem haufen pdfs scripte 
anleitungen beispielen usw.

von Stefan E. (sternst)


Lesenswert?

Der Datentyp char kann signed oder unsigned sein (liegt im Ermessen des 
Compilers). Ändere "char byte = 0;" in "unsigned char byte = 0;".

PS: Hat dir mein Vorschlag für das get_byte nicht gefallen?
Beitrag "Re: Code funktioniert nur außerhalb einer Funktion richtig"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.