Code funktioniert nur außerhalb einer Funktion richtig

Gast #896722
Lesenswert?

Dieser Code
1
  _delay_ms(1);
2
  int i = 0;
3
  
4
  int bit;
5
  int byte = 0;
6
  int c = 1;
7
  while(i < 8) {
8
    bit = get_bit();
9
    _delay_ms(1);
10
    byte = byte + bit*c;
11
    i++;
12
    c *= 2;
13
  }
14
  
15
  uart_puts(intToString(byte, 4));
tut auch, was er soll.

Wenn ich aber dies
1
  _delay_ms(1);
2
  int i = 0;
3
  
4
  int bit;
5
  int byte = 0;
6
  int c = 1;
7
  while(i < 8) {
8
    bit = get_bit();
9
    _delay_ms(1);
10
    byte = byte + bit*c;
11
    i++;
12
  }
in eine Funktion packe und dies durch die uart_puts aufrufen lasse, 
kriege ich ein falsches Ergebnis.
PS: Der Code funktioniert auch nur mit den _delay_ms(1); aufrufen 
korrekt :(
Gast #896738
Lesenswert?

Nee, war nur nen Tippfehler.

Die Funktion sieht so aus:
1
int get_byte(void) {
2
  _delay_ms(1);
3
  int i = 0;
4
  
5
  int bit;
6
  int byte = 0;
7
  int c = 1;
8
  while(i < 8) {
9
    bit = get_bit();
10
    _delay_ms(1);
11
    byte = byte + bit*c;
12
    i++;
13
    c *= 2;
14
  }
15
  
16

17
  return byte;
18
}
#896820
Lesenswert?

Dann musst du mal mit deutlich mehr Infos rüberkommen.
Wie äußert sich der Fehler überhaupt, also was erwartest du, und was 
bekommst du stattdessen?
Wie sieht die Funktion get_bit aus?
Wie sieht die Funktion aus, die get_byte aufruft?

> Nee, war nur nen Tippfehler.

Es ist eine schlechte Idee hier Code einzutippen. Poste immer 
Originalcode, also per Cut&Paste hier einfügen.
Gast #896862
Lesenswert?

Alsoo die Funktion get_bit
1
int get_bit(void) {
2
  int bit;
3
  while(get_red_line() && get_white_line()) {
4
    asm volatile ("nop");
5
  }
6
  if(!(get_red_line() == 1)) {
7
    bit = 0;
8
    set_white_line();
9
    while(get_red_line() == 0) {
10
      asm volatile ("nop");
11
    }
12
    clear_white_line();
13
  }
14
  else {
15
    bit = 1;
16
    set_red_line();
17
    while(get_white_line() == 0) {
18
      asm volatile ("nop");
19
    }
20
    clear_red_line();
21
  }
22
  return bit;
23
}
Und so wird die Funktion aufgerufen:
[c]
int main(void) {
  init();
  uart_init();
  _delay_ms(1);
  int i = 0;

  int bit;
  int byte = 0;
  int c = 1;
  while(1) {
    i = 0;
    byte = 0;
    c = 1;
    while(i < 8) {
      bit = get_bit();
      _delay_ms(1);
      byte = byte + bit*c;
      i++;
      c *= 2;
    }

    uart_putc(get_byte());
  }

}
[c]

Das nicht funktionieren äußert sich so, dass schlicht ein falscher Wert 
kommt. Dass der Wert der normalerweise, also bei uart_putc(byte); kommt, 
richtig ist, kann ich versichern.
#896876
Lesenswert?

Ist das, was du da einließt, ein konstanter Wert, oder irgendein 
Datenstrom?
Wenn es ein konstanter Wert ist, dann nenne mal den konkreten Wert von 
Ist und Soll. Wenn es ein Datenstrom ist, liegt das Problem darin, dass 
du das Byte einmal einließt, ohne es zu verwenden, und dann über 
get_byte nochmal. Du gibst also mit uart_putc immer nur jedes 2. Byte 
aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren