Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 i ADS7841 (Bascom)

lukit 13 Maj 2008 21:15 1560 4
  • #1 13 Maj 2008 21:15
    lukit
    Poziom 12  

    Witam,
    Prosze o pomoc w pobsludze programowej komunikacji SPI (bascom) dla przetwornika ADS 7841 http://focus.ti.com/lit/ds/symlink/ads7841.pdf

    Polaczenia wykonalem wg schematu na str.9 Vref=Vcc=5V , na pierwszy kanal podalem napiecie 2.5 V, podpinalem tez napiecie zasilania.
    Na wyswietlaczu (w byte a(1), a(2) odczytywane sa wartosci ale wygladaja na bardzo losowe zmieniaja sie z kazdym odczytem.
    Prawdopodobnie zle obsluzylem komunikacje. Nie wiem czy mozna pobrac wartosci 12bit odczytu za pomoca dwoch 8 bitowych. Kod zalaczam ponizej:


    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000


    Config Pinb.2 = Output
    Config Pind.5 = Output
    Config Pind.4 = Output
    Config Pind.3 = Input


    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portc.5 , Db6 = Portc.4 , Db5 = Portc.3 , Db4 = Portc.2 , E = Portc.0 , Rs = Portb.1

    Dim Odczyt As Word , Configur As Byte
    Dim V As Single
    Dim Wart_nap As String * 3
    Dim A(10) As Byte


    Config Spi = Soft , Din = Pind.3 , Dout = Portd.5 , Ss = None , Clock = Portb.2

    Spiinit

    Do

    Reset Portd.4
    Delay

    Configur = &B10010111

    Spiout Configur , 1
    Delay

    Spiin A(1) , 2

    Set Portd.4

    Cls

    Lcd Bin(a(1)) ; " " ; A(1)
    Lowerline
    Lcd Bin(a(2)) ; " " ; A(2)

    Waitms 500


    Loop
    End


    Z gory dziekuje za pomoc

    0 4
  • #2 15 Maj 2008 09:17
    lukit
    Poziom 12  

    Niestety nadal nie znalazlem sposobu na obsluzenie tego przetwornika ADS w bascomie. Znalazlem natomiast kod w C, w ktorym obsluzona jest komunikacja. Niestety nie wiem jak zaimplementowac sterowanie DCKL --> z kodu w c, na kod w bascomie.
    Czy ktos ktos bylby w stanie, prosze o pomoc

    Code:

    /*
     * Filename : ads7841.h
     * Hardware : Controller  -> P89V51RD2
     *            XTAL        -> 18.432 MHz
     *            Mode        -> 6 Clock/MC
     * I/O      : DCLK   P3.3
     *            CS   P3.4
     *            DIN   P3.5
     *            DOUT   P3.7
     * Compiler : SDCC           
     * Author   : sci-3d(malpa)hotmail.com
     * Date      : 01/08/06
     */

    #define DCLK   P3_3 /* DCLK pin */
    #define CS      P3_4 /* CS pin */
    #define DIN      P3_5 /* DIN pin */
    #define DOUT   P3_7 /* DOUT pin */

    int analog(char ch)
    {
       unsigned char i, crt_byte;   /* Variable for counter */
       unsigned int dat;         /* Variable for storing analog value */
       
       switch(ch)                     /* Check selected channel for reading */
       {
          case 0 :   crt_byte = 0x97;   /* Select analog channel 0 */
                   break;
          case 1 :   crt_byte = 0xD7;   /* Select analog channel 1 */   
                   break;
          case 2 :   crt_byte = 0xA7;   /* Select analog channel 2 */
                   break;
          case 3 :   crt_byte = 0xE7;   /* Select analog channel 3 */
                   break;
          default:   crt_byte = 0x97;   /* Select analog channel 0 */
                   break;
       }

       dat = 0;
       DCLK = 0;   /* Clear DCLK pin */
       DIN = 0;   /* Clear DIN pin */




       CS = 0;      /* Clear CS pin */
       
       for(i=0; i<8; i++)            /* Loop to send control byte for ADS7841 */
       {
          DIN = crt_byte & 0x80;       /* Send data bit to ADS7841 */

          DCLK = 0;               /* Clear clock pin */
          DCLK = 1;               /* Set clock pin */
             
          crt_byte = crt_byte<<1;     /* Shift bit once next time */
       }

       DCLK = 0;                  /* Clear clock pin */
       DCLK = 1;                  /* Set clock pin */

       for(i=0; i<12; i++)            /* Loop to read 12-bit digital value from ADS7841 */
       {
          DCLK = 0;               /* Clear clock pin */
          DCLK = 1;               /* Set clock pin */

          dat = dat<<1;             /* Shift bit once to store data next bit */
          dat = dat | DOUT;          /* Read data bit from DOUT pin */
       }

       for(i=0;i<4;i++)            /* Generate rising edge clock for success frame */
       {
          DCLK = 0;               /* Clear clock pin */
          DCLK = 1;               /* Set clock pin */
       }

       CS = 1;                     /* Set CS pin */

       return dat;                  
    }

    0
  • #3 16 Lip 2009 19:11
    Tranzystor_1992
    Poziom 16  

    Wydaje mi się, że problemu z transmisją nie ma. Spróbuj do wejścia podłączyć masę urządzenia i zobacz co się dzieje.
    Również mam problem z obsługą tego przetwornika polegający na tym, że gdy odczytuje sprzętowym SPI, to przesunięty jest odczyt o jeden bit w prawo :cry:

    0
  • #4 16 Lip 2009 21:30
    lukit
    Poziom 12  

    Polecam przesiadkę z Bascoma na C. To jedyne wyjście żeby implementować poważne rozwiązania.

    0
  • #5 16 Lip 2009 21:58
    Tranzystor_1992
    Poziom 16  

    Szczerze mówiąc nie ma z tym problemu :D Ponieważ w C też programuję, jednak co do komunikacji I2C i 1wire pod C się jednak nie za wygodnie piszę. A nie mam zbyt wiele czasu, żeby bawić się w to od początku, bo tak bym dawno napisał program w C :) A możesz powiedzieć jak to ostatecznie zadziałało :?:

    0