LED-Matrix mit Atmega8 (16Mhz) Wieivele Schieberegiste in Reihe?

OP #3042493
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ß
Gast #3042494
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.
Gast #3042507
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?
OP #3042917
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ß
Angehängte Dateien:
(Firma: fritzler-avr.de) #3042944
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.
OP #3042986
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ß
OP #3043845
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!
Gast #3044212
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren