Forum: Mikrocontroller und Digitale Elektronik AT90CAN!28 / LTC1257, Ausgabe von ADC Werten über den DAC


von Mike G. (Firma: ixwyc) (balu1980)


Lesenswert?

Moin,

ich versuche das mit dem ADC Wandler eingelesen Signal vom AT90CAN128
über den DAC LTC1257 auszugeben. Angeschlossen ist der LTC 1257 wie
folgt:

PC0    LOAD
PC1    CLK
PC2    DATA

zum ansteuern verwende ich die bereits existierende und in dem Thread

Beitrag "LTC1257 Low Level Routinen"

behandelte Header Datei. Folgend auf meine Ports abgeändert:

//---------------------------------------------------------------------- 
-----------
// Digital Analog Wandler Initialisieren

#define DACOUT    PORTC
#define DACIN    PINC

/*
 * Port Konfiguration LTC1257
 *
 * PC0    LOAD
 * PC1    CLK
 * PC2    DATA
 *
 */

#define DACLOAD(LEVEL)  DACOUT = (LEVEL) ? (DACIN & ~_BV(PC0)):(DACIN | 
_BV(PC0))
#define DACCLK(LEVEL)  DACOUT = (LEVEL) ? (DACIN & ~_BV(PC1)):(DACIN | 
_BV(PC1))
#define DACDATA(LEVEL)  DACOUT = (LEVEL) ? (DACIN & ~_BV(PC2)):(DACIN | 
_BV(PC2))

#define LATCHTIMING  0x01        /* spend some time to the latch  */

#define LEV_LOW    0
#define LEV_HIGH  1

inline void DAC_init(void);
inline void DAC_send(unsigned int);

/*
 * Low level initialisation routine for LTC1257.
 */

inline void DAC_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)
 */


//---------------------------------------------------------------------- 
-----------
// Wert an Digital Analog Wandler uebertragen

inline void DAC_send(unsigned int data)
{
  volatile unsigned char bitctr = 0;

  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    */
}


Wie muß ich die eingelesenen Daten des ADC an den DAC geben.

Eingelesen werden die Werte mit dem Teilungsfaktor 128, gewählt durch
Berechnung. Danach habe ich mit der itoa Funktion daraus Dezimalwerte 
erzeugt. Diese Wasndlung scheint einwandfrei zu Funktionieren.

Ich hoffe mir kann jemand helfen.

Gruß Mike

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.