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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.