AVR - Verlust von Wert in Array

OP #4379620
Lesenswert?
• ▲
▼
Hallo,

Ich muss Werte von einem Array in einen anderen "kopieren".
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4

5
#include "uart.h"
6

7
uint8_t pwm[8];
8

9
void update() {
10

11
  char s_val[3];
12

13
  for ( uint8_t i = 0; i < 8; i++ ) {
14

15
    itoa(pwm[i], s_val, 10);
16
    sendString(s_val);
17
    sendString("\r\n");
18

19
  }
20

21
  sendString("\r\n");
22
  sendString("\r\n");
23

24
}
25

26
int main(void) {
27

28
  init_USART();
29

30
  //Clear screen
31
  sendString("\033[2J");
32

33
  while ( 1 ) {
34

35
    pwm[0] = 1;
36
    pwm[1] = 7;
37
    pwm[2] = 15;
38
    pwm[3] = 33;
39
    pwm[4] = 40;
40
    pwm[5] = 80;
41
    pwm[6] = 140;
42
    pwm[7] = 255;
43

44
    update();
45
    _delay_ms(1000);
46

47
    pwm[0] = 255;
48
    pwm[1] = 140;
49
    pwm[2] = 80;
50
    pwm[3] = 40;
51
    pwm[4] = 33;
52
    pwm[5] = 15;
53
    pwm[6] = 7;
54
    pwm[7] = 1;
55

56
    update();
57
    _delay_ms(1000);
58

59
  }
60

61
  return 0;
62

63
}

Dass dieser Code in der Form keinen echten Nutzen hat, ist mir bewusst, 
sei jetzt aber erst einmal egal.

Einmal pro Sekunde wird das Array per Hand umgedreht. Das überprüfe ich 
via UART. Nun aber der Output, der mich vor ein Rätsel stellt:
1
1
2
7
3
15
4
33
5
40
6
80
7
140
8
255
9

10

11
255
12
0
13
80
14
40
15
33
16
15
17
7
18
1
19

20

21
1
22
7
23
15
24
33
25
40
26
80
27
0
28
255
29

30

31
255
32
0
33
80
34
40
35
33
36
15
37
7
38
1

Wo ist die 140 ab der zweiten "Ausgabe" hin? Entweder der Compiler macht 
Müll (was ich stark bezweifle), ich sehe den Fehler einfach nicht oder 
es gibt etwas über Arrays zu wissen, dass ich noch nicht weiß.

Wenn mir jemand helfen kann, wäre ich mehr als dankbar,

LG Peter
#4379630
Lesenswert?
• ▲
▼
Ein String belegt immer 1 Zeichen mehr, weil er mit einem NUL-Zeichen 
terminiert ist. Dein s_val[3] kann also nur Zahlen von 0-99 aufnehmen. 
Bei 255 schreibt itoa() das NUL-Zeichen irgend wo hin und trifft 
scheinbar genau pwm[1]. Dann steht 0 drin und mit mit itoa() korrekt in 
"0" umgewandelt.

Also s_val[4] und der Fehler sollte weg sein.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.