www.mikrocontroller.net

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


Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus das Biest (Gast)
Datum:

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

Also folgende Reihenfolge nutzen:
CS/SS auf low
  erste  8 Bit übertragen
  zweite 8 Bit übertragen
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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus das Biest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <REG938.h>
#include <stdio.h>
static void MAX7219_Write (unsigned char, unsigned char);
void MAX7219_Clear (void);

//-------------------------------Konstanten---------------------------------------

sbit _SS = P2^4; 
sbit CCLK = P2^5;

#define REG_DECODE        0x09                        // "decode mode" Register
#define REG_INTENSITY     0x0a                        // "intensity" Register
#define REG_SCAN_LIMIT    0x0b                        // "scan limit" Register
#define REG_SHUTDOWN      0x0c                        // "shutdown" Register
#define REG_DISPLAY_TEST  0x0f                        // "display test" Register

#define INTENSITY_MIN     0x00                        // minimum display intensity
#define INTENSITY_MAX     0x0f                        // maximum display intensity


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

   MAX7219_Clear ();            // alle Digits/ Segmente zurück setzen
   MAX7219_Write (REG_DECODE, 0x00);    // setzt Max7219 auf "No-Decode-Mode"

   while(1) 
   {                     
    
    MAX7219_Write (REG_DECODE, 0x01);    // Digit 1 am Max7219 wird addressiert
    MAX7219_Write (REG_DECODE, 0x01);    // Segment 1 von Digit 1 soll leuchten

   } 
}

//------------Hilfsprogramm zur Datenübertragung auf den Max 7219------------------

static void MAX7219_Write (unsigned char reg_number, unsigned char dataout)
{
  _SS = 0;                   // SPI Slave-Signal aktivieren

  CCLK = 0;                 // Stopp den SPI-Takt
  SPDAT = reg_number;                 // gibs an in welches Adressregister geschrieben werden soll
  CCLK = 1;                  // erzeugt positive Taktflanke um Übertragung zu starten
  while((SPSTAT & 0x80) == 0x00);       // Warten bis Wert gesendet 
  SPSTAT = 0xFF;               // SPI Flag, nachdem Slave  Datenampfang quittiert, zuruecksetzen 
  
  CCLK = 0;
  SPDAT = dataout;                    // schreibt 8 Daten-Bits zur Segmentanteuerung auf den Max7219
  CCLK = 1;
  while((SPSTAT & 0x80) == 0x00);       // Warten bis Wert gesendet 
  SPSTAT = 0xFF;               // SPI Flag, Slave quittiert Datenampfang, zuruecksetzen
  
  _SS = 1;                   // SPI Slave-Signal deaktivieren 
}

//---------Hilfsfunmktion um alle Digits / Segmente zurück zu setzen--------------

void MAX7219_Clear (void)
{
  char i;
  for (i=0; i < 8; i++)
    MAX7219_Write(i, 0x00);                      
}

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

MFG
Chh

Autor: Peter Dannegger (peda)
Datum:

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

Dein Kommentar stimmt nicht.
Du stellst nur zweimal den Decode-Modus an.

MAX7219_Write ( 5, 6); // Segment 6 auf Digit 5 an


Peter

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, Dank dir!

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

MFG
Chh

Autor: C. Huben (chh2807)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kamilek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

C.Huben hast du das Problem gelöst?

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.