www.mikrocontroller.net

Forum: Compiler & IDEs Code funktioniert nur außerhalb einer Funktion richtig


Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Code
  _delay_ms(1);
  int i = 0;
  
  int bit;
  int byte = 0;
  int c = 1;
  while(i < 8) {
    bit = get_bit();
    _delay_ms(1);
    byte = byte + bit*c;
    i++;
    c *= 2;
  }
  
  uart_puts(intToString(byte, 4));

tut auch, was er soll.

Wenn ich aber dies
  _delay_ms(1);
  int i = 0;
  
  int bit;
  int byte = 0;
  int c = 1;
  while(i < 8) {
    bit = get_bit();
    _delay_ms(1);
    byte = byte + bit*c;
    i++;
  }
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 :(

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht, weil da "c *= 2" in der Schleife fehlt?

Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, war nur nen Tippfehler.

Die Funktion sieht so aus:
int get_byte(void) {
  _delay_ms(1);
  int i = 0;
  
  int bit;
  int byte = 0;
  int c = 1;
  while(i < 8) {
    bit = get_bit();
    _delay_ms(1);
    byte = byte + bit*c;
    i++;
    c *= 2;
  }
  

  return byte;
}

Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun? Das Problem wurmt mich und ich finde nicht heraus woran es liegt 
... :(

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alsoo die Funktion get_bit

int get_bit(void) {
  int bit;
  while(get_red_line() && get_white_line()) {
    asm volatile ("nop");
  }
  if(!(get_red_line() == 1)) {
    bit = 0;
    set_white_line();
    while(get_red_line() == 0) {
      asm volatile ("nop");
    }
    clear_white_line();
  }
  else {
    bit = 1;
    set_red_line();
    while(get_white_line() == 0) {
      asm volatile ("nop");
    }
    clear_red_line();
  }
  return bit;
}
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah Danke :) jetzt scheints zu gehen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut ;-)

Hier noch ein kleiner Extratipp:
unsigned char get_byte(void) {
  
  unsigned char i;
  unsigned char byte = 0;

  for (i=0;i<8;i++)
    byte = (byte>>1) + (get_bit() ? 0x80 : 0);

  return byte;
}

Autor: Alan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir mal jemand erklären, was das heißen soll? Mit Bitoperatoren in 
C stehe ich noch auf dem Kriegsfuß :S

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, die Gundlagen musste dir schon selber mal anschauen. Wenn du dann 
noch konkrete Fragen hast können wir die gerne weiter helfen :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.