Forum: Compiler & IDEs Wuerfel - Anweisung wird ignoriert


von Wuerfelspieler (Gast)


Lesenswert?

Hallo,

ich bin grade dabei, einen "elektrischen Würfel" zu programmieren. Dafür 
habe ich neun LEDs als Matrix und folgenden Code.
Allerdings wird die Anweisung "PORTB = get_wuerfel(0, x);" ignoriert - 
wenn ich nun aber x im Code durch 0, 1 oder 2 ersetze, funktioniert 
soweit alles.

Ich suche nun schon seid etwa einer Stunde, finde aber partout keinen 
Fehler.
Kann mir jemand weiterhelfen?
1
#define F_CPU 4000000
2
#include <avr/io.h>
3
#include <avr/interrupt.h> 
4
#include <util/delay.h>
5
6
const int zeilen[3] = { 
7
    1 << PB0,
8
    1 << PB1,
9
    1 << PB2
10
};
11
12
const int spalten[3] = { 
13
    1 << PB3,
14
    1 << PB4,
15
    1 << PB5
16
};
17
18
int wuerfel[7][3][3] = {
19
  {
20
    { 1, 1, 1 },
21
    { 1, 0, 1 },
22
    { 1, 1, 1 }
23
  }
24
};
25
26
void delay_ms(int ms) {
27
  for(; ms > 0; ms--) {
28
    _delay_ms(1);
29
  }
30
}
31
32
void delay_us(int us) {
33
  for(; us > 0; us--) {
34
    _delay_us(1);
35
  }
36
}
37
38
int get_wuerfel(int ziffer, int linie) {
39
  int r = zeilen[linie];
40
  int i;
41
42
  for(i = 0; i < 3; i++) {
43
    if(wuerfel[ziffer][linie][i]) {
44
      r = r | spalten[i];
45
    }
46
  }
47
48
  r ^= 0b000111;
49
  return r;
50
}
51
52
int main (void) {
53
  DDRB = 0xFF;
54
  PORTB = 0xFF;
55
56
  while(1) {
57
    int x = 0;
58
    for(; x < 3; x++) {
59
      PORTB = get_wuerfel(0, x);
60
      delay_ms(1000);
61
    }
62
  }
63
  
64
  return 0;
65
}

von Wuerfelspieler (Gast)


Lesenswert?

Selbst mit folgendem Code geht das ganze.
Aber das ist irgendwie nicht schön und auch nicht der Sinn von Variablen 
:o
1
    if(x == 2) {
2
        PORTB = get_wuerfel(0, 2);
3
      } else if(x == 1) {
4
        PORTB = get_wuerfel(0, 1);
5
      } else if(x == 0) {
6
        PORTB = get_wuerfel(0, 0);
7
      }

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
    int x = 0;
2
    for(; x < 3; x++) {
3
      :
Setz doch x mal nicht nur 1x zurück:
1
    int x;
2
    for(x = 0; x < 3; x++) {
3
      :

von Oliver (Gast)


Lesenswert?

>Ich suche nun schon seid etwa einer Stunde, finde aber partout keinen
>Fehler.

Für solche Problemstellungen gibt es Debugger. Hast du damit schon mal 
nachgesehen, was genau passiert, und was wo schief geht?

Oliver

von Klaus (Gast)


Lesenswert?

@Lothar: Heute morgen noch kein Kaffee gehabt? Deine beiden Codestücke 
mach doch genau das selbe ;)

von ... (Gast)


Lesenswert?

Das hier
1
int wuerfel[7][3][3] = {
2
  {
3
    { 1, 1, 1 },
4
    { 1, 0, 1 },
5
    { 1, 1, 1 }
6
  }
7
};

stimmt doch so nicht.

von Klaus (Gast)


Lesenswert?

stimmt, die Initialisierung ist unvollständig. Aber solange get_wuerfel 
nur mit 0 als erstem Parameter aufgerufen wird, passiert noch nix 
schlimmes.

von Wuerfelspieler (Gast)


Lesenswert?

Bisher rufe ich es nur mit "0" als Paramter auf. Auch wenn ich 
wuerfel[7][3][3] zu wuerfel[1][3][3] ändere, besteht das Problem 
weiterhin.

Einen Debugger oder entsprechende Hardware habe ich leider nicht..

von MeinerEiner (Gast)


Lesenswert?

Debugger ist einer im AVR-Studio mit drin.

von Chris H. (wuselwutz)


Lesenswert?

Warum 9 Leds? Hätten nicht 7 gereicht?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Chris H. schrieb:
> Warum 9 Leds? Hätten nicht 7 gereicht?
Der Würfel kann doch auch mal um 90° gedreht zum Liegen kommen  ;-)

von Wuerfelspieler (Gast)


Lesenswert?

Ja, sieben LEDs hätten auch  gereicht. Allerdings fand' ich die 
LED-Anordnung in H-Form optisch recht unansehlich und weil es 
matrixmäßig keinen Unterschied macht, ob da nun sieben oder neun LEDs 
sind, weil LEDs nicht soo viel kosten und weil der AtTiny2313 die Pins 
ja hat, habe ich mich für neun LEDs entschieden.

Habe das Problem übrigens gelöst. Wie? Mit einem neuen AtTiny2313 
grübel.

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.