mikrocontroller.net

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


Autor: Daniel Frank (franky55555)
Datum:

Bewertung
0 lesenswert
nicht 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:
/*
#####################################################
pin D0-7:LED1-8
pin C0: Led9
pin C1-3: ebene 1-3



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


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

Ebene aktiv:    ________----------________----------________----------________----------________----------

led: 100%      ________----------________----------________----------________----------________----------

led: 80%:      __________--------__________--------__________--------__________--------__________--------

led: 50%:      _____________-----_____________-----_____________-----_____________-----_____________-----

led: 20%:      ________________--________________--________________--________________--________________--

led: 0%:      __________________________________________________________________________________________

#####################################################
*/







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






int zaehler_helligkeit=15;
int ebene=0;
  
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
                  {15, 15, 15, 15, 15, 15, 15, 15, 15},
              {15, 15, 15, 15, 15, 15, 15, 15, 15}};

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




void init(void)
{
  DDRD = 0b11111111; 
  DDRC = 0b11111111; 
  //Timer-Einstellungen
  outp((1<<TOV0), TIMSK);      //Timer Overflow Interrupt einschalten
  TCNT0=0x00;            //Zähler-Startwert setzen
  outp((1<<CS00), TCCR0);      //vorteiler: 0
  sei();              //Interrupts einschalten
}








ISR(TIMER0_OVF_vect)   /*Interrupt-Routine*/
{

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

  //zählt 15-0_15-0
  if(zaehler_helligkeit==0)    //wenn der durchlauf fertig ist...
  {
    zaehler_helligkeit=15;    //..., dann wieder von vorne beginnen und...
    ebene++;          //...nächste ebene aktivieren
    if (ebene==3)        //wenn alle ebenen dran waren...
    {
      ebene=0;        //..., dannn wieder von vorne beginnen
    }
  }
  else
  {
    zaehler_helligkeit--;    //wenn der durchlauf noch nicht fertig ist, dann runterzählen
  }

  ebenen_ausgaenge[0]=0;
  ebenen_ausgaenge[1]=0;
  ebenen_ausgaenge[2]=0;

  switch (ebene)  //ebene_? aktivieren, die anderen deaktivieren
  {
    case 0: 
      ebenen_ausgaenge[0]=1;
    break;
    

    case 1:
      ebenen_ausgaenge[1]=1;
    break;


    case 2: 
      ebenen_ausgaenge[2]=1;
    break;
  }

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

    if(led[ebene][i]>=zaehler_helligkeit)
    {  
      led_ausgaenge [i]=1;
    }
    else
    {
      led_ausgaenge [i]=0;
    }

  }

  //muss noch geschrieben werden:
  //ebenen_ausgaenge [3] -->Ausgangspins
  //led_ausgaenge [9] --> Ausgangspins

}









int main(void) 
{

  init();  //init() starten

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

  }

} 




Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Daniel Frank (franky55555)
Datum:

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

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.