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
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.
>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.
@ 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
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 :)
@ 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
>@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 ;)
@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
>@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.
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
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
Stimmt, Dank dir! Ich werds gsofort nochmal mit der richtigen Registeradresse für Digit 1 versuchen. MFG Chh
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.