Forum: Mikrocontroller und Digitale Elektronik Atmega8 Programmierung (LED Matrix)


von Andreas H. (raucher91)


Angehängte Dateien:

Lesenswert?

Hallo Forums Mitglieder,
Erstmal einen Schönen 1. advent euch allen.

Ich habe folgendes Problem
und zwar wollte ich mit meiner pingPong Platine einzelne LED's leuchten 
lassen z.B. Led 7 Led 15 und Led 35(siehe Schaltplan) leider weiß ich 
nicht wie ich das in C Programmieren muss da ich blutiger Anfänger bin 
in Microcontroller Programmieren und auch in C ( nur paar Grundkentnisse 
). Wie würde der Code aussehen damit ich die Angegeben Leds Leuchten 
lassen und die anderen aus sind ??

Außerdem wie müsste ich die Platine "umstricken" um eine Matrix mit 7 
Zeilen und 30 Spalten zu bauen ?? Normalerweiße bräuchte ich ja nur 2 
Schieberegister zusätzlich oder ?


Mit Freundlichem Gruß und bestem Dank für alle Hilfreichen Antworten.
Raucher91

von Roland .. (rowland)


Lesenswert?

Ebenfalls schönen Sonntag :-).

Du Taktest via SPI das Bitmuster in die Schieberegister. Dabei soll an 
jenen Stellen eine 0 stehen, die der gewünschten Spalten entsprechen, in 
denen eine LED leuchten soll. Danach gibst Du einen kurzen Impuls auf 
die STR-Leitung, womit das Bitmuster an die Schieberegisterausgängen 
geschaltet wird. Nun liegen die ausgewählten Spalten auf GND. Zuletzt 
musst Du nun eine Zeile auswählen, indem Du den zuständigen Portpin auf 
1 legst. Nun leuchten die LEDs an den Kreuzungspunkten.

Und das ganze widerholst Du nun zyklisch für alle Spalten.

von Andreas H. (raucher91)


Lesenswert?

Hey cool danke für die Erklärung. Könntest du mir evtl auch sagen wie 
der Code in C aussieht damit das so Funktioniert?

von mullwark (Gast)


Lesenswert?

Ein fertiges Programm für Deine Hardware wird Dir kaum jemand schreiben. 
Das musst Du schon selber erledigen. Wenn Du noch nicht weisst, wie das 
geht, dann musst Du es eben lernen. Das Netz ist voller LED-Matrizen 
nebst Code.

Grundsätzliches Vorgehen:
Timer/Counter löst regelmäßig Interrupt aus, in dem folgendes gemacht 
wird:
   - Spaltenmuster aus
   - Nächste Reihe an (falls letzte, erste anwählen)
   - nächstes Spaltenmuster ein

Spaltenmuster bedeutet, alle LEDs, die in der aktuellen Reihe an sein 
sollen, kriegen eine 0, die anderen eine 1.

Falls Dir Begriffe unklar sind, mal in die Tutorials schauen, da wird 
alles erklärt.

Schreib nicht alles auf einmal, mach kleine Schritte:
Erstmal eine beliebige LED einschalten, dann eine blinken lassen, dann 
zweite Reihe dazu nehmen,... usw.

Wenn Du irgendwo nicht weiterkommst, den eigenen Code hier zeigen und 
konkrete Fragen stellen.

Noch ein Hinweis: Bei LED-Matrizen werden die LEDs immer nur ganz kurze 
Zeit eingeschaltet, damit das für das menschliche Auge hell genug ist, 
werden sie oft mit einem Pulsstrom betrieben, der als Dauerstrom der LED 
schadet. Darauf achten, daß die LEDs immer nur kurz mit Strom versorgt 
werden. Das wird mit dem Timer/Counter und seiner richtigen 
Konfiguration gewährleistet.

Gruß und gutes Gelingen

Mullwark

von Dietrich L. (dietrichl)


Lesenswert?

mullwark schrieb:
> werden sie oft mit einem Pulsstrom betrieben, der als Dauerstrom der LED
> schadet. Darauf achten, daß die LEDs immer nur kurz mit Strom versorgt
> werden.

Bei Andreas Schaltung kann den LEDs nicht viel passieren, da er keine 
"richtigen" Treiber hat. Er kann höchstens den µC und die 4094 
schädigen.
Ob allerdings die Helligkeit bei dem in seiner Schaltung max. möglichen 
bzw. erlaubten Strom hell genug ist, muss er selber herausfinden.

Gruß Dietrich

von Andreas H. (raucher91)


Lesenswert?

Also ich verlange ja ned dass mir wer des alles fertig programmiert. Ich 
wäre nur froh wenn mir wer nen Code schreibt damit ich zzmindestens 
verstehe wie ich genau die led 15 z.b. Anspreche. Mehr bräuchte ich auch 
ned als Hilfe. Also wäre cool fals des jemand machen könnte.

von holger (Gast)


Lesenswert?

Guckst du hier:

http://www.elo-web.de/elo/mikrocontroller-und-programmierung/ping-pong

Wenn du da nichts zu C findest, dann wenigstens für Bascom.
Mach was draus.

von Wolfgang (Gast)


Lesenswert?

Andreas Hermann schrieb:
> Ich habe folgendes Problem

Im Schaltplan hast du auch noch ein Problem: An ARef soll lt. Datenblatt 
nur ein Kondensator. VCC hat da nichts zu suchen.

von Andreas H. (raucher91)


Lesenswert?

Heyy Also ich hab es etz hinbekommen dass ich Einzelne Zeilen Anschalten 
kann nun müsste ich nur noch wissen wie ich die Spalten schalten kann.

Hier mein Code bisher:
1
#include <avr/io.h>
2
#include <util/delay.h>  // Warteschleife /Library)
3
int main(void)
4
{
5
  DDRC =  0xff;
6
  DDRB = 0xff;
7
  DDRD = 0xff;
8
  
9
    while(1)
10
    {
11
        PORTC = (1<<PC1)|(1<<PC3); 
12
        PORTD = (1<<PD5) | (1<<PD7);
13
            _delay_ms(3000);
14
    PORTC = (0<<PC1) | (0<<PC3);
15
    PORTD = (0<<PD5) | (0<<PD7);
16
    _delay_ms(1000);
17
    }
18
return 0;}

Somit hab ich nun 4 Zeilen am Blinken nur wie funktioniert dass nun mit 
den Spalten Steuern ??? des kapier ich nicht ganz obwohl ich jetzt schon 
mehrfach im i-net gesucht habe wegen Schieberegister Steuern.

@Wolfgang:
kann ich leider keine Aussage dazu treffen da die Platine so fertig 
aufgebaut gekauft worden ist und dass eben der Schaltplan dazu ist.

@Dietrich L:
Die helligkeit der Leds ist so i.O.

ich hoffe es könnte mi jemand ein Code Beispiel geben wie ich jetzt z.b. 
spalte IC2-Q3 anschalte

von Roland .. (rowland)


Lesenswert?

Ja immerhin, ein Anfang ;-).

Nun, die Schieberegister mit Daten füllen ist auch nicht weiters 
schwierig. Da die Schieberegister 12 Bit haben, musst Du also 12 
Datenbits hineinschieben. Dazu ist es notwenigt, am Datenpin das Bit 
anzulegen und mit einem Impuls am Clock-Pin dem Schieberegister den Takt 
zum speichern dieses Bits zu geben. Diese Prozedere muss nun für alle 12 
Bit widerholt werden. Als C-Pseudocode würde das etwa so aussehen:
1
void GenClock(void)
2
{
3
  Wait();
4
  SetClkPin();
5
  Wait();
6
  ClrClkPin();
7
};
8
9
void GenStrobe(void)
10
{
11
  Wait();
12
  SetStrPin();
13
  Wait();
14
  ClrStrPin();
15
};
16
17
void ShiftBits(int Data)
18
{
19
  for(int i = 0; i < 12; i++)
20
  {
21
    if(Data & 0x01) SetDataPin();
22
    else ClrDataPin();
23
    
24
    GenClock();
25
    
26
    Data >>= 1;
27
  }
28
  
29
  GenStrobe();
30
}

von Karl H. (kbuchegg)


Lesenswert?

Andreas Hermann schrieb:

>     PORTC = (0<<PC1) | (0<<PC3);

Warum so kompliziert?

Schreib doch gleich ganz einfach

  PORTC = 0;

denn genau das ist es, was du hier machst.


Es hilft nichts. Wenn du weiter kommen willst, ist dein erster 
Anlaufpunkt das gezielte 1 bzw. 0 setzen einzelner Portpins des 
Prozessors. Das ist dein kleines einmaleins. Solange du das nicht 
beherrscht hat alles weitere keinen Sinn.

Und genau deshalb beginnen auch die Tutorien genau damit.
Du übernimmst dich zur Zeit, weil dir die Basisdinge fehlen. Genau 
deshalb machen dann auch die weiterführenden Kapitel für dich keinen 
Sinn mehr, wie zb Ansteuerung eines Schieberegisters.


Ich frag mich ja immer, wieso gerade Anfänger immer glauben eine 
LED-Matrix wäre ein Anfängerprojekt. Es ist keines!
Um eine LED-Matrix nach den Regeln der Kunst ansteuern zu können, muss 
man schon einiges können. Definitiv nichts für Anfänger.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Wo hast Du denn diese verrückte Schaltung her?
Mit dem 4094 hast Du absolut zielsicher den schwächsten IC ausgesucht.
Man kann sie mit dem 74HC4094 noch etwas pimpen, aber ein 12-fach 
Multiplex schafft der auch nur bei Neumond.

von Roland .. (rowland)


Lesenswert?


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.