Forum: Mikrocontroller und Digitale Elektronik STM32F411 --> SPI --> MAX7219


von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Hi,

Ich versuche einen 7Segment Serial Display über SPI, mit STM32F411VE als 
Master und MAX7219 als slave in Betrieb zu nehmen. SPI Master Seite 
scheint richtig zu funktionieren, aber bei Slave nicht ich habe alles 
richtig initialisiert wie im Datenblatt beschrieben.(siehe Bild)

Irgendwie bekomme ich die Daten nicht angezeigt wie erwartet.

Hat jemand schon mit dem Teil schonmal gearbeitet, und konnte paar Tipps 
geben.

Mein Code:

Main routine:
1
int main(void)
2
{
3
  uint8_t RxChar;
4
  SystemInit();
5
  SysTick_Init();
6
  RCC_HSICmd(ENABLE);
7
8
  init_led_gpios();
9
  init_spi_gpio();
10
  init_spi_module();
11
  init_usart2_comm_module();
12
  init_usart2_gpio();
13
  init_powerup();
14
        /*Debugging*/
15
      USART_TX_string("Reset!\n\r");
16
        /*Debugging*/
17
  GPIO_SetBits(GPIOD, GPIO_Pin_12);
18
  while (1)
19
  {
20
    write_to_MAX7219(0x0A, 0x05);
21
    Delay_ms(500);
22
    MAX7219_displayNumber(25);
23
  }
24
}

SPI MAster_Konfiguration:
1
void init_spi_gpio(void)
2
{
3
  GPIO_InitTypeDef SPI_GPIOStruct;
4
5
6
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
7
8
  /*
9
   * PB3 - SCK
10
   * PB4 - MISO
11
   * PB5 - MOSI
12
   * */
13
  SPI_GPIOStruct.GPIO_Mode = GPIO_Mode_AF;
14
  SPI_GPIOStruct.GPIO_OType = GPIO_OType_OD;
15
  SPI_GPIOStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
16
  SPI_GPIOStruct.GPIO_PuPd = GPIO_PuPd_UP;
17
  SPI_GPIOStruct.GPIO_Speed = GPIO_Speed_100MHz;
18
19
  GPIO_Init(GPIOB, &SPI_GPIOStruct);
20
21
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
22
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
23
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
24
25
  /*NSS Pin Config */
26
  GPIO_InitTypeDef SPI_SSPIN_Struct;
27
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
28
29
  SPI_SSPIN_Struct.GPIO_Mode = GPIO_Mode_OUT;
30
  SPI_SSPIN_Struct.GPIO_OType = GPIO_OType_PP;
31
  SPI_SSPIN_Struct.GPIO_Pin = GPIO_Pin_15;
32
  SPI_SSPIN_Struct.GPIO_PuPd = GPIO_PuPd_UP;
33
  SPI_SSPIN_Struct.GPIO_Speed = GPIO_High_Speed;
34
35
  GPIO_Init(GPIOA, &SPI_SSPIN_Struct);
36
  //GPIO_SetBits(GPIOA,GPIO_Pin_15);
37
}
38
void init_spi_module(void)
39
{
40
41
  SPI_InitTypeDef SPI_InitStruct;
42
43
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
44
45
  SPI_StructInit(&SPI_InitStruct);
46
  SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
47
  SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
48
  SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
49
  //SPI_InitStruct.SPI_CRCPolynomial = 0x00;
50
  SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
51
  SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
52
  SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_LSB;
53
  SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
54
  SPI_InitStruct.SPI_NSS = SPI_NSS_Soft| SPI_NSSInternalSoft_Set;
55
56
  SPI_Init(SPI1, &SPI_InitStruct);
57
  SPI_Cmd(SPI1, ENABLE);
58
}


SPI_Transmit Routine
1
void SPI_send_word(uint16_t byte)
2
{
3
  while ( ( (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY) ) == SET))
4
          ;
5
  SPI_I2S_SendData(SPI1, (uint16_t) byte);
6
  while ( ( (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) ) != SET))
7
          ;
8
}

Write to MAX7219 Routine:
1
void write_to_MAX7219(uint8_t addr, uint8_t data)
2
{
3
  uint16_t Addr, Data, Data_to_send;
4
  Addr = (uint16_t)addr;
5
  Data = (uint16_t)data;
6
  Data_to_send = ( (Addr<<8 ) & 0xFF00 ) | Data ;
7
  GPIO_ResetBits(GPIOA,GPIO_Pin_15);
8
  SPI_send_word(  Data_to_send );
9
  GPIO_SetBits(GPIOA,GPIO_Pin_15);
10
}

MAX7219 Powerup routine:
1
#define delay 40
2
void init_powerup()
3
{
4
5
  write_to_MAX7219(0x00, 0x00);
6
  Delay_ms(delay);
7
  write_to_MAX7219(0x01, 0x00);
8
  Delay_ms(delay);
9
  write_to_MAX7219(0x02, 0x00);
10
  Delay_ms(delay);
11
  write_to_MAX7219(0x03, 0x00);
12
  Delay_ms(delay);
13
  write_to_MAX7219(0x04, 0x00);
14
  Delay_ms(delay);
15
  write_to_MAX7219(0x05, 0x00);
16
  Delay_ms(delay);
17
  write_to_MAX7219(0x06, 0x00);
18
  Delay_ms(delay);
19
  write_to_MAX7219(0x07, 0x00);
20
  Delay_ms(delay);
21
  write_to_MAX7219(0x08, 0x00);
22
  Delay_ms(delay);
23
  write_to_MAX7219(0x09, 0x00);
24
  Delay_ms(delay);
25
  write_to_MAX7219(0x0A, 0x00);
26
  Delay_ms(delay);
27
  write_to_MAX7219(0x0B, 0x00);
28
  Delay_ms(delay);
29
  write_to_MAX7219(0x0C, 0x00);
30
  Delay_ms(delay);
31
  write_to_MAX7219(0x0D, 0x00);
32
  Delay_ms(delay);
33
  write_to_MAX7219(0x0E, 0x00);
34
  Delay_ms(delay);
35
  write_to_MAX7219(0x0F, 0x00);
36
  Delay_ms(delay);
37
38
  write_to_MAX7219(0x09, 0xFF); /*Code B BCD*/
39
  Delay_ms(delay);
40
  write_to_MAX7219(0x0B, 0x07); /*Scan limit 7 digits*/
41
  Delay_ms(delay);
42
  write_to_MAX7219(0x0A, 0x0F); /*Brightness */
43
  Delay_ms(delay);
44
  write_to_MAX7219(0x0C, 0x01); /*Operation mode: Normal*/
45
  Delay_ms(delay);
46
47
}

von Maxim B. (max182)


Angehängte Dateien:

Lesenswert?

Aa B. schrieb:

> Irgendwie bekomme ich die Daten nicht angezeigt wie erwartet.
>
> Hat jemand schon mit dem Teil schonmal gearbeitet, und konnte paar Tipps
> geben.
>
Hallo,
wie sieht es aus mit VCC für Mikrocontroller und für Max7219 ?

Meine Vermutung: Max7219 läuft mit 5 Volt und dem reicht Signal von 3 
Volt-MK nicht.
Mögliche Abhilfe: MAX7219 kann auch mit 4 Volt laufen, aus meiner 
Erfahrung auch sogar von 3,3 Volt. Dann sollte alles stimmen.
Andere Möglichkeit: zwischen Mikrocontroller und Indikator 74HCT14 
einschalten, je 2 Ventile nacheinander, da sie invertieren. Das kann man 
sehr bequem machen: Pin 1, 2-13, Ausgang 12; Pin 3, 4-11; Ausgang 10; 
Pin 5, 6-9, Ausgang 8.
Das habe ich einmal gemacht, um von 3 Volt laufende ATMega mit MAX7219 
zu verbinden. Alles war wunderschön.

Hier ist meine Schema von damals, Testplatte für Indikator mit MAX7219.

Gruß,

: Bearbeitet durch User
von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Vielen Dank für deine Rückmeldung!

Ich dachte es liegt an meine SPI Einstellung auf der Software Seite,
war nicht völlig richtig gewesen, dann habe ich den Code angepasst, 
jetzt schickt er die Bytes sauber zum Slave an der MOSI Leitung. (siehe 
Anhang)

Maxim B. schrieb:
> Hallo,
> wie sieht es aus mit VCC für Mikrocontroller und für Max7219 ?
>
> Meine Vermutung: Max7219 läuft mit 5 Volt und dem reicht Signal von 3
> Volt-MK nicht.

Der Teil hat jetzt 4.9V ca, und gestern hatte er auch 4.7V also mehr als 
3V. mit 3 V
> Mögliche Abhilfe: MAX7219 kann auch mit 4 Volt laufen, aus meiner
> Erfahrung auch sogar von 3,3 Volt. Dann sollte alles stimmen.
mit 3.3 V habe ich auch ausprobiert aber läuft nicht wie erwartet.
Hast Du das exakt gleiche Teil?

von Harry (Gast)


Lesenswert?

Ich spreche zwar nicht C, aber wo steuerst du den CS des MAX? Soweit ich 
weiß, muß der CS so lange aktiv bleiben, bis alles übertragen wurde. 
Wenn deine Ausgaberoutine den CS selber bedient wird das nix.

von Aa B. (aaab)


Lesenswert?

Harry schrieb:
> Ich spreche zwar nicht C, aber wo steuerst du den CS des MAX? Soweit ich
> weiß, muß der CS so lange aktiv bleiben, bis alles übertragen wurde.
> Wenn deine Ausgaberoutine den CS selber bedient wird das nix.

CS is mit NSS leitung von SPI2 verbunden also Pin PB12 in mein Fall, 
Diese Pin schalte ich manuell in mein Code, wie du im Bild siehst 
(Channel3 ENABLE ist /CS), SS leitung ist auf LOW am Anfang des 
ByteTransfers, und am Ende geht wieder auf HIGH, also erst wenn er 
fertig ist.

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Aa B. schrieb:

> Der Teil hat jetzt 4.9V ca, und gestern hatte er auch 4.7V also mehr als
> 3V. mit 3 V

Auf der Seite von http://www.st.com bzg. STM32F411 steht:
The STM32F411xC/xE operate in the - 40 to + 125 °C temperature range 
from a 1.7 (PDR OFF) to 3.6 V power supply.

Wenn du hier 5 V  verwendest, ist dein STM32F411 schon lange tot.

MAX7219 hat keine TTL-Eingänge.
Operating Supply Voltage MIN 4.0 MAX 5.5 V
Logic High Input Voltage MIN 3.5 V

Also, überprüfe Signalpegel. Dein Problem kommt bestimmt deshalb, weil 
MAX7219 und STM32F411 zu unterschiedlichen Signalpegel haben. Dazu hast 
du bei deiner Verbindungsart keine gute Erde, das wirkt auch.

Noch eine Frage: wozu das?
#define delay 40
Delay_ms(delay);

Wozu wartest du nach jedem Befehl 40 ms? denkst du, so wird für MAX 
verständlicher? Wenn jemand mit dir redet und nach jedem Wort 2 Stunden 
wartet?
Denkst du, das reicht nicht?
while ( ( (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) ) != SET))

Ich habe verschiedene Module mit MAX7219 ausprobiert: 7-segm., Matrix. 
Und einziges Problem, das ab und zu kam, war: schlechte Erde und 
Qualität von Signal selst. Ansonsten sehr gute IC, absolut problemlos. 
Man sollte sich viel Muhe geben, um etwas schief zu machen.

: Bearbeitet durch User
von Felix F. (wiesel8)


Lesenswert?

Maxim B. schrieb:
> Wenn du hier 5 V  verwendest, ist dein STM32F411 schon lange tot.

Die meisten (nicht alle) Pins eines STM32 sind 5V-tolerant (im DB als FT 
gekennzeichnet).

mfg

von Maxim B. (max182)


Lesenswert?

Felix F. schrieb:

> Die meisten (nicht alle) Pins eines STM32 sind 5V-tolerant (im DB als FT
> gekennzeichnet).
>
> mfg

Auch dann bedeutet das nicht automatisch, daß MAX7219 notwendige 
Signalpegel bekommt, wenn MK von 3,3 Volt läuft. Von 5 V kann MK hier 
aber nicht laufen, sonst sofort tot. D.h. ohne Problem mit Signalpegel 
zu klären, kommen wir hier kaum noch weiter.

Wie schafft Aa Bb, daß MAX7219 von einem 3,3-Volt-MK 5V-Signal bekommt, 
schweigt er bisher...

Und noch - ich habe darüber schon geschrieben - Foto zeigt, daß auch ein 
Problem mit Erde mehr als wahrscheinlich ist. Indikator hat ca. 300 - 
350 mA Verbrauch,und zwar in Impuls. Das alles läuft über GND, und wirkt 
auch auf Signal.

Für meine (immer erfolgreiche) Versuche mit MAX7219 habe ich fast immer 
eine Platte gemacht, mit Erde und allem. Einmal habe ich eine Matrix mit 
4 MAX7219 auf einem Steckbrett ausprobiert - es gab auch komische 
Sachen. Auf einer SPI-Geschwindigkeit lief alles gut, wenn ich aber SPI 
langsamer (!) schaltete, lief nichts mehr - so etwas kann man nur mit 
Signalreflexionen und Erde aus einem dünnen Draht erklären.

Wenn auch bei 5 Volt-Signal Problem kommt, dann sollte man Speisung und 
Signal besser voneinander trennen, vielleicht auch serielle Widerstand 
für CS, CLK und Data (so ca. 22 Ohm) gegen Reflexionen einlöten. Aber 
zuerst Signalpegel.

: Bearbeitet durch User
von A. B. (Gast)


Lesenswert?

Aa B. schrieb:

> CS is mit NSS leitung von SPI2 verbunden also Pin PB12 in mein Fall,
> Diese Pin schalte ich manuell in mein Code, wie du im Bild siehst
> (Channel3 ENABLE ist /CS), SS leitung ist auf LOW am Anfang des
> ByteTransfers, und am Ende geht wieder auf HIGH, also erst wenn er
> fertig ist.

Fig. 192 im RM0383 zeigt klar: dem "Shift register" vorgelagert ist "Tx 
Buffer". Das TXE-Flag zeigt an, wann "TX Buffer" leer ist, also die 
nächsten Daten da hinein geschrieben werden dürfen. Das heisst aber noch 
lange nicht, dass das "Shift register" schon leer ist (die Übertragung 
also schon abgeschlossen ist)! Deaktiviert man SS, sobald TXE gesetzt 
wird, ist das also u. U. zu früh ...

Auf den folgenden Seiten ist unter "Handling data transmission and 
reception" genau beschrieben, wie vorzugehen ist! Kapitel komplett und 
sorgfältig lesen, insbesondere die Fallstricke mit dem BSY-Bit!!!

von Felix F. (wiesel8)


Lesenswert?

Maxim B. schrieb:
> Auch dann bedeutet das nicht automatisch, daß MAX7219 notwendige
> Signalpegel bekommt, wenn MK von 3,3 Volt läuft. Von 5 V kann MK hier
> aber nicht laufen, sonst sofort tot. D.h. ohne Problem mit Signalpegel
> zu klären, kommen wir hier kaum noch weiter.

Les meinen Beitrag nochmal genau durch!
Ich habe lediglich geschrieben, dass die Inputs des STM meist 5V-fähig 
sind und der Controller somit nicht automatisch tot ist, wenn ein 5V 
Signal anliegt.


Maxim B. schrieb:
> MAX7219 hat keine TTL-Eingänge.
> Operating Supply Voltage MIN 4.0 MAX 5.5 V
> Logic High Input Voltage MIN 3.5 V

Und laut diesen Ausgaben benötigt man für die Ausgänge sowieso einen 
Levelshifter.

mfg

von Daniel B. (dbuergin)


Lesenswert?

Häng sowas dazwischen und alles ist gut:
https://www.adafruit.com/product/395

Hat bei mir von Anfang an funktioniert. Habe aber nicht SPI verwendet,
sondern meine eigenen Bitwackler Routinen vom ATMega128:

Beitrag "Tempertur/Feuchte Display/Logger mit ATMega128  SHT75  SD-Karte"

umgeschrieben auf den STM32F4.

Wie die Vorredner schon geschrieben haben, sind die meisten der Ports
auf den Discovery-Board 5V tolerant, d.h. sie rauchen nicht ab, wenn
sie 5V Pegel bekommen. Selber generieren sie aber niemals 5V Pegel,
sondern nur max. 3.3v, und das reicht dem MAX7219 eben nicht.

Gruss Daniel

von Darth Moan (Gast)


Lesenswert?

Harry schrieb:
> Ich spreche zwar nicht C, aber wo steuerst du den CS des MAX? Soweit ich
> weiß, muß der CS so lange aktiv bleiben, bis alles übertragen wurde.
> Wenn deine Ausgaberoutine den CS selber bedient wird das nix.

Aa B. schrieb:
> CS is mit NSS leitung von SPI2 verbunden also Pin PB12 in mein Fall,
> Diese Pin schalte ich manuell in mein Code, wie du im Bild siehst
> (Channel3 ENABLE ist /CS), SS leitung ist auf LOW am Anfang des
> ByteTransfers, und am Ende geht wieder auf HIGH, also erst wenn er
> fertig ist.

Moin,

so wie ich das lese, will das Ding einen 16bit Transfer, keine 8bit
Transfers. Kann das sein?

"The data is then latched into either the digit or control registers
on the rising edge of LOAD/CS."

Also zumindest in dem Bild ist eindeutig zu erkennen, das CS nach
jedem byte kurz auf high geht.
So kann das doch nicht funktionieren, oder?
Ich habe das aber nur kurz ueberflogen.

Beitrag #5340071 wurde vom Autor gelöscht.
von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Darth Moan schrieb:
> Moin,
>
> so wie ich das lese, will das Ding einen 16bit Transfer, keine 8bit
> Transfers. Kann das sein?
>
> "The data is then latched into either the digit or control registers
> on the rising edge of LOAD/CS."
>
> Also zumindest in dem Bild ist eindeutig zu erkennen, das CS nach
> jedem byte kurz auf high geht.
> So kann das doch nicht funktionieren, oder?
> Ich habe das aber nur kurz ueberflogen.

Jo dat ist richtig, der Slave will 16bit gefuttert bekommen, also der SS 
leitung muss danach auf HIGH gesetzt werden, und dass kann der STM32 
auch, der Data Register von SPI ist ja 16bit groß, Slave will das aber 
nicht verstehen, ich habe festgestellt dass es nicht an der 
Programmierung liegt sondern an die Elektronik, der MAX teil ist richtig 
instabil.

Wie habe ich das festgestellt ?
In dem dass ich mit eine 8 bit ATMEGA328p als Master gesteuert habe und 
habe gesehen dass ich Tausend mal reset machen muss um einige digits auf 
dem Display zu sehen.

Anbei mein ATMega Code, und das Bild. Also SPI Register is 8bit gross 
bei AVR und ich habe, erst der SS Leitung auf LOW, dann address und 
danach data auf der leitung gesendet, und danach der SS Leitung HIGH 
gezogen.

von Darth Moan (Gast)


Lesenswert?

Aa B. schrieb:
> SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;

Und dein Logic/Oszi Screenshot zeigt genau 3 8bit Transfers nacheinander
mit CS high nach jedem Byte. Zeigt dein Bild denn genau was tatsaechlich
auf den SPI Pins passiert?

von Harry (Gast)


Lesenswert?

Aa B. schrieb:
> Harry schrieb:
> Ich spreche zwar nicht C, aber wo steuerst du den CS des MAX? Soweit ich
> weiß, muß der CS so lange aktiv bleiben, bis alles übertragen wurde.
> Wenn deine Ausgaberoutine den CS selber bedient wird das nix.
>
> CS is mit NSS leitung von SPI2 verbunden also Pin PB12 in mein Fall,
> Diese Pin schalte ich manuell in mein Code, wie du im Bild siehst
> (Channel3 ENABLE ist /CS), SS leitung ist auf LOW am Anfang des
> ByteTransfers, und am Ende geht wieder auf HIGH, also erst wenn er
> fertig ist.

Ich meinte nicht am Ende jedes Bytes, sondern am Ende des gesamten 
Tranfers.

von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Darth Moan schrieb:
> Aa B. schrieb:
>> SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
>
> Und dein Logic/Oszi Screenshot zeigt genau 3 8bit Transfers nacheinander
> mit CS high nach jedem Byte. Zeigt dein Bild denn genau was tatsaechlich
> auf den SPI Pins passiert?

Danke, dass war ein guter Tipp. Ich habe den Datasize auf 16b 
umgestellt, der Transfer sehe ich auch jetzt im Logicanalyzer, aber 
Slave will immer noch nicht verstehen.

was meinst Du ob das Bild wirklich das zeigt?

von Darth Moan (Gast)


Angehängte Dateien:

Lesenswert?

Aa B. schrieb:
> was meinst Du ob das Bild wirklich das zeigt?

Moin,

naja, die Frage ging dahin, ob das CS gelabelte Signal wirklich am Max
gemessen war oder etwas anderes. Weil es mit 16bit vs. 8bit nicht 
passte.
Aber das neue Bild scheint mir den Transfer von 0xFF90 zu zeigen.
Ich schaetze aber es sollte 0x09FF sein. Ist jetzt aber eine Vermutung.
Aber das stuetzt diese Vermutung:

Aa B. schrieb:
> SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_LSB;

Der Max will aber MSB first.

Dann sollte der SPI Transfer aber laufen wie gewuenscht. Wenn dann der
Max nicht will, koennte es an den Pegeln liegen, da hab ich noch nix
nachgeschaut.

von Maxim B. (max182)


Lesenswert?

Felix F. schrieb:

> Ich habe lediglich geschrieben, dass die Inputs des STM meist 5V-fähig
> sind und der Controller somit nicht automatisch tot ist, wenn ein 5V
> Signal anliegt.
Leider hilft das TC kaum.
Er glaubt immer noch, das sei nur ein Programmfehler.

Ich denke, es ist absolut falsch, zu behaupten, MAX7219 sei schlecht. 
Bei mir laufen sie immer gut, ich muß mich nur an elementaren Regeln 
halten. Ich habe schon 30 Stück in Arbeit.

Sie laufen gut mit SPI und auch mit Programm-SPI. Nur mögen sie es 
nicht, wenn Erde schlecht ist. Aber wer mag schon schlechte Erde?

Diese chinesische Module - das ist eigentlich falsch, daß sie nur 5 Pin 
haben: Vcc, Gnd und drei Signalleitungen. Man sollte Signal-Gnd und 
LED-Gnd getrennt verkabeln. Mögliche Abhilfe hier: die Module haben auch 
von anderer Seite 5 Pin, auch Vcc und Gnd.

: Bearbeitet durch User
von MitLeserin (Gast)


Lesenswert?

Funktionierender C-Code für Max7219 finden sich im
Projekt DCF77 Uhr in C mit ATtiny26 von Peter Dannegger unter 
Beitrag "DCF77 Uhr in C mit ATtiny26"

Eine Variante in C++ ist unter
Beitrag "Re: DCF77 Uhr in C mit ATtiny26"

zu finden.

Der auszugebende Zahlenwert wird in einem array[8] durch das Programm 
bereitgestellt und în einem Timer-Interrupt periodisch auf das Display 
ausgegeben.

Zum Verständnis wichtig: display_write, display_out.
Als erster Test wichtig: display_init mit Testmode on.

von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Darth Moan schrieb:

> Aber das neue Bild scheint mir den Transfer von 0xFF90 zu zeigen.
> Ich schaetze aber es sollte 0x09FF sein. Ist jetzt aber eine Vermutung.
> Aber das stuetzt diese Vermutung:
>
> Aa B. schrieb:
>> SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_LSB;
>
> Der Max will aber MSB first.
Du Hast völlig recht, MAX wollte schon immer den MSB zuerst. Jetzt 
läuft.

> Dann sollte der SPI Transfer aber laufen wie gewuenscht. Wenn dann der
> Max nicht will, koennte es an den Pegeln liegen, da hab ich noch nix
> nachgeschaut.
Jetzt reagiert der Slave, klasse, Danke, Du bist der Beste. :)))

von Aa B. (aaab)


Angehängte Dateien:

Lesenswert?

Darth Moan schrieb:

> Aber das neue Bild scheint mir den Transfer von 0xFF90 zu zeigen.
> Ich schaetze aber es sollte 0x09FF sein. Ist jetzt aber eine Vermutung.
> Aber das stuetzt diese Vermutung:
>
> Aa B. schrieb:
>> SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_LSB;
> Der Max will aber MSB first.
Du hast völlig recht, MAX wollte schon immer den MSB zuerst. Jetzt 
läuft.

> Dann sollte der SPI Transfer aber laufen wie gewuenscht. Wenn dann der
> Max nicht will, koennte es an den Pegeln liegen, da hab ich noch nix
> nachgeschaut.
Jetzt reagiert der Slave, klasse, Danke, Du bist der Beste. :)))

: Bearbeitet durch User
von Aa B. (aaab)


Lesenswert?

MitLeserin schrieb:
> Funktionierender C-Code für Max7219 finden sich im
> Projekt DCF77 Uhr in C mit ATtiny26 von Peter Dannegger unter
> Beitrag "DCF77 Uhr in C mit ATtiny26"
>
> Eine Variante in C++ ist unter
> Beitrag "Re: DCF77 Uhr in C mit ATtiny26"
>
> zu finden.
>
> Der auszugebende Zahlenwert wird in einem array[8] durch das Programm
> bereitgestellt und în einem Timer-Interrupt periodisch auf das Display
> ausgegeben.
>
> Zum Verständnis wichtig: display_write, display_out.
> Als erster Test wichtig: display_init mit Testmode on.

OKay danke, init routine habe ich in mein Program auch drin , hat mit 
der Problematik nichts zu tun eigentlich.

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.