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.

PIC10F206 i DDS AD9834

mpx-fm 17 Sie 2009 17:29 2415 4
  • #1 17 Sie 2009 17:29
    mpx-fm
    Poziom 19  

    chciałbym się dowiedzieć czy będą jakieś kłopoty w sterowaniu AD9834 przez PIC10F206
    proszę o podpowiedzi jak by to najprościej było zrealizować z użyciem tego mini-procesorka

    program nie zawierał by żadnych wodotrysków,
    poprostu po włączeniu zasilania ustawiał by rejestry konfiguracyjne DDS'a na sztywno
    żadnej klawiatury ,wyświetlacza i nic innego , procek połączony z jednym - dwoma (może więcej) identycznych DDS'ów
    program ustawia częstotliwość, faze i może coś tam jeszcze
    i na tym kończy swoje działanie

    nieprzeglądałem jescze szczegółowo dokumentacji AD9834 , ale zdaje sie potrzeba mu 32bity konfiguracyjne wygenerować i tyle

    prosił bym o przykładowy kod asm. w miare możliwości

    mam też takie pytanie - czy dało by się zadaptować poniższy kod (przeznaczony do PIC16F873 ) , by go wykorzystać w PIC10F206 ?

    0 4
  • Pomocny post
    #2 18 Sie 2009 14:36
    adamwesola
    Poziom 24  

    Masz tu program obsługi SPI, trochę go przystosowałem do 10F206 i Twoich potrzeb, ostateczne "szlify" zrób sam. W razie co, służę pomocą.
    (nowy, zmieniony)

    Code:
    ;zapis danych opadajacym zboczem zegara, do rejestrow AD9843
    

        processor 10F206
        #include <P10F206.INC>
       
     __CONFIG _MCLRE_OFF&_CP_OFF&_WDT_OFF

    #define      SPI_SDO      GPIO,0       ; szereg.wyjscie danych
    #define      SPI_CS       GPIO,1       ; czip selekt
    #define      SPI_CLK      GPIO,2       ; zegar

    spi_buff = 10h   
    licz_bit = 11h

             org 0
             bcf    CMCON0,3   ;wylacz.komparator
          movlw   b'11011111'   ;wlaczenie GPIO 2
          option
             clrw
             tris   GPIO 
             movlw   6      ;stan spoczynkowy
             movwf   GPIO   ;sdo=0,clk=1,cs=1
    ;-----------------------------------
    ;dane dla rejestru kontroli             
          movlw     1Ch         ;wpisz poprawna wartosc                       
             call      SPI_write
             movlw     25h         ;wpisz poprawna wartosc         
             call      SPI_write
             movlw   6      
             movwf   GPIO   ;idlle
    ;-----------------------------------------
    ;dane dla rejestru czestotliwosci i fazy   
             movlw     2Fh         ;wpisz poprawna wartosc           
             call      SPI_write
             movlw     3Fh         ;wpisz poprawna wartosc         
             call      SPI_write
             movlw   6      
             movwf   GPIO   ;idlle
             sleep
    ;==============================
    SPI_write
             movwf     spi_buff                     
             movlw     8                   
             movwf     licz_bit
    write   rlf      spi_buff,f   ;7-my bit do C
          rlf      GPIO,f      ;C do SPI_SDO
           bsf       SPI_CLK
           bcf       SPI_CLK
          bcf      SPI_SDO      ;zapobiega "1" na SPI_CS
           decfsz    licz_bit,f
             goto      write
             return

             end
         

    0
  • #3 20 Sie 2009 18:26
    mpx-fm
    Poziom 19  

    serdecznie dziekuje za pomoc kolego

    niestety nie nabyłem jescze literatury opisującej któryś z języków programowania mikrokontrolerów microchipa

    ogromne dzięki!

    podzespoły w drodze
    -o efektach oczywiście poinformuje

    miałbym jescze prośbe - gdybyś mógł (albo ktoś inny) zerknąc w poniższt kod
    pisany był właśnie z tego co pamiętam pod PIC10F206 i chyba jakiś syntezer od Analog Devices (nie pamietam niestety pod jaki konkretnie)
    byłbym wdzięczny gdybyś mogł porównać z tym zaproponowanym przez Ciebie
    zastanawiałem się nad rozbudową o sterowanie z komputera PC w póżniejszym czasie

    Code:
    #include <htc.h>
    
       
    __CONFIG (0x0FFB);

    // Device settings:
    #define R_COUNTER 2    // Set R_Counter value
    #define B_COUNTER 22   // Set B_Counter value
    #define A_COUNTER 4    // Set A_Counter value
    #define POWER 3         // Set Output Power level (0=-14dBm, 1=-11dBm, 2=-8dBm, 3=-5dBm)
    #define CPGAIN 7       // Set Charge Pump Current (0=0.31mA, 1=0.62mA, 2=0.93mA, 3=1.25mA, 4=1.56mA, 5=1.87mA, 6=2.18mA, 7=2.50mA)
    #define ANTIBACKLASH 2  // Set Antibacklash pulse width (0=3.0nS, 1=1.3nS, 2=6.0nS, 3=3.0nS)
    #define CORE 0          // Set Core Power level (0=5mA, 1=10mA, 2=15mA, 3=20mA)
    //-----------------

    #define   SPI_LE GP0
    #define   SPI_DATA GP1
    #define SPI_CLOCK GP2

    #if R_COUNTER > 16383 || R_COUNTER < 1
    #error R_COUNTER value is not valid! (R_COUNTER range must be 1 to 16383)
    #endif
    #if B_COUNTER > 8191 || B_COUNTER < 3
    #error B_COUNTER value is not valid! (B_COUNTER range must be 3 to 8191)
    #endif
    #if A_COUNTER > 31 || A_COUNTER < 0
    #error A_COUNTER value is not valid! (A_COUNTER range must be 0 to 31)
    #endif
    #if POWER > 3 || POWER < 0
    #error POWER value is not valid! (POWER range must be 0 to 3)
    #endif
    #if CPGAIN > 7 || CPGAIN < 0
    #error CPGAIN value is not valid! (CPGAIN range must be 0 to 7)
    #endif
    #if ANTIBACKLASH > 3 || ANTIBACKLASH < 0
    #error ANTIBACKLASH value is not valid! (ANTIBACKLASH range must be 0 to 3)
    #endif
    #if CORE > 3 || CORE < 0
    #error CORE value is not valid! (CORE range must be 0 to 3)
    #endif


    void Data_Out (void);
    void Delay_ms (unsigned char);

    unsigned char temp1, temp2, value, counter, massive[3];

    void main (void)
    {
    OPTION=0xC0;
    TRISGPIO=0x0;
    GPIO=0x0;

    //r_counter load and output
    massive[0] = ANTIBACKLASH^0x34;
    massive[1] = R_COUNTER>>6;
    massive[2] = R_COUNTER<<2^0x1;
    Data_Out ();

    //control load and output
    massive[0] = CPGAIN<<1^0x1; 
    massive[1] = POWER<<4^0xCD;
    massive[2] = CORE<<2^0x20;
    Data_Out ();

    Delay_ms (15);

    //n_counter load and output
    massive[0] = B_COUNTER>>8^0x20;
    massive[1] = B_COUNTER;
    massive[2] = A_COUNTER<<2^0x2;
    Data_Out ();

    SLEEP ();
    }


    // Data output
    void Data_Out ()
    {
    for (value=0; value<3; value++)
     {
        counter=8;
       while (counter>0)
       {
       SPI_CLOCK=0;
       SPI_DATA=massive[value]>>counter-1;
       Delay_ms (1);
       SPI_CLOCK=1;
       Delay_ms (1);
       counter--;
       }
     }
    SPI_CLOCK=0;
    SPI_DATA=0;
    Delay_ms (1);
    SPI_LE=1;
    Delay_ms (1);
    SPI_LE=0;
    }


    // Pause
    void Delay_ms (unsigned char temp1)
    {
       while (temp1>0)
        {
        temp2=0xff;
        while (temp2>0) {temp2--;}
        temp1--;
        }
    }


    chciałbym jescze zapytać - czym to najprościej przekompilować na HEX'a ?

    0
  • #4 21 Sie 2009 22:41
    adamwesola
    Poziom 24  

    Nie znam języka C, więc nie porównam obu programów, ale jak mi się wydaje nie jest on przeznaczony do AD9834, i kompilacja do hexa nic nie da, nie uruchomisz tym kodem AD8934.
    Natomiast doprecyzowałem swój program, ten powinien uruchomić AD8934, musisz tylko powstawiać poprawne (wg. noty aplikacyjnej) wartości tam, gdzie to zaznaczyłem.
    Nieco zmieniony program wstawiłem na miejsce poprzednio zamieszczonego.

    0
  • #5 24 Sie 2009 22:40
    mpx-fm
    Poziom 19  

    tak tak - zgadza się
    ten drugi ,który zapodałem- pisany pod PIC10F206
    przeznaczony do sterowania którąś z syntez PLL od Analog Devices

    0