mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei For-Schleife


Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hänge schon ewig an einer for-Schleife und komm nicht weiter.
#include <stdio.h>
#include <stdlib.h>
//Variablen für die Zeit
volatile unsigned int  millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

int Zeit[6];
int binZeit[6][4] = { 
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, }
};
int ledMatrix[4][6] = { 
  { 9, 0, 9, 0, 9, 0, },
  { 9, 0, 0, 0, 0, 0, },
  { 0, 0, 0, 0, 0, 0, },
  { 0, 0, 0, 0, 0, 0, }
};
int counter = 0;
int dezimalzahl,dezimalzahl_rest,dezimalzahl_new,durchlauf = 0;
int main(void)
{
  while(counter != 1)
  {
    counter++;
    stunde = 13;
    minute = 50;
    sekunde = 12; 
    
    Zeit[0] = stunde / 10;
    Zeit[1] = stunde % 10;
    Zeit[2] = minute / 10;
    Zeit[3] = minute % 10;
    Zeit[4] = sekunde / 10;
    Zeit[5] = sekunde % 10;
    printf("%d%d:%d%d:%d%d\n", Zeit[0], Zeit[1], Zeit[2], Zeit[3], Zeit[4], Zeit[5]);
    
    for(int ix = 0; ix!=6; ix++) {
      dezimalzahl = 0;dezimalzahl_rest = 0;dezimalzahl_new = 0;durchlauf = 0;
        dezimalzahl = Zeit[ix];
      while (dezimalzahl != 0) {
        dezimalzahl_rest = dezimalzahl % 2;
        dezimalzahl_new = dezimalzahl / 2;
        dezimalzahl = dezimalzahl_new;  
        binZeit[ix][durchlauf] = dezimalzahl_rest;
        durchlauf++;
      }
    }
    printf("%d%d%d%d\n", binZeit[0][0],binZeit[0][1],binZeit[0][2],binZeit[0][3]);
    printf("%d%d%d%d\n", binZeit[1][0],binZeit[1][1],binZeit[1][2],binZeit[1][3]);
    printf("%d%d%d%d\n", binZeit[2][0],binZeit[2][1],binZeit[2][2],binZeit[2][3]);
    printf("%d%d%d%d\n", binZeit[3][0],binZeit[3][1],binZeit[3][2],binZeit[3][3]);
    printf("%d%d%d%d\n", binZeit[4][0],binZeit[4][1],binZeit[4][2],binZeit[4][3]);
    printf("%d%d%d%d\n", binZeit[5][0],binZeit[5][1],binZeit[5][2],binZeit[5][3]);
    
    //Problem:
    for (int o=0; o!=6; o++) {
      int q = 3;
      for (int i=3; i!=1; i--) {
        
        if (ledMatrix[o][i] !=9) { 
          ledMatrix[o][i] = binZeit[o][q];
          printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
        } else if(ledMatrix[o][i] ==9) {
          printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
        }

        if(q == 3){q=0;}else{q++;}
      }
    }

  
    for (int wa = 0; wa != 4; wa++)
    {
      for (int ui = 0; ui != 6; ui++) { 
        
        printf("%d\t", ledMatrix[wa][ui]);
        
      }
      printf("\n\n");
    } 
  }  
}
So sieht die binZeit dann aus. 6x4
1000
1100
1010
0000
1000
0100
und das soll in eine 4x6 Matrix.. dabei komm ich nicht weiter. Ich hatte 
es mal so weit, dass die Zahlen horizontal eingetragen wurden, aber ich 
brauch sie vertikal.
Die 1. Spalte sollte dann so aussehen:
9
9
0
1
Vielleicht kann mir jemand helfen.

Autor: Schmutzwinkelpituka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, mich würde mal interessieren, was genau denn das für eine Anwendung 
sein soll? Also multiplizieren willst Du die beiden Matrizen binZeit und 
led-Matrix nicht miteinander, oder?

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Da ist erstmal ein Fehler drin:

int binZeit[6][4] = {
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, }
};

6*4 Matrix sieht anders aus.

Ansonsten wird deine Zeit doch ausgegeben. LSB - MSB vertauscht.

Ich verstehe das Problem noch nicht so richtig.

Gruß
Joachim

Autor: Schmutzwinkelpituka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal - an dieser Stelle definierst Du ledMatrix mit [4][6]

Luke Skywalker schrieb:
> int ledMatrix[4][6] = {

Luke Skywalker schrieb:
> for (int o=0; o!=6; o++) {
>
>       int q = 3;
>
>       for (int i=3; i!=1; i--) {
>
>
>
>         if (ledMatrix[o][i] !=9) {
                        o geht von 0 bis 5, du hast aber oben die erste 
Klammer bis 4 gesetzt, da scheint irgendwo der Wurm vielleicht drinnen 
zu sein. Vertausch doch einfach mal o und i

if (ledMatrix [i][o] ... dann stimmt zumindest schon mal die Dimension)

>
>           ledMatrix[o][i] = binZeit[o][q];

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze soll eine Binäruhr werden, ich hätte gern die Matrix direkt 
wie die Anzeige später sein soll.
Multiplizieren möchte ich sie nicht. Ich poste mal den gesamten output 
mit dem veränderten Teil:
for (int o=0; o!=6; o++) {
      int q = 3;
      for (int i=3; i!=1; i--) {
        
        if (ledMatrix[i][o] !=9) { 
          ledMatrix[i][o] = binZeit[o][q];
          printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
        } else if(ledMatrix[i][o] ==9) {
          printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
        }

        if(q == 3){q=0;}else{q++;}
      }
    }
13:50:12
1000
1100
1010
0000
1000
0100
ledMatrix[0][3] ist 0
ledMatrix[0][2] ist 9
ledMatrix[1][3] ist 0
ledMatrix[1][2] ist 0
ledMatrix[2][3] ist 0
ledMatrix[2][2] ist 1
ledMatrix[3][3] ist 0
ledMatrix[3][2] ist 0
ledMatrix[4][3] ist 0
ledMatrix[4][2] ist 0
ledMatrix[5][3] ist 2
ledMatrix[5][2] ist 1
9  0  9  0  9  0

9  0  0  0  0  0

1  1  1  0  1  0

0  0  0  0  0  0

Blickt ihr genauso wenig durch wie ich?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Blickt ihr genauso wenig durch wie ich?
Ja. Aber ich habe den Verdacht, dass hier etwas kompliziert gemacht 
werden soll, was anders wesentlich einfacher geht...

Wenn ich das sehe, dann frage ich mich, warum hier nicht einfach 
Bitoperationen verwendet werden:
      while (dezimalzahl != 0) {
        dezimalzahl_rest = dezimalzahl % 2;
        dezimalzahl_new = dezimalzahl / 2;
        dezimalzahl = dezimalzahl_new;  
        binZeit[ix][durchlauf] = dezimalzahl_rest;
        durchlauf++;
      }
Und zudem: was passiert denn da, wenn die dezimalzahl schon von herein 
mal 0 ist? Klar: die alten Werte bleiben im Array stehen...

Ich würde das mal so probieren:
    for (int k=0, k<6, k++) {
        binZeit[ix][k] = dezimalzahl & 1;
        dezimalzahl>>=1;
    }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:

> Blickt ihr genauso wenig durch wie ich?

Allerdings.
Ich werde das Gefühl nicht los, dass du dich komplett verrannt hast und 
das alles eigentlich sehr viel einfacher gemacht werden kann. Aber ich 
hab noch nicht durchschaut was dann weiter mit dem LED Array passieren 
soll, daher halte ich meinen Mund.
Bzw. Ich denke, dass du dieses ganze 2D Array gar nicht brauchst.

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin noch nicht so lang am uC programmieren, deswegen beherrsche ich die 
Bitmanipulation noch nicht so recht. Ich denke, dass sich das Array gut 
fürs multiplexen eignet, was ich aber auch noch nie gemacht habe.
Lothars Variante scheint zu funktionieren.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Ich denke, dass sich das Array gut fürs multiplexen eignet,
> was ich aber auch noch nie gemacht habe.
Aber das willst du nicht auf einem uC zum Laufen bekommen, oder?  :-o
Stichwort Speicherplatz:
int Zeit[6];
int binZeit[6][4] = { ...
int ledMatrix[4][6] = { ...

> Lothars Variante scheint zu funktionieren.
Dann war das Problem im frühzeitigen Abbruch der inneren Schleife...


Für diese Anwendung hier könnte ich mir sogar Bitfelder ganz gut 
vorstellen, denn im binZeit-Array werden ja nur Bits (0 und 1) 
gespeichert...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Bin noch nicht so lang am uC programmieren, deswegen beherrsche ich die
> Bitmanipulation noch nicht so recht.

Solltest du aber.
Gerade auf einem µC ist das das A und O

> Ich denke, dass sich das Array gut
> fürs multiplexen eignet,

wie sind denn deine LED angeschlossen?
(Hoffentlich kommt jetzt keine wilde Verteilung über 25 Ports :-)

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Bitfeldern hab ich noch nie etwas gehört. :D
Meinst du, dass es mit den Arrays nicht klappen wird? Der Quelltext wird 
sich höchstens noch verdoppeln. Das Projek soll auf einem mega16 laufen.
Die Ausgabe ist nun:
13:50:12
1000
1100
1010
0000
1000
0100
ledMatrix[0][3] ist 0
ledMatrix[0][2] ist 0
ledMatrix[1][3] ist 0
ledMatrix[1][2] ist 0
ledMatrix[2][3] ist 0
ledMatrix[2][2] ist 1
ledMatrix[3][3] ist 0
ledMatrix[3][2] ist 0
ledMatrix[4][3] ist 0
ledMatrix[4][2] ist 0
ledMatrix[5][3] ist 2
ledMatrix[5][2] ist 1
1  0  0  0  0  1

0  0  0  0  0  0

1  1  1  0  1  0

0  0  0  0  0  0
Und der Quelltext:
#include <stdio.h>
#include <stdlib.h>
//Variablen für die Zeit
volatile unsigned int  millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

int Zeit[6];
int binZeit[4][4] = { 
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, },
  { 0, 0, 0, 0, }
};
int ledMatrix[4][6] = { 
  { 9, 0, 9, 0, 9, 0, },
  { 9, 0, 0, 0, 0, 0, },
  { 0, 0, 0, 0, 0, 0, },
  { 0, 0, 0, 0, 0, 0, }
};
int counter = 0;
int dezimalzahl,dezimalzahl_rest,dezimalzahl_new,durchlauf = 0;
int main(void)
{
  while(counter != 1)
  {
    counter++;
    stunde = 13;
    minute = 50;
    sekunde = 12; 
    
    Zeit[0] = stunde / 10;
    Zeit[1] = stunde % 10;
    Zeit[2] = minute / 10;
    Zeit[3] = minute % 10;
    Zeit[4] = sekunde / 10;
    Zeit[5] = sekunde % 10;
    printf("%d%d:%d%d:%d%d\n", Zeit[0], Zeit[1], Zeit[2], Zeit[3], Zeit[4], Zeit[5]);
    
    for(int ix = 0; ix!=6; ix++) {
        dezimalzahl = Zeit[ix];
      for (int k=0; k<6; k++) {
        binZeit[ix][k] = dezimalzahl & 1;
        dezimalzahl>>=1;
      }
      
    }
    printf("%d%d%d%d\n", binZeit[0][0],binZeit[0][1],binZeit[0][2],binZeit[0][3]);
    printf("%d%d%d%d\n", binZeit[1][0],binZeit[1][1],binZeit[1][2],binZeit[1][3]);
    printf("%d%d%d%d\n", binZeit[2][0],binZeit[2][1],binZeit[2][2],binZeit[2][3]);
    printf("%d%d%d%d\n", binZeit[3][0],binZeit[3][1],binZeit[3][2],binZeit[3][3]);
    printf("%d%d%d%d\n", binZeit[4][0],binZeit[4][1],binZeit[4][2],binZeit[4][3]);
    printf("%d%d%d%d\n", binZeit[5][0],binZeit[5][1],binZeit[5][2],binZeit[5][3]);
    
    
    for (int o=0; o!=6; o++) {
      int q = 3;
      for (int i=3; i!=1; i--) {
        
        if (ledMatrix[i][o] !=9) { 
          ledMatrix[i][o] = binZeit[o][q];
          printf("ledMatrix[%d][%d] ist %d\n",o,i, ledMatrix[o][i]);
        } else if(ledMatrix[i][o] ==9) {
          printf("ledMatrix[%d][%d] ist %d -> ueberspringe\n", o,i,ledMatrix[o][i]);
        }

        if(q == 3){q=0;}else{q++;}
      }
    }

  
    for (int wa = 0; wa != 4; wa++)
    {
      for (int ui = 0; ui != 6; ui++) { 
        
        printf("%d\t", ledMatrix[wa][ui]);
        
      }
      printf("\n\n");
    } 
  }  
}

LED? Angeschlossen? Öhm, nunja.. dachte ich probier erstmal ein bisschen 
mit der Grundstruktur und mach mir dann Gedanken über die Ansteuerung. 
Wie gesagt soll sie über Multiplexing laufen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Von Bitfeldern hab ich noch nie etwas gehört. :D

Die brauchst du hier auch nicht.

Aber mit einem uint8_t hast du automatisch 8 Bit bekommen, die entweder 
0 oder 1 sind.

Wenn du an einen µC Port 8 Led anschliest und einen uint8_t hast

  uint8_t  wert;

und diesen wert auf 0 setzt und auf den Port ausgibst, an dem die LED 
sind


  wert = 0;
  PORTB = wert;

dann leuchtet gar keine LED (oder alle, je nachdem wie rum die LED 
angeschlossen sind)

   7   6   5   4   3   2   1   0
 +---+---+---+---+---+---+---+---+
 |   |   |   |   |   |   |   |   |
 +---+---+---+---+---+---+---+---+

gibst du 1 aus

   wert = 1;
   PORTB = wert;

dann leuchtet 1 LED

   7   6   5   4   3   2   1   0
 +---+---+---+---+---+---+---+---+
 |   |   |   |   |   |   |   | * |
 +---+---+---+---+---+---+---+---+

gibst du 2 aus

  wert = 2;
  PORTB = wert;

dann leuchtet die nächste LED

   7   6   5   4   3   2   1   0
 +---+---+---+---+---+---+---+---+
 |   |   |   |   |   |   | * |   |
 +---+---+---+---+---+---+---+---+

bei einer 3, leuchten dann alle beide

   7   6   5   4   3   2   1   0
 +---+---+---+---+---+---+---+---+
 |   |   |   |   |   |   | * | * |
 +---+---+---+---+---+---+---+---+

und so weiter und so weiter. Dies deshalb, weil die Binärdarstellungen 
der Zahlen (also so wie sie im µC tatsächlich gespeichert sind) so 
aussehen:

   0        00000000
   1        00000001
   2        00000010
   3        00000011
   4        00000100
   5        00000101
   6        00000110
   7        00000111
   8        00001000
   9        00001001
   etc. etc.

schliesst du an jedes der 8 Bit eines Ports direkt eine LED an, dann 
zeigt dir jede LED von sich aus an, ob an einer bestimmten Bitposition 
ein 0-Bit oder ein 1-Bit vorliegt.

Das heisst aber auch: Du brauchst eine Zahl gar nicht selber in Bits 
aufdröseln. Du gibst die Zahl einfach an den Port aus und die LED zeigen 
von selbst die Binäre Darstellung dieser Zahl an. Dies deshalb, weil die 
Zahl intern sowieso als Bitmuster vorliegt.

> Meinst du, dass es mit den Arrays nicht klappen wird?

Schon. Aber du brauchst kein 2D Array

> LED? Angeschlossen? Öhm, nunja.. dachte ich probier erstmal ein bisschen
> mit der Grundstruktur und mach mir dann Gedanken über die ansteuerung.

Wie wärs, wenn du erst mal einfach nur 8 LED an einem Port anschliesst 
und dann damit ein bischen experimentierst?
Zb wie muss eine Zahl aussehen (welches Bitmuster muss sie haben) damit 
LED x, LED y und LED z leuchten. Was machen die LED wenn man 
nacheinander einfach alle Zahlen von 0 bis 255 auf den Port ausgibt. Was 
muss ich tun, wenn ich ein Lauflicht haben will. etc. etc.

Du wirst dabei viel über Zahlensysteme lernen und wie wir eigentlich 
rechnen. Du wirst auch lernen, was es mit dem Binärsystem auf sich hat, 
und dass Dezimal-, Hex- und Binär einfach nur verschiedene Schreibweisen 
desselben Sachverhalts sind und das dir die LED den Sachverhalt 
anzeigen, unabhängig davon ob du jetzt Dezimal-, Hex- oder 
Binärschreibweise bevorzugst.

Von der Übung in Programmieren mal ganz abgesehen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Meinst du, dass es mit den Arrays nicht klappen wird?
int Zeit[6]              = 6*4  = 24 Byte
int binZeit[4][4]        = 16*4 = 64 Byte
int ledMatrix[4][6]      = 24*4 = 96 Byte
Das würde vom Speicherplatz her schon noch gehen, aber ich sehe arge 
Zeitprobleme (auf dem uC) wegen der Pointermanipulationen auf dich 
zukommen. Verwende doch besser gleich die Datentypen, die der uC am 
besten kann. Im Falle AVR sind das char (aka. uint8_t).

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst doch eine Zahl zwischen 60 bzw. 24 binär als LEDs ausgeben.
Warum verteilst Du diese binäre Zahl auf verschiedene Variablen.
Wenn Du in einem Byte (ich  glaube der C-Datentyp auf dem AVR ist 
"uint_8t") zum Beispiel 55 für 55 Sekunden stehan hast ist das binär 
00110111.
Wenn Du jetzt an einem PortX deine 6 LEDs anschliesst und den Wert aus 
deiner Variablen in das Port Ausgaberegister schreibst, dann sind genau 
die Portausgänge logisch high, die du brauchst. Also nur die LEDs an die 
6 niederwertigen Portbits anschliessen und Du hast automatisch deine 
Sekunden LEDs.
Du brauchst also nichts weiter als 3 Bytes für Stunden, Minuten und 
Sekunden, und entweder 3Ports für die LEDs oder 1 Port und weitere 3 
Bits um die Gruppen für St. Min. und Sek. zu multiplexen.

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für diese ausführliche Erlärung.
Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber 
doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander 
ansteuern muss. (hh:mm:ss)
Hätte ich 6 Ports, würde es ja aufgehen :D
Ich benötige also diese Aufteilung um die Ansteuerung zu erledigen.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder zu langsam :-(

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber
> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander
> ansteuern muss. (hh:mm:ss)
> Hätte

Nein, Du hast 3 Reihen, nämlich Stunden, Minuten und Sekunden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Vielen Dank für diese ausführliche Erlärung.
> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber
> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander
> ansteuern muss. (hh:mm:ss)

Warum?

> Hätte ich 6 Ports, würde es ja aufgehen :D

Du multiplext doch?

> Ich benötige also diese Aufteilung um die Ansteuerung zu erledigen.

Brauchst du nicht.
Ob du deine 4 zusammengehörenden LED optisch in Form einer Zeile oder 
optisch in Form einer Spalte anordnest, ist doch eine reine Frage 
dessen, wie du die LED in das Brett mit den Löchern setzt und diese LED 
verkabelst.

Genau darum hab ich gefragt, wie deine LED angeschlossen sind.

An einem Port hast du alle 4 LED einer Stelle (ob du die dann als 
nebeneinaderliegende LED in Form einer Zeile oder als 
übereinanderliegende LED in Form einer Spalte präsentierst ist eine 
reine Frage der Verkabelung)

Weist du also dem Port die Zahl 9 zu, dann brennen dort die LED

     X  O  O  X

und an einem anderen Port wählst du aus, welche der 6 Zeilen dieses 
Muster anzeigen muss. Aber auf jeden Fall brauchst du nur einen uint8_t 
um diese 9 zu speichern. Für alle 6 Stellen also 6 Stück uint8_t
(Und die kann man natürlich in einem Array realisieren)

Du machst dir hier viel zu viel Arbeit, indem du versuchst die Bits zu 
"drehen" um Zeilen mit Spalten zu vertauschen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.R. Schmitt schrieb:
> Luke Skywalker schrieb:
>> Anfangs habe ich einfach PORTB = z.B. 13 geschrieben. Problem ist aber
>> doch, dass ich 6 "Spalten" hab, die ich unabhängig von einander
>> ansteuern muss. (hh:mm:ss)
>> Hätte
>
> Nein, Du hast 3 Reihen, nämlich Stunden, Minuten und Sekunden.

Er will Zehner und Einer trennen.
Dagegen ist auch nichts zu sagen.

Daher 6 Zeilen

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Problem ist aber doch, dass ich 6 "Spalten" hab, die ich unabhängig
> von einander ansteuern muss. (hh:mm:ss)
Zeichne doch mal einen Schaltplan (oder eine Skizze), wie du das 
realisieren willst. Erst mit einem vernünftigen Hardwarekonzept kann ein 
sinnvolles Softwarekonzept erstellt werden...

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht und bin 
kein Hobbyelektroniker. Wie genau das multiplexen geht weiß ich auch 
nicht, ich hab einfach mit der der Software eingefangen bis zu diesem 
Punkt der Ansteuerung, jetzt mach ich mir erst Gedanken darüber. Bisher 
hab ich ja nur erstmal die Grundlagen gesetzt..Uhr geschriben mit 
Timerinterrupt, Umwandlung in Binärzahlen(was ja nun anscheinend nicht 
mehr nötig ist).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:

> Punkt der Ansteuerung, jetzt mach ich mir erst Gedanken darüber. Bisher
> hab ich ja nur erstmal die Grundlagen gesetzt..Uhr geschriben mit
> Timerinterrupt, Umwandlung in Binärzahlen(was ja nun anscheinend nicht
> mehr nötig ist).

Mit scheint, du hast ein paar nicht ganz unwesentliche 
Grundlagenprogramme komplett ausgelassen. Und das rächt sich jetzt.

Daher auch weiter oben der Vorschlag, das jetzt alles nachzuholen und 
einfach mal 8 LED an einen Port anzuschliessen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht
Aber du willst einen uC programmieren, der das später auf LEDs anzeigt?

> Bisher hab ich ja nur erstmal die Grundlagen gesetzt..
Deine Vorgehensweise ist bestenfalls suboptimal zu nennen...

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten. 
Hätte ich angenommen 6 Ports würde ich es auch so hinbekommen. Das 
Problem ist aber doch, dass ich eine Methode brauch über wenig Ports 
viele LED zu schalten. Das ist einfach eine andere Dimension im 
Vergleich dazu jeder LED einen Pin auf einem Port zu reservieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.

offenbar aber nicht, nach dem was du weiter oben gezeigt hast.

> Hätte ich angenommen 6 Ports würde ich es auch so hinbekommen.

Vergiss das einfach mal.
Nimm an du hättest die 6 Ports.

Du hast 6 Variablen, die jede für sich einen 'virtuellen Port' 
realisieren.
utin8_t Digits[6];
da sind sie.

Wie du dann diese 6 'virtuellen Ports' an die tatsächlichen Ports 
bekommst (per Multiplex) ist ein anderes Thema.

> viele LED zu schalten. Das ist einfach eine andere Dimension im
> Vergleich dazu jeder LED einen Pin auf einem Port zu reservieren.

Du denkst zu kompliziert.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Das Problem ist aber doch, dass ich eine Methode brauch über wenig Ports
>> viele LED zu schalten.
Ist hier im Thread das Thema "Multiplexen" eigentlich schon mal 
angesprochen worden?

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Luke Skywalker schrieb:
>> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.
>
> offenbar aber nicht, nach dem was du weiter oben gezeigt hast.

Sachen wie PORTD = (0 << PD7) usw. bekomm ich grade noch so hin.

Das Multiplexen kam von mir, da ich weiß, dass man das Problem damit 
lösen kann. Ich denke ich muss in wenig in der Elektronik nachholen und 
klären wie Multplexing funktioniert.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Ich denke ich muss in wenig in der Elektronik nachholen
Einsicht ist der erste Schritt zum Erfolg... ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Karl heinz Buchegger schrieb:
>> Luke Skywalker schrieb:
>>> 8 LED anzuschließen werd ich ja hinbekommen und sie gezielt zu schalten.
>>
>> offenbar aber nicht, nach dem was du weiter oben gezeigt hast.
>
> Sachen wie PORTD = (0 << PD7) usw. bekomm ich grade noch so hin.

:-)
Das von dir angegebene Statement verändert den Port D nicht.
Passt wie die Faust aufs Auge, dass dir einiges an Grundlagenwissen 
fehlt.

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre trotzdem jemand so nett und könnte mir das multiplexing speziell 
auf dieses Problem erklären? Was brauch ich dafür an Grundkenntnissen in 
der Elektronik?

@Karl heinz Buchegger:
fail! Auf jedenfall kann ich aber Pins schalten, glaub mir. Hier mal 
mein bisher bestes Projekt 
Youtube-Video "atmega16 auf Evaluations-Board" :D

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Wäre trotzdem jemand so nett...
Wärst du mal so nett, wenigstens zu versuchen dich mal ein wenig selber 
zu infomieren?  :-/
Du bist schliesslich nicht der erste, der sowas macht.

Such doch mal hier im Forum nach "LED-Matrix" und "multiplexen"
Oder sieh dir wenigstens den Artikel zum Thema an:
http://www.mikrocontroller.net/articles/LED-Matrix

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Wäre trotzdem jemand so nett und könnte mir das multiplexing speziell
> auf dieses Problem erklären? Was brauch ich dafür an Grundkenntnissen in
> der Elektronik?

guckst du hier
http://www.mikrocontroller.net/articles/AVR-Tutori...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:

> fail! Auf jedenfall kann ich aber Pins schalten, glaub mir. Hier mal
> mein bisher bestes Projekt
> Youtube-Video "atmega16 auf Evaluations-Board" :D

OK.
Das beruhigt mich wieder ein bischen.

Autor: Luke Skywalker (no3x)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Luke Skywalker schrieb:
>
>> fail! Auf jedenfall kann ich aber Pins schalten, glaub mir. Hier mal
>> mein bisher bestes Projekt
>> Youtube-Video "atmega16 auf Evaluations-Board" :D
>
> OK.
> Das beruhigt mich wieder ein bischen.

Puh, dachte schon ich bin unten durch :D

Ich denke ich habs nun so weit verstanden mit dem multiplexen. Werde nun 
erstmal ein bisschen schauen wie es mit der Stromversorgung für so viele 
LED aussieht und was ich für Widerstände brauch...Hab bisher immer LED + 
Batterie gemacht und dann haben meine Elektrokentnisse aufgehört. (Also 
im Klartext, immer i.wie hingefriemelt)
Melde mich dann wieder mit Problemen. Vielen Dank.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luke Skywalker schrieb:
> Ich kann keien Schaltpläne zeichenen, hab das noch nie gemacht und bin
> kein Hobbyelektroniker.

Dann solltest Du damit anfangen. wenn Du Schaltpläne verstehst, kannst 
Du auch welche zeichnen. Wund wenn Du keine verstehst, kannst Du auch 
keine eigene µC Schaltung entwerfen und bauen.

Karl heinz Buchegger schrieb:
> Er will Zehner und Einer trennen.
> Dagegen ist auch nichts zu sagen.
>
> Daher 6 Zeilen
Ok, sorry hatte ich nicht gesehen, kann man machen ist aber 
ungewöhnlich.

@Luke:
Dann versuche doch erst mal einfach 4 oder 6 LEDs an einen Port 
anzuschliessen und dann mal nur die Stunden oder Minuten oder Sekunden 
auszugeben. Wenn das funktioniert, dann kommt der nächste Schritt, 
nämlich die Aufteilung in Zehner und Einer.
Wenn das funktioniert kommt das Multiplexing. Aber dazu musst Du etwas 
Ahnung von Schaltungstechnik und Elektronik haben, ausser du erwartet 
vom Forum eine fertige Lösung die man einfach ohne Kenntnisgewinn 
nachbauen kann. Möglichst noch mit fertigem Programm.

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.