Program pro komunikaci s DP pres SPI

Zdravím,

v prvé řadě se omlouvám, že otravuji s problémém v neděli :frowning: .
Snažím se o komunikaci ATmegy16 s digitálním potenciometrem MCP41100 pres rozhraní SPI. Celá komunikace je odstartována příchodem impulzu externího přerušení na vstup INT0.

Na osciloskopu připojeného na MOSI je signál, jenž není uplně zcestný, ale DP je bez reakce tj. odpor je stále stejný.

Problém bude asi nejspíše v programu, který přikládám níže.

/*program pri aktivaci INT0 zkousejici komunikaci pres rozhrani
SPI pro ATmega16 (master) s DP MCP41100
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay_basic.h>

#define F_CPU 1000000UL

#define SS 4
#define MOSI 5
#define MISO 6
#define SCK 7
#define SET_SS PORTB |=(1<<SS)
#define CLEAR_SS PORTB &= ~(1<<SS)

volatile uint8_t SPIDataC,SPIDataD;

void InitPORTs(void){

DDRD = 0b11111011;

}
void SPI_MasterInit(void){

DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS)|(0<<MISO);
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<CPOL)|(0<<CPHA);//povoleni preruseni od SPI, set master, set fosc/16

}
void SPI_MasterTransmit(uint8_t cData){
/* Start transmission /
SPDR = cData;
/
Wait for transmission?complete */
while(!(SPSR & (1<<SPIF)));
}
void INT0_Init(void){

MCUCR |= 0x00;//The low level of INT0 generates an interrupt request.
GICR |= (1<<INT0);//aktivovano INT0

}

ISR(INT0_vect){

SET_SS;

asm("nop");
SPI_MasterTransmit(SPIDataC);
SPI_MasterTransmit(SPIDataD);

asm("nop");
CLEAR_SS;

}
int main(void){

InitPORTs();
SPI_MasterInit();
INT0_Init();

SPIDataC = 0b00010001; //data pro MCP41100, command byte
SPIDataD = 46;//data pro MCP41100,data byte

sei();

for(;;);

return 0;

}

Děkuji moc za postřehy a rady.

nijak extra jsem to nezkoumal, ale co me jako prvni napadlo, nema byt nahodou chip select - predpokladam ze je to ss v nule?

Vstup Chip Select (MCP41100) je negovaný tj. aktivuje jej log 0 . Chápal bych tedy, že na tento vstup musím přivést log 1 to zajištˇuji makrem #define SET_SS PORTB |=(1<<SS) .

Osobně bych si myslel, že pokud je něco aktivní v nule, tak by bylo dobré tam tu nulu přivést, aby to bylo aktivní (zvláště pokud je to Chip Select), to je ale jen můj skromný názor…

Priklanam sa s mojim skromnyn nazorom k predchadzajucemu prispevku. :slight_smile:

Viem ze je to neuveritelne, uz si to tu i sam povedal, ze /CS je aktivny v nule, len sa tomu neboj uverit. Nech Ta sila sprevadza :slight_smile:

Diky za rady vše již funguje :slight_smile:, stačilo se odprostit od faktu, že není možné aktivovat něco log.0. Bohužel již vím proč mi nefungovala i valná část zapojení kde figuroval obvod aktivovaný /CS :frowning: . Každopadně díky :slight_smile: .