-         

Ergebnis 1 bis 3 von 3

Thema: AD7798 (16-Bit ADC)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.11.2006
    Beiträge
    18

    AD7798 (16-Bit ADC)

    Anzeige

    Hallo zusammen,
    ich versuche mich nun seit gut 2 Wochen an dem AD7798 von Analog Devices. Es handelt sich um einen 16 Bit ADC mit SPI Schnittstelle.
    Das Problem besteht dadrin,das ich die kommunikation nicht hinbekomme und somit nix empfangen kann. hat jmd das ding schonmal zum laufen gebracht?

    Jeder Codeschnippsel (egal wodrin aber am liebsten asm / microchip pics) wär mir recht ...



    MfG & Thx
    Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Nicht für den AD7798, aber für den AD7795 hab ich so was.
    Ist leider in "C" aber die grundlegenden Sachen sollte man schon erkennen können.

    Code:
    /* Einen Clockimpuls für den AD7795 generieren */
    void clock_ad7795 (void)
    {
    #asm("nop");
    #asm("nop");
    ad7795_clock=0;
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    ad7795_clock=1;
    #asm("nop");
    #asm("nop");
    }
    
    /* 8Bit in den AD7795 schreiben */
    void write_ad7795 (unsigned char uc_byte)
    {
    unsigned char i=0;
    for(i=0;i<8;i++)
    {
        if((uc_byte&(1<<7))==(1<<7))
        {
            ad7795_din=1;
        }
        else
        {
            ad7795_din=0;
        }
        clock_ad7795();
        uc_byte=uc_byte<<1;
    }
    ad7795_din=1;
    }
    
    /* AD Wandlerwert holen AD7795 */
    unsigned int read_ad7795 (unsigned char uc_channel)
    {
        unsigned char uc_i;
        unsigned int ad_value=0;
        
        uc_channel=uc_channel&0b00000111; /* Höherwertige Bits abtrennen */
        
        // Init Configutation Register for Channel X
        ad7795_din=1;
        ad7795_cs=0;
        write_ad7795(0b00010000);   /* Write to Configutation Register */
        write_ad7795(0b00011000);   /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
        write_ad7795((0b10010000|uc_channel));   /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=X */
        ad7795_cs=1;
        #asm("nop");
        
        // Init Mode Register = Read selected AD Channel
        ad7795_cs=0;
        write_ad7795(0b00001000);   /* Write to Mode Register */
        write_ad7795(0b00100000);   /* Write value to Mode Register high = Single Conversation=On, AMP_CM=OFF*/
        write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
        
        delay_ms(50);               /* Auf A/D Wandler warten */
        if (ad7795_dout==1)
        {
            delay_ms(50);          /* Nochmal warten */
        }
        if (ad7795_dout==1)
        {
            ad_value=0;             /* Fehlerzähler hochzählen */
            uc_aderror++;
        }
        else                        /* A/D Wandler auslesen */
        {
            write_ad7795(0b01011000);  /* Readout Dataregister Command */
            for (uc_i=0;uc_i<16;uc_i++)
            {
                if (ad7795_dout==1)
                {
                    ad_value=ad_value|0x0001;
                };
            ad_value=(ad_value<<1);
            clock_ad7795();
            }
        };
        
        ad7795_cs=1;
        #asm("nop");
        
        return (ad_value);
    }
    
    /* Reset für den AD7795 */
    void reset_ad7795 (void)
    {
        unsigned char uc_i;
        ad7795_cs=0;
        #asm("nop");
        ad7795_din=1;
        for(uc_i=0;uc_i<34;uc_i++) /* eigentlich 32 */
        {          
            clock_ad7795();
        }
        ad7795_cs=1;
        #asm("nop");
    }
    
    
    /* Initialisieren des AD7795 */
    void init_ad7795 (void)
    {
        volatile unsigned char uc_i;
        for(uc_i=0;uc_i<4;uc_i++)
        {
            // Init Configutation Register Ch X
            ad7795_cs=0;
            write_ad7795(0b00010000);   /* Write to Configutation Register */
            write_ad7795(0b00011000);   /* Write value to Configutation Register high = VBIAS=OFF, Unipolar=1, Boost=On, Gain=1,*/
            write_ad7795(0b10010000|uc_i);   /* Write value to Configutation Register low = RefSel=1,17V int, Buf=ON, CH=AIN X */
            ad7795_cs=1;
            #asm("nop");
        
            // Init Mode Register = Init Zero Calibration Ch X
            ad7795_cs=0;
            write_ad7795(0b00001000);   /* Write to Mode Register */
            write_ad7795(0b10000000);   /* Write value to Mode Register high = Zero Calibration=On, AMP_CM=OFF*/
            write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate= 62Hz */
            delay_ms(50);
            if (ad7795_dout==1)
            {
                delay_ms(100);
                uc_aderror++;
            }
            ad7795_cs=1;
            #asm("nop");
            
            // Init Mode Register = Init Full Scale Calibration Ch X
            ad7795_cs=0;
            write_ad7795(0b00001000);   /* Write to Mode Register */
            write_ad7795(0b10100000);   /* Write value to Mode Register high = Full Scale Calibration=On, AMP_CM=OFF*/
            write_ad7795(0b00000100);   /* Write value to Mode Register low = CLK=int 64kHz,CHOP=en,UPD_Rate=62Hz*/
            delay_ms(50);
            if (ad7795_dout==1)
            {
                delay_ms(100);
                uc_aderror++;
            }
            
            ad7795_cs=1;
            #asm("nop");
        }
    };
    
    /* 6 A/D Werte aus dem AD7795 auslesen und abspeichern */
    void read6_ad7795 (void)
    {
        unsigned char uc_i;
        for (uc_i=0;uc_i<6;uc_i++)
        {
            ui_old7795[uc_i]=ui_7795[uc_i];
            ui_7795[uc_i]=read_ad7795(uc_i);
        }
    
    }
    //.............
    
    // AD7795 Initialisieren
    ad7795_cs=1;        /* /CS abschalten */
    ad7795_clock=1;     /* CLK auf ruheposition =1 setzen */
    ad7795_din=1;       /* DIN auf Ruheposition =1 setzen */
    reset_ad7795();     /* AD 7795 resetten */
    delay_ms(1);        /* 1ms warten */
    init_ad7795();      /* Initialisierungsroutine aufrufen */
    Ich hoffe es hilft weiter.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.11.2006
    Beiträge
    18
    Ich nutze zur Zeit die Hardware-SPI schnittstelle, wollte auch nun versuchen das ganze per Software zu machen.
    Aber sehe ich das richtig, das ich den SPI-Bus bei einem 16F876A wie folgt initalisieren muss?

    Code:
    ...
    	movlw	B'00110010'	; SSPEN ein, CKP ein, SPI master mode, clock = FOSC/16
    	movwf	SSPCON
    	BSF     STATUS,RP0    	; Bank1
    	movlw	B'01000000'     ; sample input data at middle, CKE = fallende flanke
    	movwf	SSPSTAT
    ...
    ich vermute nämlich es hängt irgendwo damit zusammen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •