Zdravím,
v prvé řadě se omlouvám, že otravuji s problémém v neděli .
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.