Arrays mit 0 und 1 drin direkt in die port-register schreiben

OP #2000696
Lesenswert?
• ▲
▼
Hi!

Ich schreibe gerade ein Programm für einen 3x3x3 LED-cube mit einem 
Atmega8.

Anschlüsse:

pin D0-7:LED1-8
pin C0: Led9
pin C1-3: ebene 1-3

Am Ende von allen Berechnungen und so bekomme ich 2 int Arrays raus:

int led_ausgaenge [9];
int ebenen_ausgaenge [3];

Überall steht eine 0 oder eine 1 drin, je nachdem ob die Säule/Ebene 
aktiv sein sollen, oder nicht.

Wie kann ich die Werte der Arrays am schnellsten in die Ports schreiben?


Ich hoffe ich habe die frage halbwegs verständlich formuliert...

MfG


PS:

Hier noch der ganze Quellcode, falls es euch hilft:
1
/*
2
#####################################################
3
pin D0-7:LED1-8
4
pin C0: Led9
5
pin C1-3: ebene 1-3
6

7

8

9
led_cube_3x3x3
10
4bit-helligkeitsstufen (16, 0-15)
11
Nicht Funktionsfähig, nur theoretischer Aufbau!
12
interruptfrequenz nicht richtig eingestellt!
13

14

15
Erklärung:
16
wenn die jeweilige ebene aktiv ist, dann wird jede led der ebene so lange eingeschltet, wie es der helligkeit im array entspricht
17

18
Ebene aktiv:    ________----------________----------________----------________----------________----------
19

20
led: 100%      ________----------________----------________----------________----------________----------
21

22
led: 80%:      __________--------__________--------__________--------__________--------__________--------
23

24
led: 50%:      _____________-----_____________-----_____________-----_____________-----_____________-----
25

26
led: 20%:      ________________--________________--________________--________________--________________--
27

28
led: 0%:      __________________________________________________________________________________________
29

30
#####################################################
31
*/
32

33

34

35

36

37

38

39
#include <avr\io.h>
40
#include <avr\interrupt.h>
41
#define outp(a,b) b=a;
42

43

44

45

46

47

48
int zaehler_helligkeit=15;
49
int ebene=0;
50
  
51
int led[3][9]=      {{15, 15, 15, 15, 15, 15, 15, 15, 15},    //Array in dem die Helligkeiten der leds gespeichert sind, Die 3 zeilen sind die 3 ebenen im würfel, und die 9 spalten die 9 türme. 0=dunkel, 15=hell
52
                  {15, 15, 15, 15, 15, 15, 15, 15, 15},
53
              {15, 15, 15, 15, 15, 15, 15, 15, 15}};
54

55
int led_ausgaenge [9];
56
int ebenen_ausgaenge [3];
57

58

59

60

61
void init(void)
62
{
63
  DDRD = 0b11111111; 
64
  DDRC = 0b11111111; 
65
  //Timer-Einstellungen
66
  outp((1<<TOV0), TIMSK);      //Timer Overflow Interrupt einschalten
67
  TCNT0=0x00;            //Zähler-Startwert setzen
68
  outp((1<<CS00), TCCR0);      //vorteiler: 0
69
  sei();              //Interrupts einschalten
70
}
71

72

73

74

75

76

77

78

79
ISR(TIMER0_OVF_vect)   /*Interrupt-Routine*/
80
{
81

82
  //ebenen-multiplex-frequenz=interrupt-frequenz/(16*3)
83

84
  //zählt 15-0_15-0
85
  if(zaehler_helligkeit==0)    //wenn der durchlauf fertig ist...
86
  {
87
    zaehler_helligkeit=15;    //..., dann wieder von vorne beginnen und...
88
    ebene++;          //...nächste ebene aktivieren
89
    if (ebene==3)        //wenn alle ebenen dran waren...
90
    {
91
      ebene=0;        //..., dannn wieder von vorne beginnen
92
    }
93
  }
94
  else
95
  {
96
    zaehler_helligkeit--;    //wenn der durchlauf noch nicht fertig ist, dann runterzählen
97
  }
98

99
  ebenen_ausgaenge[0]=0;
100
  ebenen_ausgaenge[1]=0;
101
  ebenen_ausgaenge[2]=0;
102

103
  switch (ebene)  //ebene_? aktivieren, die anderen deaktivieren
104
  {
105
    case 0: 
106
      ebenen_ausgaenge[0]=1;
107
    break;
108
    
109

110
    case 1:
111
      ebenen_ausgaenge[1]=1;
112
    break;
113

114

115
    case 2: 
116
      ebenen_ausgaenge[2]=1;
117
    break;
118
  }
119

120
  for(int i=0;i<9;i++)      //für jeden led ausgang machen
121
  {
122

123
    if(led[ebene][i]>=zaehler_helligkeit)
124
    {  
125
      led_ausgaenge [i]=1;
126
    }
127
    else
128
    {
129
      led_ausgaenge [i]=0;
130
    }
131

132
  }
133

134
  //muss noch geschrieben werden:
135
  //ebenen_ausgaenge [3] -->Ausgangspins
136
  //led_ausgaenge [9] --> Ausgangspins
137

138
}
139

140

141

142

143

144

145

146

147

148
int main(void) 
149
{
150

151
  init();  //init() starten
152

153
  while (1)
154
  {
155
    
156
    //Hier kommt was hin, das immer neue werte in das array schreibt, um die leds zu verändern, um Muster zu erzeugen
157

158
  }
159

160
}
Persönliche Seite #2001081
Lesenswert?
• ▲
▼
Daniel Frank schrieb:

> int led_ausgaenge [9];
> int ebenen_ausgaenge [3];

Warum int ((9+3)*sizeof(int) = 24 Bytes plus kompliziertere Zugriffe)?

Ein uint8_t für das Feldelement ist ein Datentyp, der in ein AVR 
Register passt und halb so groß wie int ist.

> int led[3][9]=      {{15, 15, 15, 15, 15, 15, 15, 15, 15}, ...

Das sind nochmal sogar 27*2 = 54 Bytes statt 27.

Beiträge mit Quellcode größer als eine Bildschirmseite sind IMHO 
unbequem zu lesen. Da macht es Sinn, den Quellcode als Anhang zu posten.

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.