SPI och DAC from the very början... *FUNGERAR*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
grapetonix
Inlägg: 293
Blev medlem: 14 juli 2004, 17:20:50
Skype: grapetonix
Ort: Hägersten, Stockholm

Inlägg av grapetonix »

Såhär skrev jag mina rutiner i PICC mot en MCP4822 (2-kanalig 12 bitars DAC från microchip).
Processorn som används är 12F675 @ 4MHz, med portar hakade som angivna nedan.

loadDA([ett värde 0-4095],[kanal 0-1],[förstärkning (1=1X 0=2X]);

och sen

clockDA();

för att smacka ut värdena på utgångarna synkat.

Kod: Markera allt


#define testbit(data,bitno) 	((data>>bitno)&0x01)
#define hibyte(x)       		(unsigned char)(x>>8)
#define lobyte(x)        		(unsigned char)(x & 0xFF)

void loadDA(int value, char channel, char gain){
/* note: GPIO0=/CS GPIO1=SCK GPIO2=SDI GPIO4=/LDAC */
	char lb_value = lobyte(value);
	char hb_value = hibyte(value);
	char cnt=0;

	GPIO1=0;
	GPIO2=0;
	
	GPIO0=0;
	if (channel==0){GPIO2=0;}
	if (channel==1){GPIO2=1;} 

	GPIO1=1;		/*channel bit being clocked in. (15)*/
	GPIO1=0;

	GPIO1=1;			/*"Do not care" bit (14). clocked in. */
	GPIO1=0;	

	if (gain==0){GPIO2=0;}
	if (gain==1){GPIO2=1;} 

	GPIO1=1;		/*gain bit being clocked in. (13)*/
	GPIO1=0;
	

	GPIO2=1;		/*output always on*/      

	GPIO1=1;		/*output powerdown control bit clocked in (12)*/
	GPIO1=0;		



	/*x>>=1 div2 ; x<<=1 mul2 */

	cnt = 0;

	while (cnt < 4){			/*value bits (11-8) clocked in*/
		GPIO2 = testbit(hb_value,3);
		GPIO1 = 1;		
		GPIO1 = 0;
		
		hb_value = hb_value << 1;
		cnt++;
	}

	cnt = 0;

	while (cnt < 8){			/*value bits (7-0) clocked in*/
		GPIO2 = testbit(lb_value,7);
		GPIO1 = 1;		
		GPIO1 = 0;
		
		lb_value = lb_value << 1;
		cnt++;
	}

	GPIO0 = 1;				/*CS goes high again and data is latched.*/

	
}

void clockDA(){
	GPIO4=0;
	GPIO4=1;

}
Skriv svar