www.mikrocontroller.net

Forum: Compiler & IDEs Wuerfel - Anweisung wird ignoriert


Autor: Wuerfelspieler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
#define F_CPU 4000000
#include <avr/io.h>
#include <avr/interrupt.h> 
#include <util/delay.h>

const int zeilen[3] = { 
    1 << PB0,
    1 << PB1,
    1 << PB2
};

const int spalten[3] = { 
    1 << PB3,
    1 << PB4,
    1 << PB5
};

int wuerfel[7][3][3] = {
  {
    { 1, 1, 1 },
    { 1, 0, 1 },
    { 1, 1, 1 }
  }
};

void delay_ms(int ms) {
  for(; ms > 0; ms--) {
    _delay_ms(1);
  }
}

void delay_us(int us) {
  for(; us > 0; us--) {
    _delay_us(1);
  }
}

int get_wuerfel(int ziffer, int linie) {
  int r = zeilen[linie];
  int i;

  for(i = 0; i < 3; i++) {
    if(wuerfel[ziffer][linie][i]) {
      r = r | spalten[i];
    }
  }

  r ^= 0b000111;
  return r;
}

int main (void) {
  DDRB = 0xFF;
  PORTB = 0xFF;

  while(1) {
    int x = 0;
    for(; x < 3; x++) {
      PORTB = get_wuerfel(0, x);
      delay_ms(1000);
    }
  }
  
  return 0;
}

Autor: Wuerfelspieler (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Klaus (Gast)
Datum:

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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier
int wuerfel[7][3][3] = {
  {
    { 1, 1, 1 },
    { 1, 0, 1 },
    { 1, 1, 1 }
  }
};


stimmt doch so nicht.

Autor: Klaus (Gast)
Datum:

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

Autor: Wuerfelspieler (Gast)
Datum:

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

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Debugger ist einer im AVR-Studio mit drin.

Autor: Chris H. (wuselwutz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum 9 Leds? Hätten nicht 7 gereicht?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Wuerfelspieler (Gast)
Datum:

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

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.