Forum: Mikrocontroller und Digitale Elektronik Arrays mit 0 und 1 drin direkt in die port-register schreiben


von Daniel F. (franky55555)


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
}

von Stefan B. (stefan) Benutzerseite


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.

von Daniel F. (franky55555)


Lesenswert?

Ich hab das Programm jetzt geändert, sodass nicht mehr so viel speicher 
verschwendet wird, und auch noch andere Dinge, und jetzt gehts.

Danke für die Antwort!

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.