Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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!) > }