Max 7221 über SPI ansteuern --> Probleme :(

Gast #365166
Lesenswert?

Hall an alle

Ich versuch seit letzte Woche vergeblich den Max7221 mit dem Mega88
über SPI ansteuern. Leider werden all Digits eingeschalten.

Viellechr kann mir wer helfen :)

Hier der Code:

int main (void)
{
  DDRC &= ~(1 << 1);
  spi_init();
  i2c_init();
  segments_init();
  adc_init();

  spi_senden(0x0A, 0x0C); //Helligkeit
  show_temp();

  while(1)
  {
  PORTC^= (1 << 1);
  delay(1000);
  }
  return 0;
}

void spi_init (void)
{
  DDRB = ((1 << PB3) | (1 << PB5) | (1 << PB2)); //MOSI, SCK, SS Output,
alle anderen Input
  PORTB &= ~((1 << PB3) | (1 << PB5) | (1 << PB2));
  SPCR = ((1 << SPE) | (1 << MSTR));
}

void spi_senden (uint8_t adress, uint8_t data)
{
  PORTB &= ~(1 << PB2); //SS auf Low
  SPDR = adress;
  while (!(SPSR & (1 << SPIF))); //warten bis gesendet
  SPDR = data;
  while (!(SPSR & (1 << SPIF))); //warten bis gesendet
  PORTB |= (1 << PB2); //SS auf high
}

void segments_init(void)
{
  spi_senden(0x0B, 0x05); //6 Digits 0-5
  spi_senden(0x0F, 0x00); //Display Test ausschaltren
  spi_senden(0x0C, 0x01); //Normal Operation
  spi_senden(0x09, 0xFF); //BCD Code für alle Digits
}

void show_temp(void)
{
  uint8_t temp, nachkomma, zehner, einer;

  readfromLM75(&temp, &nachkomma);

  zehner = temp / 10;
  einer = temp % 10;

  spi_senden(0x09, 0x00); //Disable BCD Code
  spi_senden(0x01, 0x4E); //C
  spi_senden(0x02, 0x63); //°
  spi_senden(0x09, 0xFF); //Enable BCD for all Digits

  spi_senden(0x04, nachkomma);
  spi_senden(0x05, einer);
  spi_senden(0x06, zehner);
}

An den Segementanzeigen sollte eigentlich die Temperatur, die über
einen LM75 Temperatursensor ausgelesen wird angezeigt werden.

Danke im Voraus

Gruß Robert
Gast #365167
Lesenswert?

> Ich versuch seit letzte Woche vergeblich den Max7221 mit dem Mega88
> über SPI ansteuern. Leider werden all Digits eingeschalten.

Was bekommst den als Anzeige wenn, Du keine Ziffen ausgibst?
(nur segments_init)
es sollten nur die DP leuchten...

Kontrolliert ob MOSI wirklich mit DIN von MAX7221 verbunden?

/Koarl

Ps: wieso schaltest den BCD-Code ein aus? und nicht nur für die
verwendeten Stellen?
Gast #365168
Lesenswert?

Hallo Koarl

Werde das nachher testen. Ich habe6 Digits bei meinem
Digitaluhrprojekt. 6 Ziffern für HH:MM.SS. Weitewr s soll die Uhr auch
eine Temperaturmessung übernehmen und die Temperatur auch anzeigen.
(Tastendruck) Für die Uhr brauch ich den BCD Code. Wenn ich aud
Temperaturmessung umschalte, brauch aber ° und C. Die beiden Zeichen
gehören aber nicht zum BCD Code ;)

Gruß Robert
Gast #365169
Lesenswert?

Hallo,
jetzt hab ich mir mal Deinen Code genauer angeschaut!
(programmiere aber selber keine AVR)

Was mir dabei aufgefallen ist beim SPI-Init legst SS (ist mit /CS vom
MAX verbunden?) auf LOW!

Damit hast wenn Du den ersten Befehl an den MAX schickst keine fallende

Flanke beim /CS. Sollte zwar kein Problem sein da dazwischen keine
SPI-CLK Impulse kommen. Aber es ist 'unschön' & macht vielleicht
Probleme...

/Koarl

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