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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren