DAC8512 am CC-Pro 128 betreiben Kategorie: Sonstige Hardware (von RoM - 2.02.2011 16:40) | ||
| ||
Hallo zusammen, ich möchte gern an meinem Mega128 einen DAC vom Typ Analog Devices DAC8512 betreiben. Mit der Programmierung habe ich da so meine Probleme, denn laut Datenblatt soll der Chip seriell angesprochen werden. Dabei dachte ich zuerst an das SPI-Protokoll. Doch die Doku hat mir nicht wirklich geholfen und Demoprogramme habe ich auch nicht gefunden. Dann bin ich durch Zufall an den Quellcode eines LTC1257 geraten, allerdings nur für in C. Hab den Code dann mit einem ATmega 8 getestet (musste nur noch CS zufügen) und der DA-Wandler funktioniert. Kann mir jemand Tips geben, wie ich den u. a. Code auf meinem CC Pro 128 zum laufen bringe ? Grü�e Roland #define DACOUT PORTB #define DACIN PINB /* * Port configuration: * * Port pin DAC8512 * -------------------- * PB2 CS_DAC * PB3 LOAD * PB4 DATA * PB5 CLK * */ #define DACCLK(LEVEL) DACOUT = (LEVEL) ? (DACIN & ~_BV(PB5)):(DACIN | _BV(PB5)) #define DACDATA(LEVEL) DACOUT = (LEVEL) ? (DACIN & ~_BV(PB4)):(DACIN | _BV(PB4)) #define DACLOAD(LEVEL) DACOUT = (LEVEL) ? (DACIN & ~_BV(PB3)):(DACIN | _BV(PB3)) #define LATCHTIMING 0x02 /* spend some time to the latch */ #define LEV_LOW 0 #define LEV_HIGH 1 inline void dac8512_ll_init(void); inline void dac8512_ll_write(unsigned int); /* * Low level initialisation routine for DAC8512. */ inline void dac8512_ll_init(void) { /* Initial port/pin state */ DACCLK(LEV_LOW); /* clock pin low -> idle*/ DACLOAD(LEV_HIGH); /* load pin high -> idle */ } /* * Low level write routine for LTC1257. * Awaits data in unsigned integer format * 12 bits masked (0x800 masks the data's MSB) */ inline void dac8512_ll_write(unsigned int data) { volatile unsigned char bitctr = 0; // DAC8512 ein: PORTB &= ~(1 << PB2); // CS_DAC auf LOW ( -> EIN!) for(bitctr = 0; bitctr < 0x0C; bitctr++) { DACDATA(data & 0x800); /* output MSB (bits [11..0]!) */ data <<= 1; /* shift next bit to MSB */ DACCLK(LEV_HIGH); /* rising edge -> load bit */ DACCLK(LEV_LOW); /* -> await rising edge */ } DACCLK(LEV_LOW); /* clock pin low -> idle */ DACLOAD(LEV_LOW); /* load pulled low -> output */ for (bitctr = 0; bitctr < LATCHTIMING; bitctr++) ; DACLOAD(LEV_HIGH); /* load pulled high -> idle*/ // DAC8512 aus: PORTB |= (1 << PB2); // CS_DAC auf HIGH ( -> AUS!) } | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum