Forum: Mikrocontroller und Digitale Elektronik LPC 938 + SPI + Max 7219


von C. H. (chh2807)


Lesenswert?

Huhu,

ich möchte mit meinem MCB900 Board von Keil mit einem LPC938 Controller 
einen Max7219 Baustein ansteuern. Mein Mustercode für die Benutzung des 
SPI Interfaces sieht wie folgt aus:

>> #include <REG932.H>
>> sBit _SS = P2^4;

>> main()
>> {
>>   P2M1 = 0x3C; // Freigabe der SPI-Ports (MISO, MOSI, SPICLK, _SS)
>>   P2M2 = 0x3C;
>>   P2 = 0xFF;
>>   SPCTL = 0xD4; // Freigabe des SPI-Blocks, MSTR = 1, SSIG = 1)

>>   while(1)
>>   {
>>      _SS = 0; // SPI Slave-Signal aktivieren
>>      SPDAT = 0x45; // Wert schreiben
>>        while((SPSTAT & 0x80) == 0x00); // Warten bis Wert gesendet
>>      SPSTAT = 0xFF; // SPIF zuruecksetzen
>>      _SS = 1; // SPI Slave-Signal deaktivieren
>>   }
>> }

So weit so gut, wie SPI funktioniert hab ich denke ich kapiert. Was mir 
aber Kopfzerbrechen bereitet ist das der Max7219 ein 16 Bit Register hat 
und mein LPC938 nur ein 8 Bit Register für SPI. Kann ich nun einfach 2 
Werte an den Max7219 übertragen und der füllt dieses Register 
automatisch auf oder wird bei jeder übertragung das Register gelöscht 
und neu beschrieben?  Wie müßte ich das realisieren?


Vielen Dank für eure Hilfe.

MFG
Chh

von Klaus das Biest (Gast)


Lesenswert?

Richtig, Du musst nur den ChipSelect / SlaveSelect während der 
Übertragung unten lassen.

Also folgende Reihenfolge nutzen:
1
CS/SS auf low
2
  erste  8 Bit übertragen
3
  zweite 8 Bit übertragen
4
CS/SS auf high

In deinem Codebeispiel musst Du dann wahrscheinlich* nur die Befehle 
zwischen _SS=0; und _SS=1; doppelt ausführen und den gesendeten Wert 
anpassen!

Gruß, Klaus


*Ich habe jetzt nicht ins Datenblatt geschaut, ob Du die richtigen 
SPI-Einstellungen nutzt, da könnte eine Anpassung notwendig sein.

von holger (Gast)


Lesenswert?

>Kann ich nun einfach 2
>Werte an den Max7219 übertragen und der füllt dieses Register

Wie willst du wohl sonst 16Bit übertragen? Schon mal ausprobiert
oder nur hier weil es nicht geht?

> Mein Mustercode für die Benutzung des
>SPI Interfaces sieht wie folgt aus:

>> #include <REG932.H>
>> sBit _SS = P2^4;

Glaub ich nicht. C mag keine >> am Zeilenanfang.

von C. H. (chh2807)


Lesenswert?

@ Klaus das Biest

Vielen Dank, auf eine Antwort in genau der Form hab ich gehofft.  Ich 
werd das sofort ausprobieren.

thumbs up

______________________________
@holger

Es gibt keine dumme Fragen, nur dumme antworten. Deine Antwort ist eine 
die diese Welt bestimmt nicht braucht.

1. ist es für einen Anfänger sicherlich nicht logisch wenn man die 
Arbeitsweise des Max7219 nicht kennt.

2. Wenn man schon einen auf Überschlau machen möchte, dann sollte auch 
ein wenig Substanz dabei sein.

> Glaub ich nicht. C mag keine >> am Zeilenanfang.

Schon klar, aber wie sollte man sonst den Code vom anderen Text 
vernünftig abheben als mit den >>, die in diesem Forum eine Farbänderung 
bewirken? Klingt logisch ne? Siehste, haste auch wieder was gelernt.


MFG
chh

von Klaus das Biest (Gast)


Lesenswert?

C. Huben schrieb:
> Schon klar, aber wie sollte man sonst den Code vom anderen Text
> vernünftig abheben als mit den >>, die in diesem Forum eine Farbänderung
> bewirken? Klingt logisch ne? Siehste, haste auch wieder was gelernt.

Wirklich nicht böse gemeint, nur dass Du es für demnächst weisst:
Formatierung im Forum :)

von C. H. (chh2807)


Lesenswert?

@ Klaus

Thx, den Link hatte ich gerade nicht bei der Hand. Ich wußte nur noch 
das man mit den Pfeilen die Farbe ändert und genau so war es auch 
gewollt.

Vor allem, wenn ich keine Ahnung von µC und C hätte, würde ich wohl kaum 
nach SPI Fragen sondern hätte ganz andere Probleme. Ich hab halt nur 
beim Max7219 irgendwie den Wald vor lauter Bäumen nicht gesehen.

MFG
Chh

von holger (Gast)


Lesenswert?

>@holger

>Es gibt keine dumme Fragen, nur dumme antworten. Deine Antwort ist eine
>die diese Welt bestimmt nicht braucht.

>1. ist es für einen Anfänger sicherlich nicht logisch wenn man die
>Arbeitsweise des Max7219 nicht kennt.

>2. Wenn man schon einen auf Überschlau machen möchte, dann sollte auch
>ein wenig Substanz dabei sein.

Ja und? War doch dabei:

>>Kann ich nun einfach 2
>>Werte an den Max7219 übertragen und der füllt dieses Register

>Wie willst du wohl sonst 16Bit übertragen?

Das Timing Diagramm im Datenblatt hast du scheinbar völlig
übersehen. Bilder sagen mehr als tausend Worte;)
Interpretieren kann man da auch nicht viel. Reihenfolge der
Bits ist klar, wo CS gesetzt/zurückgesetzt wird ist klar.
Wo war noch dein Problem? Achja ich weiss schon ;)

von C. H. (chh2807)


Lesenswert?

@Holger

Is klar, ich glaube wir haben erkannt das du nie Anfänger in irgendeiner 
Disziplin warst und als Profi in allem Geboren wurdest und immer sofort 
alles wußtest. Wieso gibts es eigentlich Lehrer die man fragen kann? 
Steht doch eh schon alles in irgendwelchen Büchern^^

Anstatt so dermaßen überheblich hier einen Anfäger in deiner süffisanten 
Art runter zu machen solltest du dir ein Beispiel an Klaus nehmen der 
einfach nur ganz sachlich die Frage beantwortet hat.
Naja, wenn man im Leben nichts zu melden hat muss man wohl im Inet Leute 
diskreditieren.


@Klaus

Dank dir noch mal, hast mir wirklich sehr geholfen. Aber ich bin nu 
wieder hier raus. Mit so Typen wie dem holger muss ich mich nicht 
abgeben.

MFG
Chh

von holger (Gast)


Lesenswert?

>@Holger

>Is klar, ich glaube wir haben erkannt das du nie Anfänger in irgendeiner
>Disziplin warst und als Profi in allem Geboren wurdest und immer sofort
>alles wußtest.

Bla, bla. Als ich mit Elektronik angefangen habe gabs noch kein Inet.
Wie hab ich das bloß damals gemacht? Datenblätter gabs nur in
Buchform. Wochenlang warten bis das Ding mal da war, falls überhaupt mal
was kam. Fragen konnte man keinen.

> Wieso gibts es eigentlich Lehrer die man fragen kann?

Die muss man nicht fragen wenn man selbst ein bißchen Energie
und Zeit investiert. Selbstständiges denken ist natürlich eine
Eigenschaft die man dazu benötigt.

>Steht doch eh schon alles in irgendwelchen Büchern^^

Das nennt sich heute Datenblatt. Und wenn man nicht mal das versteht
hat man den falschen Job.

von C. H. (chh2807)


Lesenswert?

Hallo,

ich hab jetzt ein Programm zur Ansteuerung des Max7219 geschrieben und 
möchte zum testen lediglich an Digit 1 / Segment 1(F) eine LED leuchten 
lassen. Sobald ich das Programm auf den Controller übertragen habe 
werden am MAX7219 aber alle Pins auf "ein" geschaltet. Woran kann das 
liegen? Hab ich noch was vergessen oder was falsch gemacht im Programm? 
Hier mein Code:
1
#include <REG938.h>
2
#include <stdio.h>
3
static void MAX7219_Write (unsigned char, unsigned char);
4
void MAX7219_Clear (void);
5
6
//-------------------------------Konstanten---------------------------------------
7
8
sbit _SS = P2^4; 
9
sbit CCLK = P2^5;
10
11
#define REG_DECODE        0x09                        // "decode mode" Register
12
#define REG_INTENSITY     0x0a                        // "intensity" Register
13
#define REG_SCAN_LIMIT    0x0b                        // "scan limit" Register
14
#define REG_SHUTDOWN      0x0c                        // "shutdown" Register
15
#define REG_DISPLAY_TEST  0x0f                        // "display test" Register
16
17
#define INTENSITY_MIN     0x00                        // minimum display intensity
18
#define INTENSITY_MAX     0x0f                        // maximum display intensity
19
20
21
//-----------------------------Hauptprogramm---------------------------------------
22
 
23
main() 
24
{ 
25
   P2M1 = 0x3C;               // Freigabe der SPI-Ports (MISO, MOSI, SPICLK, _SS) 
26
   P2M2 = 0x3C; 
27
   P2   = 0xFF; 
28
   SPCTL = 0x54;               // Freigabe des SPI-Blocks, SSIG = 0, SPEN =1; MSTR = 1, CPHA = 1) 
29
 
30
31
   MAX7219_Clear ();            // alle Digits/ Segmente zurück setzen
32
   MAX7219_Write (REG_DECODE, 0x00);    // setzt Max7219 auf "No-Decode-Mode"
33
34
   while(1) 
35
   {                     
36
    
37
    MAX7219_Write (REG_DECODE, 0x01);    // Digit 1 am Max7219 wird addressiert
38
    MAX7219_Write (REG_DECODE, 0x01);    // Segment 1 von Digit 1 soll leuchten
39
40
   } 
41
}
42
43
//------------Hilfsprogramm zur Datenübertragung auf den Max 7219------------------
44
45
static void MAX7219_Write (unsigned char reg_number, unsigned char dataout)
46
{
47
  _SS = 0;                   // SPI Slave-Signal aktivieren
48
49
  CCLK = 0;                 // Stopp den SPI-Takt
50
  SPDAT = reg_number;                 // gibs an in welches Adressregister geschrieben werden soll
51
  CCLK = 1;                  // erzeugt positive Taktflanke um Übertragung zu starten
52
  while((SPSTAT & 0x80) == 0x00);       // Warten bis Wert gesendet 
53
  SPSTAT = 0xFF;               // SPI Flag, nachdem Slave  Datenampfang quittiert, zuruecksetzen 
54
  
55
  CCLK = 0;
56
  SPDAT = dataout;                    // schreibt 8 Daten-Bits zur Segmentanteuerung auf den Max7219
57
  CCLK = 1;
58
  while((SPSTAT & 0x80) == 0x00);       // Warten bis Wert gesendet 
59
  SPSTAT = 0xFF;               // SPI Flag, Slave quittiert Datenampfang, zuruecksetzen
60
  
61
  _SS = 1;                   // SPI Slave-Signal deaktivieren 
62
}
63
64
//---------Hilfsfunmktion um alle Digits / Segmente zurück zu setzen--------------
65
66
void MAX7219_Clear (void)
67
{
68
  char i;
69
  for (i=0; i < 8; i++)
70
    MAX7219_Write(i, 0x00);                      
71
}

Wäre nett wenn mir jemand bei der Fehlersuche helfen könnte. Danke

MFG
Chh

von Peter D. (peda)


Lesenswert?

C. Huben schrieb:
1
> MAX7219_Write (REG_DECODE, 0x01);    // Digit 1 am Max7219 wird addressiert
2
>     MAX7219_Write (REG_DECODE, 0x01);    // Segment 1 von Digit 1 soll leuchten

Dein Kommentar stimmt nicht.
Du stellst nur zweimal den Decode-Modus an.
1
MAX7219_Write ( 5, 6); // Segment 6 auf Digit 5 an


Peter

von C. H. (chh2807)


Lesenswert?

Stimmt, Dank dir!

Ich werds gsofort nochmal mit der richtigen Registeradresse für Digit 1 
versuchen.

MFG
Chh

von C. H. (chh2807)


Lesenswert?

Leider klappts immer noch nicht, Ich hab den Code zwar entsprechend 
geändert, auch mit der Zeile von Peter versucht, aber es werden immer 
noch alle Ausgänge des Max7219 eingeschaltet.

Woran könnte es denn noch liegen?

MFG
Chh

von kamilek (Gast)


Lesenswert?

Hallo,

C.Huben hast du das Problem gelöst?

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.