Forum: Compiler & IDEs Max 7221 über SPI ansteuern --> Probleme :(


von Robert Schilling (Gast)


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

von Karl Kalchgruber (Gast)


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?

von Robert Schilling (Gast)


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

von Karl Kalchgruber (Gast)


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

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.