Razer
30.04.2006, 13:22
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
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