Здравствуйте. По SPI для обмена информацией с AD8400 необходимо передавать 10 бит информации. 2 бита адреса, и 8 бит само значение.
на просторах интернета нашел, исходник,, но не могу понять одну строчку строчку в функции void set_resistance :
Вот собственно и сама строчка.
Мне бы ее еще понятной для CodeVisionAVR сделать.
Раздел: МК для начинающих
на просторах интернета нашел, исходник,, но не могу понять одну строчку строчку в функции void set_resistance :
#include <mega16.h>
#include <delay.h>
#define PORT_SPI PORTC/*назначения портов и сигналов программного SPI*/
#define DDR_SPI DDRC
#define PIN_SPI PINC
#define SDO PORTC.0
#define CKL PORTC.1
#define CS PORTC.2
#define SHDN PORTC.3
#define RS PORTC.4
void init_SPI (void)//функция инициализации программного SPI
{
DDRC = 0xFF;
PORT_SPI |= (1<<CS) | (1<<SHDN) | (1<<RS);//с лог. 1
PORT_SPI &= ~(1<<SDO);//и лог. 0
PORT_SPI &= ~(1<<CKL);//
}
void set_resistance (unsigned char addr, unsigned char value)//функция записи
{
unsigned char i;//переменная для цикла
unsigned int addr_value;//промежуточная переменная для вычисления управляющего слова
addr_value = ((unsigned int) (addr<<8)) | ((unsigned int) value);//формируем управляющее слово из двух бит адреса и байта сопротивления
PORT_SPI &= ~(1<<CS);//выбор микросхемы
for(i=0; i < 10; i++)//для 10 бит управляющего слова
{
if(0x0001 & (addr_value>>(9-i))) PORT_SPI |= (1< <SDO);
PORT_SPI &= ~(1<<SDO);//иначе - выставляем ноль
PORT_SPI |= (1<<CKL);//фронт синхроимпульса
PORT_SPI &= ~(1<<CKL);//спад синхроимпульса
}
PORT_SPI |= (1<<CS);//не выбираем микросхему
}
void main(void)
{
unsigned char q;//переменная для цикла spi
init_SPI();//инициализируем программный SPI
PORTA=0x80;
DDRA=0xFF;
PORTB=0x03;
DDRB=0x2F;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
while (1)
{
for(q=0;q < 255; q++)
{
set_resistance(0x01, q);
q=0;
}
}
}
Вот собственно и сама строчка.
if(0x0001 & (addr_value>>(9-i))) PORT_SPI |= (1< <SDO)
Мне бы ее еще понятной для CodeVisionAVR сделать.
Раздел: МК для начинающих