Forum: Mikrocontroller und Digitale Elektronik MAX7221: Nur Display Test aus/ein funktioniert


von Franco (Gast)


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
}

von holger (Gast)


Lesenswert?

SLED(0x0C,0x01);

von Gunter (Gast)


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

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.