MAX7221: Nur Display Test aus/ein funktioniert

Gast #3766862
Lesenswert?

Hallo zusammen!

Nun, ich habe folgendes Problem mit der Ansteuerung meines Max7221 die 
mit einem ATMEGA32 erfolgt.

Das einzige was ich Code mässig auf den MAX rüberbringe das er dann auch 
macht ist, DISPLAY TEST aus und anzuschalten. Jegliche andere versuche 
scheitern kläglich. Da meine led matrix nun schon recht gut blinken kann 
wäre was anderes auch nett.
Die Einzelansteuerung von zum Beispiel nur einer Reihe haut einfach 
nicht hin.

Nun hier meine Frage ist das ein Code problem oder liegt es etwas 
anderes

Hier der Code:
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
#include <util/delay.h>
4

5
void SPI_MasterInit(void) {
6
  DDRA = 0xFF;
7
  DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
8
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
9
}
10

11

12
void SLED(unsigned char cmd, char data) {
13
  PORTB &= (~(1<<PB4));
14
  SPDR = cmd;
15
  while(!(SPSR&(1<<SPIF)));
16
  SPDR = data;
17
  while(!(SPSR&(1<<SPIF)));
18

19
  PORTB |= (1<<PB4);
20
}
21

22
int main(void) {
23
  SPI_MasterInit();
24
  SLED(0x0C,0x00);
25
  SLED(0x0F,0x00);
26
  SLED(0x0a,0x0f);
27
  SLED(0x0B,0x07);
28
  SLED(0x09,0x00);
29
  SLED(0x01,0xff);
30
  return(0);
31
}
Gast #3767014
Lesenswert?

Franco schrieb:
> SLED(0x0C,0x00);
>   SLED(0x0F,0x00);
>   SLED(0x0a,0x0f);
>   SLED(0x0B,0x07);
>   SLED(0x09,0x00);
>   SLED(0x01,0xff);
Da kennt jemand das Datenblatt auswendig und weiß morgen noch, was jedes 
Bit bedeuted. Alle Achtung!
(Das war Ironie, falls es jemand nicht gemerkt hat.)

Meine Initialisierung sieht ungefähr so aus:
1
void led_init(void)
2
{
3
  DDRB |= _BV(LED_DATAIN) | _BV(LED_CS) | _BV(LED_CLK); // Ausgaenge aktivieren
4
  led_cs_high();
5

6
  // SPI initialisieren
7
  SPSR |= ( 1 << SPI2X);
8
        SPCR |= ( 1 << SPE)|( 1 << MSTR )|( 1 << CPHA)|( 1 << CPOL);
9

10
  DDRB |=  ( 1 << PB4); // als Ausgang
11
  PORTB &= ~( 1 << PB4); // low
12

13

14
  led_write(LED_SHUTDOWN, LED_SHUTDOWN_ON);
15
  led_write(LED_TEST, 0);
16
  led_write(LED_SCANLIMIT, 7);  // alle Digits anschalten
17
  led_write(LED_INTENSITY, 10);  // Helligkeit
18
  led_write(LED_MODE, LED_MODE_BCD7); // alles BCD
19
  led_clrscr();
20
  led_write(LED_SHUTDOWN, LED_SHUTDOWN_OFF);
21
}

Man macht sich einmal die Mühe, die Bits aus dem Datenblatt zu 
definieren und hat nach Jahren noch lesbaren Code...

Grüße,
Gunter

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