Tpro
13.03.2012, 16:03
Hallo
ich möchte einen Digital-Analogwandler (Max541) per Spi am Atmega32 steuern. Für den Chip Select des DAC benutze PinB2. Das Problem ist das dieser Pin extrem langsam auf GND abfällt (ca 300µs) wärend alle anderen Signale vom SPI deutlich steiler sind. Damit funktioniert natürlich auch das Timing nicht...
Die Initalisierung von PB2 als Ausgang im Program:
DDRB = (1<<DDB2);
Funktionen für SPI
// konfigurieren des SPI
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
//auch SS mitals ausgang da er sonst hängen bleibt...
DDRB = (1<<DDB5)|(1<<DDB7)|(1<<DDB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
// DAC
uint8_t spi_send_byte(uint8_t data)
{
/* Start transmission */
SPDR = data;
while(!(SPSR & (1<<SPIF)));
return 1;
}
uint8_t spi_DAC(uint16_t data)
{
union daten
{
uint16_t data;
struct
{
uint8_t byte1;
uint8_t byte2;
};
}dat;
dat.data=data;
//low -> DAC anwählen
PORTB &= ~(1 << PB2);
//senden des ersten bytes
SPDR = dat.byte1;
while(!(SPSR & (1<<SPIF)));
//senden des zweiten bytes
SPDR = dat.byte2;
while(!(SPSR & (1<<SPIF)));
//high -> DAC aktualisiern + abwählen
PORTB |= (1 << PB2);
return 1;
}
Kann mir jemand erklären wie diese Phänomen zustande kommt?
ich möchte einen Digital-Analogwandler (Max541) per Spi am Atmega32 steuern. Für den Chip Select des DAC benutze PinB2. Das Problem ist das dieser Pin extrem langsam auf GND abfällt (ca 300µs) wärend alle anderen Signale vom SPI deutlich steiler sind. Damit funktioniert natürlich auch das Timing nicht...
Die Initalisierung von PB2 als Ausgang im Program:
DDRB = (1<<DDB2);
Funktionen für SPI
// konfigurieren des SPI
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
//auch SS mitals ausgang da er sonst hängen bleibt...
DDRB = (1<<DDB5)|(1<<DDB7)|(1<<DDB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
// DAC
uint8_t spi_send_byte(uint8_t data)
{
/* Start transmission */
SPDR = data;
while(!(SPSR & (1<<SPIF)));
return 1;
}
uint8_t spi_DAC(uint16_t data)
{
union daten
{
uint16_t data;
struct
{
uint8_t byte1;
uint8_t byte2;
};
}dat;
dat.data=data;
//low -> DAC anwählen
PORTB &= ~(1 << PB2);
//senden des ersten bytes
SPDR = dat.byte1;
while(!(SPSR & (1<<SPIF)));
//senden des zweiten bytes
SPDR = dat.byte2;
while(!(SPSR & (1<<SPIF)));
//high -> DAC aktualisiern + abwählen
PORTB |= (1 << PB2);
return 1;
}
Kann mir jemand erklären wie diese Phänomen zustande kommt?