Forum: Mikrocontroller und Digitale Elektronik steuerprogram ledmatrix hat fehler


von Mike B. (mike13579)


Lesenswert?

hi ich habe ein Steuerprogramm für meine LEDMatrix geschrieben die 
Matrix ist 7zeilen hoch und 26zeilen breit. Die Matrix ist so gebogen 
das sie einen Kreis bildet, sollte aber trotzdem nicht anders 
funktionieren als wie wen sie plat wer.
mein Controller ist ein TAMEGA2560
die klemmen 14 bis 20 sind für die Zeilen die klemmen 21-46 für die 
spalten
das ist mein code:
1
//Bedinteil alles hier ist zu verendern und damit zu bedienen
2
3
//Lauftext
4
const int bewegen = true;   //lauftext ein aus
5
const int rechts = false;    //bewegungsrichtung lauftext false = links
6
const int wied = 50;        //bildwiederholung bis bewegung 100 ca. 1 sek.
7
const int textzeit = 2;      //anzeigedauer ein text, bei bewegung = anzahlrunden
8
//LED anzahl
9
const int ledzeile = 26;    // LEDs in der zeile 
10
const int ledspalte = 7;    // LEDs in der spalte (bei mehr als 7 ganz unten erweitern)
11
//Pins zuortnung
12
int ledzeilePins[] = { 
13
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46 };   // pin nummern Zele
14
  
15
int ledspaltePins[] = { 
16
  14, 15, 16, 17, 18, 19, 20 };   // pin nummern Spalte
17
  
18
//Anzeige befüllen und stellenanzahl anpassen!!!
19
const int texte = 2; //anzahl te der texte die verwendet weden verwendung immer fon oben nach unten!!!
20
//1. text
21
int zeile1[] = { 
22
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH };   //1. zeile HIGH an, LOW ab 
23
int zeile2[] = { 
24
  LOW, HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH, HIGH, LOW, LOW };   //2. zeile HIGH an, LOW ab 
25
int zeile3[] = { 
26
  LOW, HIGH, LOW, LOW, HIGH, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, HIGH, LOW };   //3. zeile HIGH an, LOW ab 
27
int zeile4[] = { 
28
  LOW, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, HIGH, LOW };   //4. zeile HIGH an, LOW ab 
29
int zeile5[] = { 
30
  LOW, HIGH, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, LOW, HIGH, LOW };   //5. zeile HIGH an, LOW ab 
31
int zeile6[] = { 
32
  LOW, HIGH, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW };   //6. zeile HIGH an, LOW ab 
33
int zeile7[] = { 
34
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH };   //7. zeile HIGH an, LOW ab 
35
//2. text
36
int zeile8[] = { 
37
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH };   //1. zeile HIGH an, LOW ab 
38
int zeile9[] = { 
39
  HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };   //2. zeile HIGH an, LOW ab 
40
int zeile10[] = { 
41
  HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };   //3. zeile HIGH an, LOW ab 
42
int zeile11[] = { 
43
  HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };   //4. zeile HIGH an, LOW ab 
44
int zeile12[] = { 
45
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };   //5. zeile HIGH an, LOW ab 
46
int zeile13[] = { 
47
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };   //6. zeile HIGH an, LOW ab 
48
int zeile14[] = { 
49
  HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH };   //7. zeile HIGH an, LOW ab 
50
// bei weitern texten die gesamt zeilen unten erweitern!!!
51
//ab hier sind normalerweise keine enderrungen nötig (auser bei erweiterung) 
52
int beweg =0;
53
int text = 1;
54
int textplus =0;
55
void setup() {
56
  // Pins auf output setzen
57
  for (int thisLed3 = 0; thisLed3 < ledzeile; thisLed3++) {
58
    pinMode(ledzeilePins[thisLed3], OUTPUT);
59
    
60
  for (int thisLed4 = 0; thisLed4 < ledspalte; thisLed4++) {
61
    pinMode(ledspaltePins[thisLed4], OUTPUT);
62
63
  
64
  }
65
}
66
}
67
void loop() {
68
  //textwahl
69
    //rücksetzung textnummer
70
    if (text > texte){
71
    text = 1;
72
    }
73
    //textnummer auswerten
74
    text--;
75
    textplus = text * ledspalte;
76
    text++;
77
    
78
  //anzeigedauer bis text wechsel
79
  for (int textzeit1 = 0; textzeit1 < textzeit*ledzeile; textzeit1++) {  
80
    
81
  //laufrichtung
82
  if (bewegen == true && rechts ==true){      
83
  beweg = beweg + ledzeile - 1;
84
  }
85
  else if(bewegen == true && rechts ==false){
86
  beweg++;
87
  }
88
  else{
89
  beweg = 0;
90
  }
91
  //rüksetzung nach 1 umtrehung
92
  if(beweg > ledzeile ){
93
  beweg = beweg - ledzeile;
94
  }
95
  //bewegungszeitabschätzung
96
  for (int beweg2 = 0; beweg2 < wied; beweg2++) {
97
  int beweg1;  
98
  beweg1 = beweg;
99
  //darstellung erzeugen
100
  for (int thisLed1 = 0; thisLed1 < ledspalte; thisLed1++) {
101
       for (int thisLed2 = 0; thisLed2 < ledzeile; thisLed2++) {
102
        if (beweg1 + thisLed2 > ledzeile){
103
        beweg1 = beweg1 - ledzeile;
104
        } 
105
         if (thisLed1 + textplus == 0){ 
106
         digitalWrite(ledzeilePins[thisLed2],zeile1[thisLed2 + beweg1]);
107
         }
108
         else if(thisLed1 + textplus == 1){
109
         digitalWrite(ledzeilePins[thisLed2],zeile2[thisLed2 + beweg1]);
110
         }
111
         else if(thisLed1 + textplus == 2){
112
         digitalWrite(ledzeilePins[thisLed2],zeile3[thisLed2 + beweg1]);
113
         }
114
         else if(thisLed1 + textplus == 3){
115
         digitalWrite(ledzeilePins[thisLed2],zeile4[thisLed2 + beweg1]);
116
         }
117
         else if(thisLed1 + textplus == 4){
118
         digitalWrite(ledzeilePins[thisLed2],zeile5[thisLed2 + beweg1]);
119
         }
120
         else if(thisLed1 + textplus == 5){
121
         digitalWrite(ledzeilePins[thisLed2],zeile6[thisLed2 + beweg1]);
122
         }
123
         else if(thisLed1 + textplus == 6){
124
         digitalWrite(ledzeilePins[thisLed2],zeile7[thisLed2 + beweg1]); 
125
         } 
126
         else if(thisLed1 + textplus == 7){ 
127
         digitalWrite(ledzeilePins[thisLed2],zeile8[thisLed2 + beweg1]);
128
         }
129
         else if(thisLed1 + textplus == 8){
130
         digitalWrite(ledzeilePins[thisLed2],zeile9[thisLed2 + beweg1]);
131
         }
132
         else if(thisLed1 + textplus == 9){
133
         digitalWrite(ledzeilePins[thisLed2],zeile10[thisLed2 + beweg1]);
134
         }
135
         else if(thisLed1 + textplus == 10){
136
         digitalWrite(ledzeilePins[thisLed2],zeile11[thisLed2 + beweg1]);
137
         }
138
         else if(thisLed1 + textplus == 11){
139
         digitalWrite(ledzeilePins[thisLed2],zeile12[thisLed2 + beweg1]);
140
         }
141
         else if(thisLed1 + textplus == 12){
142
         digitalWrite(ledzeilePins[thisLed2],zeile13[thisLed2 + beweg1]);
143
         }
144
         else if(thisLed1 + textplus == 13){
145
         digitalWrite(ledzeilePins[thisLed2],zeile14[thisLed2 + beweg1]); // bei zeilenanzahl heir erweiten ergenzung er aufsteigenden zahlen erforderlich!!!
146
         }
147
       }
148
       digitalWrite(ledspaltePins[thisLed1], HIGH);
149
       delay (1);
150
       digitalWrite(ledspaltePins[thisLed1], LOW);
151
  }
152
  }
153
  }
154
  text++;
155
}
nun ist es so das zunächst das Bild beziehungsweise die Anordnung der 
eingeschalteten LEDs richtig ist wen nun die Verschiebung (Lauftext) 
beginnt
scheint sich die letzte Zeile nach ganz oben zu bewegen und die anderen 
nachzurücken wobei nach der 1. Zeile an der stelle wo diese vorbei kommt 
das ganze wieder richtig erscheint bis die erste Zeile einmal im Greis 
herum kam dann beginnt die Verschiebung wieder neu.

danke schon mal im voraus

Gefundene Rechtschreibfehler dürfen behalten werden
(wie ging bei FIREFOX die Rechtschreibkorrektur an ?)

von Peter D. (peda)


Lesenswert?

Also ich seh da nicht durch, mir ist das viel zu kompliziert.

Üblicher Weise trennt man einfach die Aufgaben:
D.h. ein Timerinterrupt macht allein nur das Multiplexen. Dazu gibt er 
aus einem Array die Bitmuster aus. Für ne 7*26 Matrix sind das 26 Byte 
(uint8_t).
Und das Main schreibt in dieses Array das anzuzeigende Bitmuster rein.

Sind Buchstaben darzustellen, benutzt man noch eine ASCII-Tabelle, d.h. 
das Main enthält die Zeichen im Klartext und die Tabelle wandelt diese 
in die entsprechenden Bitmuster (5*7 Zeichensatz) um.


Es ist auch sehr unüblich für Bits immer 16Bit-Variablen zu nehmen. 
Warum jedesmal 15 Bit ungenutzt verschwenden, das bläht nur unnötig den 
Code auf und kostet Zeit.

Und in C darf man auch Zeilen beliebig umbrechen. Ein Zeilenende hat in 
C keine Funktion (außer als Macro-Ende).
Nicht jeder hat einen 40Zoll-Monitor.


Peter

von Mike B. (mike13579)


Lesenswert?

ich vergas zu erwehnen bin anfänger ich fersteh nur teilweise was du 
meinst gibt es irgendwo beispiel cods ?

von Mike B. (mike13579)


Lesenswert?

könte mir bitte jemand erklähren wie das richtig geht oder wo ich das 
nachlessen kan .

von Thomas E. (thomase)


Lesenswert?

Mike B. schrieb:
> Gefundene Rechtschreibfehler dürfen behalten werden

Da bist du auch noch stolz drauf?

Was deinen Code angeht: Alles markieren, Entf drücken, Speichern

mfg.

von Mike B. (mike13579)


Lesenswert?

Thomas Eckmann schrieb:
>
> Was deinen Code angeht: Alles markieren, Entf drücken, Speichern

super Witz ich lach mal wen mir langweilig ist

>> Gefundene Rechtschreibfehler dürfen behalten werden

Rechtschreibung ist nicht meine stärke aber dafür gibt es 
Rechtschreibkorrekturen ich weiß aber nicht mehr wie man die in FIREFOX 
aktiviert.

was den Code an geht wies jemand wie ich wen ich ein DWORT also 32BIT 
als ein variable habe wie ich davon gezielt ein Bit auswählen kann und 
dieses da auf eine zuvor definierte klemme ausgebe also zum Beispiel wen 
das 3. Bit eine 0 ist das ich dann die klemme 13 auf 0 setzen kann und 
wen das 4. eine eins ist und ich dann die klemme 14 auf 1 setzen kann 
usw.
Das es da so Blöcke gibt die das wohl auch können hab ich gelesen das 
kann ich aber nicht benutzen klaube ich den  meine klemmen Belegung 
passt da nicht  oder kann man die auch irgendwie anpassen? Ich möchte 
meine klemmen nicht anders belegen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> dafür gibt es Rechtschreibkorrekturen ich weiß aber nicht mehr
> wie man die in FIREFOX aktiviert.

da ist eine gute Anleitung dazu:

http://www.lmgtfy.com/?q=firefox+rechtschreibepr%C3%BCfung

von Thomas E. (thomase)


Lesenswert?

Mike B. schrieb:
> Rechtschreibung ist nicht meine stärke aber dafür gibt es
>
> Rechtschreibkorrekturen ich weiß aber nicht mehr wie man die in FIREFOX
>
> aktiviert.

Dafür gibt es Deutschkurse und guten Willen.

von Lehrmann M. (ubimbo)


Lesenswert?

Mike B. schrieb:
> Gefundene Rechtschreibfehler dürfen behalten werden

In diesem Forum disqualifiziert man sich mit sowas.

Mike B. schrieb:
> (wie ging bei FIREFOX die Rechtschreibkorrektur an ?)

Es ist ein ziemliches Armutszeugnis so einen Post abzugeben.  Wenn man 
nicht richtig schreiben kann, dann kann man das auch mit der 
Rechtschreibkorrektur nicht.

Ich muss dir ehrlich sagen, dass du hier keine Antwort bekommen wirst. 
Du gibst dir nicht die geringste Mühe und dann sehen wir auch nicht ein 
warum wir auch nur ein Quäntchen Arbeit in die Fehlersuche investieren 
sollten. In jedem Satz hagelt es nur so von Rechtschreibfehlern...

Die Grundsätze:

1. Schaltplan
2. Code leserlich machen (Array
3. eine vernünftige Fehlerbeschreibung (evtl. mit Video) - alleine für 
deine Fehlerbeschreibung brauche ich 5 Minuten um die zu dechiffrieren.
4. C vernpnftig lernen. Diese else-if sind nicht gerade schön. 
Stichwort: switch - case

zum Thema übersichtlich: warum nich angepasst à la:
1
buchstabe[][]{
2
{1,1,1,1,1,1,1,1},
3
{1,1,1,1,1,1,1,1},
4
{1,1,0,0,0,0,0,0},
5
{1,1,1,1,1,1,1,1},
6
{1,1,1,1,1,1,1,1},
7
{1,1,0,0,0,0,0,0},
8
{1,1,1,1,1,1,1,1},
9
{1,1,1,1,1,1,1,1}};
Das geübte Auge erkennt hier z.B. ein großes 'E' für eine 8x8 Matrix.

von Mike B. (mike13579)


Lesenswert?

1
const int bewegen = true;   //Lauftext ein aus
2
const int rechts = false;    //Bewegungsrichtung Lauftext false = links
3
const int time = 200 ;      //Bildwiederholungen bis zur bewegung
4
const int ledzeile = 26;    // LEDs in der Zeile 
5
const int ledspalte = 7;    // LEDs in der Spalte
6
//Pins zuortnung
7
int ledzeilePins[] = { 
8
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46 };   // pin nummern Zele
9
  
10
int ledspaltePins[] = { 
11
  14, 15, 16, 17, 18, 19, 20 };   // pin nummern Spalte
12
  
13
//Anzeige befüllen und stellenanzahl anpassen!!!
14
int zeile1[] = { 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
15
int zeile2[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
16
int zeile3[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
17
int zeile4[] = { 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
18
int zeile5[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
19
int zeile6[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
20
int zeile7[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
21
22
23
int beweg;
24
void setup() {
25
  // Pins auf output setzen
26
  for (int thisLed3 = 0; thisLed3 < ledzeile; thisLed3++) {
27
    pinMode(ledzeilePins[thisLed3], OUTPUT);
28
    
29
  for (int thisLed4 = 0; thisLed4 < ledspalte; thisLed4++) {
30
    pinMode(ledspaltePins[thisLed4], OUTPUT);
31
  }
32
}
33
}
34
void loop() 
35
{
36
  //laufrichtung
37
  if (bewegen == true && rechts ==true){      
38
  beweg = beweg + ledzeile - 1;
39
  }
40
  else if(bewegen == true && rechts ==false){
41
  beweg++;
42
  }
43
  else{
44
  beweg = 0;
45
  }
46
  //rüksetzung nach 1 umtrehung
47
  if(beweg > ledzeile ){
48
  beweg = beweg - ledzeile;
49
  }
50
  //bewegungszeitabschätzung
51
  for (int beweg2 = 0; beweg2 < time; beweg2++) 
52
  {
53
  int beweg1;  
54
  beweg1 = beweg;
55
  //darstellung erzeugen
56
     for (int Ledsenkrecht = 0; Ledsenkrecht < ledspalte; Ledsenkrecht++) 
57
     {
58
       for (int Ledwagerecht = 0; Ledwagerecht < ledzeile; Ledwagerecht++) 
59
       {
60
        if (beweg1 + Ledwagerecht > ledzeile)
61
        {
62
        beweg1 = beweg1 - ledzeile;
63
        } 
64
         switch(Ledsenkrecht)
65
        {
66
        case 0:digitalWrite (ledzeilePins[Ledwagerecht],zeile1[Ledwagerecht + beweg1]);
67
          break;
68
        case 1:digitalWrite (ledzeilePins[Ledwagerecht],zeile2[Ledwagerecht + beweg1]);
69
          break;
70
        case 2:digitalWrite (ledzeilePins[Ledwagerecht],zeile3[Ledwagerecht + beweg1]);
71
          break;
72
        case 3:digitalWrite (ledzeilePins[Ledwagerecht],zeile4[Ledwagerecht + beweg1]);
73
          break;
74
        case 4:digitalWrite (ledzeilePins[Ledwagerecht],zeile5[Ledwagerecht + beweg1]);
75
          break;
76
        case 5:digitalWrite (ledzeilePins[Ledwagerecht],zeile6[Ledwagerecht + beweg1]);
77
          break;
78
        case 6:digitalWrite (ledzeilePins[Ledwagerecht],zeile7[Ledwagerecht + beweg1]);
79
          break;
80
       
81
        default:;
82
        }
83
      }
84
      digitalWrite(ledspaltePins[Ledsenkrecht], HIGH);
85
      delay (1);
86
      digitalWrite(ledspaltePins[Ledsenkrecht], LOW);
87
    }
88
  }
89
}
Habe denn Code Optimiert damit er übersichtlicher ist hoffe ihr seht das 
auch so.
das Problem besteht jedoch immer noch die ersten 5 Verschiebungen sind 
verzert
das sieht dann etwa so aus :
erst so
000110
001001
001001
001001
001111
001001
101001
dann 2mal so
0110
0110
1001
1001
1111
1001
1001
dann so
0110
0010
1001
1101
1011
1001
1001
dann so
0110
1000
1001
1111
1001
1001
1001
danach wird es dann richtig angezeigt bis die anzeige einmal im Greis 
herum ist und es beginnt von neuem versteht das jemand ?

von Karl H. (kbuchegg)


Lesenswert?

Mike B. schrieb:

> Habe denn Code Optimiert damit er übersichtlicher ist hoffe ihr seht das
> auch so.

NOch nicht ganz.
Deine Funktion loop() mit den ganzen beweg, beweg2, ledwaagrecht, 
ledsenkrecht und was weiß ich noch für Variablen, kommt mir extrem 
kompliziert vor.

Ich bin mir sehr sicher, dass man das auch um vieles einfacher schreiben 
kann.

Beim drüberlesen bin ich nicht davon überzeugt, dass deine Arrayzugriffe 
da alle richtig sind und nirgends über das Ende eines Arrays zugegriffen 
wird.

So würde ich die Sache angehen:

Zuerst mal schreib ich mir eine Funktion, die eine einzige Zeile 
ausgibt. Die Funktion bekommt die Zeilennummer und einen Offset 
übergeben. Aufgabe der Funktion ist es die entsprechende Zeile 
auszugeben. Das macht sie in 2 Schritten beginnend bei der ersten LED:
Der erste Schritt: vom Offset beginnend bis zum Ende der Zeile
Der zweite Schritt: vom Beginn der Zeile bis zum Offset


Durch erhöhen des Offsets kann man daher die Zeile entsprechend 
verschoben auf den LED darstellen.

Diese Funktion wird dann in einer zweite Funktion entsprechend oft mit 
unterschiedlichen Zeilennummern aufgerufen um das antsprechende Bild 
auszugeben.


(Wobei die ganze Ausgabe eigentlich in eine Interrupt Steuerung gehören 
würde, damit sie maximal regelmässig erfolgt)

von Mike B. (mike13579)


Lesenswert?

Karl heinz Buchegger schrieb:
> So würde ich die Sache angehen:
>
> Zuerst mal schreib ich mir eine Funktion, die eine einzige Zeile
> ausgibt. Die Funktion bekommt die Zeilennummer und einen Offset
> übergeben. Aufgabe der Funktion ist es die entsprechende Zeile
> auszugeben. Das macht sie in 2 Schritten beginnend bei der ersten LED:
> Der erste Schritt: vom Offset beginnend bis zum Ende der Zeile
> Der zweite Schritt: vom Beginn der Zeile bis zum Offset
>
das verstehe ich jetzt nicht ganz was meinst du mit Offset, wie sieht so 
etwas aus ein kleine Beispiel wehre echt Super.

> Durch erhöhen des Offsets kann man daher die Zeile entsprechend
> verschoben auf den LED darstellen.
>
> Diese Funktion wird dann in einer zweite Funktion entsprechend oft mit
> unterschiedlichen Zeilennummern aufgerufen um das antsprechende Bild
> auszugeben.
>
erinnert mich irgendwie an das was ich da gemacht habe.

> (Wobei die ganze Ausgabe eigentlich in eine Interrupt Steuerung gehören
> würde, damit sie maximal regelmässig erfolgt)

das mit der Interrupt Steuerung hab ich nicht verstanden davon steht 
auch in dem Tutorien etwas drin 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

danke schon mal für jede weitere Antwort
MFG MIKE

ps bin halt noch Anfänger

von Thomas E. (thomase)


Lesenswert?

Mike B. schrieb:
> mein Controller ist ein TAMEGA2560
>
> die klemmen 14 bis 20 sind für die Zeilen die klemmen 21-46 für die
>
> spalten

Was ist denn das für ein Board?
Und was sind die Klemmen?

Arduino Mega 2560?

mfg.

von Mike B. (mike13579)


Lesenswert?

das hier :http://arduino.cc/en/Main/ArduinoBoardMega2560
und da oben ist ein Dreher drin auf dem Controller (ich mein das 
schwarze teil in der Mitte von dem Board)  steht ATMEGA2560

von Karl H. (kbuchegg)


Lesenswert?

Mike B. schrieb:

> das verstehe ich jetzt nicht ganz was meinst du mit Offset, wie sieht so
> etwas aus ein kleine Beispiel wehre echt Super.

Ist ganz einfach

Das ist dein Zeilenarray (eines davon)

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  ...
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

da stehen deine 0 und 1 drinnen

Der 'Offset' (ob man das Offset oder Startindex oder ... nennt, spielt 
keine Rolle) teilt dieses Array in 2 logische Teile

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  ...
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                                ^
                                |
                             Offset

beginnt man beim Offset auszugeben, bis zum Ende der Zeile, dann ist die 
erste LED abhängig vom Arrayelement mit der Nummer 7, die nächste von 8, 
die nächste von ....

Auf den Ausgängen erscheint das Array also so

    7   8   9   10  11  12  13  14    0   1   2   3   4   5   6
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    ^
    |
  Offset

legt man den Offset auf 8

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  ...
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                                    ^
                                    |
                                  Offset

dann wird auch das Array entsprechend anders an die Ausgänge ausgegeben

    8   9   10  11  12  13  14    0   1   2   3   4   5   6   7
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    ^
    |
  Offset

Der Offset sagt also nicht anderes aus, als ab wo, ab welcher Position 
eine Zeile auf die LED ausgegeben werden soll.

In Code
1
void WriteLine( int* zeile, int Spalte, int Offset )
2
{
3
  int i;
4
  int ledNr = 0;
5
6
  for( i = Offset; i < ledzeile; ++i )
7
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
8
9
  for( i = 0; i < Offset; ++i )
10
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
11
12
  digitalWrite(ledspaltePins[Spalte], HIGH);
13
  delay (1);
14
  digitalWrite(ledspaltePins[Spalte], LOW);
15
}
16
17
void WriteImage( int Offset )
18
{
19
  WriteLine( zeile1, 1, Offset );
20
  WriteLine( zeile2, 2, Offset );
21
  WriteLine( zeile3, 3, Offset );
22
  WriteLine( zeile4, 4, Offset );
23
  WriteLine( zeile5, 5, Offset );
24
  WriteLine( zeile6, 6, Offset );
25
  WriteLine( zeile7, 7, Offset );
26
}

Das macht IMHO genau dasselbe, was du da kompliziert mit deinen 
verschachtelten Schleifen versuchst zu bewerkstelligen.

>>
> erinnert mich irgendwie an das was ich da gemacht habe.

Ja es macht nichts anderes. Allerdings geordneter. Geordneter dadurch, 
dass ich nicht versuche alles in eine einzige innere Schleife zu 
quetschen. Der springende Punkt ist:
Du versuchst da einen Zähler über das Zeilenende wieder auf den 
Zeilenanfang laufen zu lassen und hast dich da irgendwo vertan.
Ich versuch das erst gar nicht, sondern akzeptiere, dass eine komplette 
Zeile in 2 Teile zerfällt, je nachdem wo die Ausgabe anfangen soll. 
Zuerst wird von der Anfangsstelle der verbleibende Rest dieser Zeile 
ausgegeben und dann hinten nach noch der Zeilenanfang.



PS: Ich denke in deinem letzten Code hat die Variable 'beweg' die 
Aufgabe die ich 'Offset' nenne. Ist aber schwer zu sagen, weil aus 
deinem Code nicht sehr gutb hervorgeht, welche Rolle beweg bzw. beweg2 
spielen und der Name der Variable ist nicht besonders hilfreich.

von Mike B. (mike13579)


Lesenswert?

ich probiere das mal aus

von Mike B. (mike13579)


Lesenswert?

:( leuchtet gar nichts mehr
habe das eingebaut was du geschrieben hast ist das so richtig ?
1
const int bewegen = true;   //Lauftext ein aus
2
const int rechts = false;    //Bewegungsrichtung Lauftext false = links
3
const int time = 200 ;      //Bildwiederholungen bis zur bewegung
4
const int ledzeile = 26;    // LEDs in der Zeile 
5
const int ledspalte = 7;    // LEDs in der Spalte
6
//Pins zuortnung
7
int ledzeilePins[] = { 
8
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46 };   // pin nummern Zele
9
  
10
int ledspaltePins[] = { 
11
  14, 15, 16, 17, 18, 19, 20 };   // pin nummern Spalte
12
  
13
//Anzeige befüllen und stellenanzahl anpassen!!!
14
int zeile1[] = { 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
15
int zeile2[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
16
int zeile3[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
17
int zeile4[] = { 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
18
int zeile5[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
19
int zeile6[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
20
int zeile7[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
21
22
23
int beweg;
24
void setup() {
25
  // Pins auf output setzen
26
  for (int thisLed3 = 0; thisLed3 < ledzeile; thisLed3++) {
27
    pinMode(ledzeilePins[thisLed3], OUTPUT);
28
    
29
  for (int thisLed4 = 0; thisLed4 < ledspalte; thisLed4++) {
30
    pinMode(ledspaltePins[thisLed4], OUTPUT);
31
  }
32
}
33
}
34
void WriteLine( int* zeile, int Spalte, int Offset )
35
{
36
  int i;
37
  int ledNr = 0;
38
39
  for( i = Offset; i < ledzeile; ++i )
40
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
41
42
  for( i = 0; i < Offset; ++i )
43
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
44
45
  digitalWrite(ledspaltePins[Spalte], HIGH);
46
  delay (1);
47
  digitalWrite(ledspaltePins[Spalte], LOW);
48
}
49
50
void WriteImage( int Offset )
51
{
52
  WriteLine( zeile1, 1, Offset );
53
  WriteLine( zeile2, 2, Offset );
54
  WriteLine( zeile3, 3, Offset );
55
  WriteLine( zeile4, 4, Offset );
56
  WriteLine( zeile5, 5, Offset );
57
  WriteLine( zeile6, 6, Offset );
58
  WriteLine( zeile7, 7, Offset );
59
}
60
61
void loop() 
62
{WriteImage;
63
64
65
}
hab ich das so richtig gemacht oder muss man das anders machen ?

von Karl H. (kbuchegg)


Lesenswert?

Mike B. schrieb:
> :( leuchtet gar nichts mehr

Denk immer drann: Ich hab nicht deine Hardware.
Ich kann das daher nicht testen, sondern muss blind schreiben.

Eine gewisse Skepsis bzw. mitdenken bei der Übernahme von Code ist daher 
immer angebracht.

von Karl H. (kbuchegg)


Lesenswert?

Mike B. schrieb:

> void loop()
> {WriteImage;
>
>
> }

> hab ich das so richtig gemacht oder muss man das anders machen ?


Das kompiliert nicht mal

void loop
{
  int i;

  for( i = 0; i < ledzeile; ++i )
    WriteImage( i );
}

Wie du da jetzt deine Bewegung (mit Richtungsänderung) reinbaust, musst 
du entscheiden.

von Mike B. (mike13579)


Lesenswert?

es Läuft danke an alle die mir geholfen haben
MFG MIKE
hier mein Code
1
const int bewegen = true;   //Lauftext ein aus
2
const int rechts = false;    //Bewegungsrichtung Lauftext false = links
3
const int time = 50 ;      //Bildwiederholungen bis zur bewegung
4
const int ledzeile = 26;    // LEDs in der Zeile 
5
const int ledspalte = 7;    // LEDs in der Spalte
6
//Pins zuortnung
7
int ledzeilePins[] = { 
8
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46 };   // pin nummern Zele
9
  
10
int ledspaltePins[] = { 
11
  14, 15, 16, 17, 18, 19, 20 };   // pin nummern Spalte
12
  
13
//Anzeige befüllen und stellenanzahl anpassen!!!
14
int zeile1[] = { 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
15
int zeile2[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
16
int zeile3[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
17
int zeile4[] = { 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
18
int zeile5[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
19
int zeile6[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
20
int zeile7[] = { 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
21
22
23
int beweg;
24
void setup() {
25
  // Pins auf output setzen
26
  for (int thisLed3 = 0; thisLed3 < ledzeile; thisLed3++) {
27
    pinMode(ledzeilePins[thisLed3], OUTPUT);
28
    
29
  for (int thisLed4 = 0; thisLed4 < ledspalte; thisLed4++) {
30
    pinMode(ledspaltePins[thisLed4], OUTPUT);
31
  }
32
}
33
}
34
void loop()
35
{ 
36
  
37
  int i;
38
  if (bewegen == true && rechts ==true){      
39
  for( i = ledzeile; i > 0; --i )
40
    WriteImage( i );
41
  
42
  }
43
  else if(bewegen == true && rechts ==false){
44
  for( i = 0; i < ledzeile; ++i )
45
    WriteImage( i );
46
  }
47
  else{
48
  i = 0;
49
  
50
  
51
    WriteImage( i );
52
  }
53
}
54
55
void WriteLine( int* zeile, int Spalte, int Offset )
56
{
57
  int i;
58
  int ledNr = 0;
59
  for( i = Offset; i < ledzeile; ++i )
60
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
61
  for( i = 0; i < Offset; ++i )
62
    digitalWrite( ledzeilePins[ledNr++], zeile[i] );
63
  digitalWrite(ledspaltePins[Spalte], HIGH);
64
  delay (1);
65
  digitalWrite(ledspaltePins[Spalte], LOW); 
66
}
67
68
void WriteImage( int Offset )
69
{
70
  for( int timer =0; timer < time;timer++){
71
  WriteLine( zeile1, 0, Offset );
72
  WriteLine( zeile2, 1, Offset );
73
  WriteLine( zeile3, 2, Offset );
74
  WriteLine( zeile4, 3, Offset );
75
  WriteLine( zeile5, 4, Offset );
76
  WriteLine( zeile6, 5, Offset );
77
  WriteLine( zeile7, 6, Offset );
78
}
79
}

von Peter D. (peda)


Lesenswert?

Mike B. schrieb:
> es Läuft

Es könnte sich trotzdem lohnen, nicht so verschwenderisch mit Speicher 
umzugehen, er könnte Dir sonst schnell ausgehen, wenn das Programm noch 
mehr machen soll.

Dein Zeilenspeicher belegt ja schon 364 Byte, nötig sind aber nur 26 
Byte.


Peter

von Mike B. (mike13579)


Lesenswert?

wen ich aufspiele steht da das hier
Binary sketch size: 2910 bytes (of a 258048 byte maximum)
das aber auch erst seit dem ich die werte für die anzeige im boolean 
habe im int
steht dann da :
Binary sketch size: 3616 bytes (of a 258048 byte maximum)

aktueller code (für lange Texte kann man wahrscheinlich noch länger 
machen ich werde nur das Gefühl nicht los das ich bei dieser Art der 
Zeilen Verlängerung Rechenleistung und Zeit verschenke ich denke ich 
sollte eine weitere variable benutzen um die Länge der anzeige von der 
Länge des anzuzeigenden Inhaltes zu trennen, das werde ich morgen mal 
ausprobieren):
1
const int bewegen = true;   //Lauftext ein aus
2
const int rechts = false;    //Bewegungsrichtung Lauftext false = links
3
const int time = 30 ;      //Bildwiederholungen bis zur bewegung
4
const int ledzeile = 100;    // LEDs in der Zeile 
5
const int ledspalte = 7;    // LEDs in der Spalte
6
//Pins zuortnung
7
int ledzeilePins[] = { 
8
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,47,47 ,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 ,47,47,47,47,47,47,47,47,47,47,47 };   // pin nummern Zele
9
  
10
int ledspaltePins[] = { 
11
  14, 15, 16, 17, 18, 19, 20 };   // pin nummern Spalte
12
  
13
//Anzeige befüllen und stellenanzahl anpassen!!!
14
boolean zeile[][100]= {
15
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
16
{0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
17
{0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
18
{0,1,1,1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0},
19
{0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
20
{0,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
21
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
22
23
int beweg;
24
void setup() {
25
  // Pins auf output setzen
26
  for (int thisLed3 = 0; thisLed3 < ledzeile; thisLed3++) {
27
    pinMode(ledzeilePins[thisLed3], OUTPUT);
28
  for (int thisLed4 = 0; thisLed4 < ledspalte; thisLed4++) {
29
    pinMode(ledspaltePins[thisLed4], OUTPUT);
30
  }
31
}
32
}
33
void loop()
34
{ 
35
  int i;
36
  if (bewegen == true && rechts ==true){      
37
  for( i = ledzeile; i > 0; --i )
38
    WriteImage( i );
39
  }
40
  else if(bewegen == true && rechts ==false){
41
  for( i = 0; i < ledzeile; ++i )
42
    WriteImage( i );
43
  }
44
  else{
45
  i = 0;
46
  WriteImage( i );
47
  }
48
}
49
void WriteLine( int Spalte, int Offset )
50
{
51
  int i;
52
  int ledNr = 0;
53
  for( i = Offset; i < ledzeile; ++i )
54
    digitalWrite( ledzeilePins[ledNr++], zeile[Spalte][i] );
55
  for( i = 0; i < Offset; ++i )
56
    digitalWrite( ledzeilePins[ledNr++], zeile[Spalte][i] );
57
  digitalWrite(ledspaltePins[Spalte], HIGH);
58
  delay (1);
59
  digitalWrite(ledspaltePins[Spalte], LOW); 
60
}
61
void WriteImage( int Offset )
62
{
63
  for( int timer =0; timer < time;timer++){
64
  WriteLine( 0, Offset );
65
  WriteLine( 1, Offset );
66
  WriteLine( 2, Offset );
67
  WriteLine( 3, Offset );
68
  WriteLine( 4, Offset );
69
  WriteLine( 5, Offset );
70
  WriteLine( 6, Offset );
71
}
72
}

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.