Forum: Mikrocontroller und Digitale Elektronik LED-Matrix mit Atmega8 (16Mhz) Wieivele Schieberegiste in Reihe?


von Thomas J. (rrurr)


Lesenswert?

Hallo an alle,

ich beabsichtige eine LED-Matrix mit 16 x 8 (128) LEDs aufzubauen. Als 
µC möchte ich einen Atmega8 verwenden, an den ich einen 16 Mhz 
Quarzoszillator anschließe. Für das Ansprechen der LEDs wollte ich 16 
Schieberegister verwenden (pro Zeile ein Register).

Nun wollte ich mal fragen, wieviele Schieberegister ich in Reihe 
schalten, kann, ohne dass ich am Ende Probleme bekomme, weil es zu lange 
dauert, bis die Bits durchgeschoben wurden. (Also eine Laufschrift o.ä. 
sollte flüssig ablaufen, das wäre super.)
Bei 16 Mhz denke ich mir, könnte ich theoretisch alle 16 Register 
hintereinander schalten, habe aber noch keine praktischen Erfahrungen 
sammeln können und bevor ich das zusammenlöte, wollte ich mal hier 
nachfragen:

Hat jemand schon Erfahrungen mit dem in-Reihe-schalten von 
Schieberegistern an einen 16 Mhz µC?

Freue mich auf Antworten.

Gruß

von Eumel (Gast)


Lesenswert?

1. Der Controller packt das locker, keine Angst. Das SPI Modul läuft mit 
maximal halbem Controller Takt, also bei dir 8 MHz. Mit 8Mhz hast du die 
128 bit in 16 µs rausgeschoben.

2. Normalerweise macht man sowas mit multiplexen, das reduziert den 
Verkabelungsaufwand deutlich, es geht aber auch so wie du es vor hast.

von Thomas J. (rrurr)


Lesenswert?

1. Super, das freut mich :)

2. Ja, das Thema habe ich mal angekratzt .Werde mich in Zukunft damit 
mal richtig auseinander setzen, vorerst bin ich glücklich, wenn die 
Matrix läuft ;-)

Gruß

von Thomas J. (rrurr)


Lesenswert?

Eine Frage hätte ich doch noch:

Sollte ich die Ansteuerung per SPI-Modul realiseren oder kann ich das 
auch (ist aus meiner Sicht einfacher) via Software machen?

Gruß

von Eumel (Gast)


Lesenswert?

Thomas J. schrieb:
> Eine Frage hätte ich doch noch:
>
> Sollte ich die Ansteuerung per SPI-Modul realiseren oder kann ich das
> auch (ist aus meiner Sicht einfacher) via Software machen?
>
> Gruß

Via Software wird das um einiges langsamer (für deine Zwecke aber noch 
schnell genug). Ich finde, dass das SPI Modul vom Atmega8 kinderleicht 
zu bedienen ist, was stört dich denn daran? Wenn du dabei Hilfe 
brauchst, kein Problem.
In welcher Sprache programmierst du?

von egs_ti (Gast)


Lesenswert?

man muss nur mal den inneren Schweinehund überwinden
 und ins Datenblatt schauen.

von Thomas J. (rrurr)


Angehängte Dateien:

Lesenswert?

Eumel schrieb:
> Via Software wird das um einiges langsamer (für deine Zwecke aber noch
> schnell genug). Ich finde, dass das SPI Modul vom Atmega8 kinderleicht
> zu bedienen ist, was stört dich denn daran? Wenn du dabei Hilfe
> brauchst, kein Problem.
> In welcher Sprache programmierst du?

Habe nun mal eine Schaltung erstellt, nach dem Vorgaben aus den 
Schieberegister-Artikel 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister) 
bzw. so wie ich diese verstanden habe. Der Schaltplan befindet sich im 
Anhng (spi.png).
(Auf die Beschaltung des µC habe ich gerade mal verzichtet...)

Wollte das ganze in C programmieren.

Gruß

von amateur (Gast)


Lesenswert?

@Thomas
128 LEDs sind in der Größenordnung, in der man auch das Netzteil 
konsultieren sollte.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Sieht gut so aus.
Bedenke, das SS im SPI Master Mode auch nurn normaler Ausgang ist und 
nicht vorm Modul gesteuert wird.

128bit sind kein Problem, habe hier für mein 4x16 Zeichen Display aus 
16Seg Anzeigen genau 17 SRegs hintereinander geschalten und das ist 
schnell genug.

von Thomas J. (rrurr)


Lesenswert?

amateur schrieb:
> @Thomas
> 128 LEDs sind in der Größenordnung, in der man auch das Netzteil
> konsultieren sollte.

Verwende Low-Current LEDs, denke nicht, dass ich bei einem 5 Volt und 
700mAh Probleme bekomme.


Martin Wende schrieb:
> Sieht gut so aus.
> Bedenke, das SS im SPI Master Mode auch nurn normaler Ausgang ist und
> nicht vorm Modul gesteuert wird.

Was genau möchtest du mir hiermit sagen? Dass ich das bei der 
Programmierung berücksichtigen mus?

Gruß

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

/SS muss vor dem Einschalten des Master-SPI-Mode auf AUSGANG geschaltet 
werden. Andernfalls tritt sich das SPI selbst auf den Fuß, wenn sich der 
Pegel an /SS auf Low ändert. Wenn Du den /SS-Pin für die Register mit 
verwenden möchtest, so muss dieser in Software getoggelt werden, wenn es 
erforderlich ist.

von Eumel (Gast)


Lesenswert?

Thomas J. schrieb:
> Verwende Low-Current LEDs, denke nicht, dass ich bei einem 5 Volt und
> 700mAh Probleme bekomme.

Nicht denken sondern RECHNEN!

von Peter D. (peda)


Lesenswert?

Thomas J. schrieb:
> Der Schaltplan befindet sich im
> Anhng (spi.png).

Den Anschluß G würde ich auf eine PWM legen, dann kann man die LEDs 
dimmen.
Und einen Pullup dran, damit die LEDs nicht flackern, wenn der MC noch 
im Reset ist.

von Thomas J. (rrurr)


Lesenswert?

Eumel schrieb:
> Thomas J. schrieb:
>> Verwende Low-Current LEDs, denke nicht, dass ich bei einem 5 Volt und
>> 700mAh Probleme bekomme.
>
> Nicht denken sondern RECHNEN!

Eine LED verbraucht maximal 2 mA bei 128 LEDs ergibt sich ein maximaler
Strom von 256 mA, nur für die LEDs. Bleiben also noch 444 mA für
Microcontroller und Quarz bzw. die Operationen ansich in den Registern.



Peter Dannegger schrieb:
> Thomas J. schrieb:
>> Der Schaltplan befindet sich im
>> Anhng (spi.png).
>
> Den Anschluß G würde ich auf eine PWM legen, dann kann man die LEDs
> dimmen.
> Und einen Pullup dran, damit die LEDs nicht flackern, wenn der MC noch
> im Reset ist.

Den Pullup ist mittlerweile dran, aber danke für den Hinweis. Das mit 
PWM ist 'ne gute Idee, danke!

von Electronics'nStuff (Gast)


Lesenswert?

Hi

Bin auch ein bisschen vorsichtig an die SPI Sache rangegangen, aber das 
ist wirklich kinderleicht!

Beschaltung hast du ja schon (oben).. du brauchst nur das hier:

1
/**************** INCLUDES ***************************************/
2
#include <avr/io.h>          //I/O library
3
/****************************************************************/
4
5
/**************** DEFINES ***************************************/
6
#define F_CPU 20000000  //Frequenz -> 20MHZ
7
/****************************************************************/
8
#define MOSI  PB5 //Pinbelegung von einem ATMEGA644
9
#define SCK   PB7
10
#define SPI   DDRB
11
#define SS    PB4
12
13
14
void main()
15
{
16
17
 SPI_MasterInit();
18
19
 while (1)
20
 {
21
22
   SPI_MasterTransmit(12);
23
24
 }
25
26
}
27
 
28
29
void SPI_MasterInit(void)
30
{
31
   SPI = (1<<MOSI)|(1<<SCK) | (1<<SS);  //MOSI, SCK, SS Output
32
   SPCR = (1<<SPE)|(1<<MSTR); //Master Enable
33
   SPSR = (1<<SPI2X);         //Geschwindigkeit = FOSC/2
34
}
35
void SPI_MasterTransmit(char cData)
36
{
37
   SPDR = cData;
38
   while(!(SPSR & (1<<SPIF))); // Auf Abschluss der Ausgabe warten
39
   SSToggle(); //SS-Pin Toggeln
40
}

von Electronics'nStuff (Gast)


Lesenswert?

Und wenn du eh gerade an der Planung bist.. nimm einen ATMEGA644 der 
schafft auch 20MHZ und braucht so nur 800ns für 8 Bit!

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.