logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AD9834 Atmega 8 C. DDS Mimo wielu prób nie generuje.

Lech24 05 Wrz 2010 11:34 2477 2
  • #1 8477396
    Lech24
    Poziom 13  
    Witam.
    Napisałem programu do sterowania dds'a ad9834. Program oparłem na sprawdzonej już metodzie stosowanej przeze mnie do podobnego układu niestety mimo wielu prób nie udało mi się z nim dogadać. Obecna wersja programu do wysłania słowa danych. Wysyła on dane od LSB a więc na odwrót ale to w podawaniu danych uwzględniałem. Nie próbowałem wysyłać danych od drugiej strony aby puki co nie komplikować. Dokumentacja techniczna do tego układu jest dla mnie nie bardzo przejrzysta i nie jestem pewien jakie dane muszę konkretnie wysłać żeby go wystartować. Zależy mi wyłącznie na zadaniu jednorazowo jednej częstotliwości. Hardware jest raczej pewny, sprawdzany kilka razy. W programie napisanym jest zawarte wysłanie tylko jednego słowa. Próbowałem wysyłać kolejno Dane konfiguracyjne, Dane częstotliwości, dane fazy jednak to nie przyniosło skutku. DDS Device Configuration Assistance
    http://designtools.analog.com/dt/ad98334/ad9834.html

    generuje mi dane niebagatelnej długości 128 bitów mimo próby wysłania tych danych i tak nie przyniosło skutku. Jak ktoś z forumowiczów spotkał się z tym generatorem proszę o podpowiedz co robię źle ewentualne błędy w programie. Słyszałem że ten dds jest kłopotliwym układem ale nie spodziewałem się że aż tak. Poniżej zamieszczam swój program. pozdrawiam.

    
    #include <stdlib.h>
    #include <avr/io.h>
    #include "lcd.h"
    
    #define Gen_SCLK_DIR DDRC
    #define Gen_SCLK_PORT PORTC
    #define Gen_SCLK (1 << PC5)
    #define Gen_SCLK_PIN PINC
    
    #define Gen_FSYNC_DIR DDC
    #define Gen_FSYNC_PORT PORTC
    #define Gen_FSYNC (1 << PC4)
    #define Gen_FSYNC_PIN PINC
    
    #define Gen_SDATA_DIR DDRC
    #define Gen_SDATA_PORT PORTC
    #define Gen_SDATA (1 << PC3)
    #define Gen_SDATA_PIN PINC
    
    int k;
    
    void delay(unsigned int del)
    {
    unsigned int i;
    unsigned int j;
    for(i=0;i<del;i++)
    {
    for(j=0;j<del;j++)
    {
    i=i;
    }
    }
    }
    
    void send_freq(unsigned long int f)
    {
    DDRC=0xff;
    
    Gen_SCLK_PORT &=~Gen_SCLK;
    Gen_FSYNC_PORT |=Gen_FSYNC;
    delay(2);
    Gen_SCLK_PORT |=Gen_SCLK;
    delay(2);
    Gen_FSYNC_PORT &=~Gen_FSYNC;
    k=0;
    delay(2);
    int i;
    for(i=0;i<16;i++)
    {
    if(f&0x0001)
    {
    Gen_SDATA_PORT |=Gen_SDATA;
    }
    else
    {
    Gen_SDATA_PORT &=~Gen_SDATA;
    }
    f=f>>1;
    
    Gen_SCLK_PORT &=~Gen_SCLK;
    delay(2);
    Gen_SCLK_PORT |=Gen_SCLK;
    delay(2);
    }
    
    Gen_FSYNC_PORT |=Gen_FSYNC;
    delay(2);
    }
    
    
    int main(void)
    {
    
    delay(1000);
    delay(1000);
    send_freq(0b0000000000000000);
    }
    
    
  • Pomocny post
    #2 8485632
    andrzej.okrajek
    Poziom 11  
    Ja go rozgryzłem już z rok temu. sterowanie jest banalne. niestty pisałem program w Bascomie i ma sie on troszkę nijak do powyższego ale problem w dogan
    dywaniu się z tym układem polega na tym że on komendty przyjmuje tylko pod resetem tj. reset. komendy. zdjać reset. o ile dobrze pamiętam ale wszystko jest w manualu dokładnie opisane. w załączniku programik jaki ja napisałem do komunikacji z układem i do ręcznej zmiany ustawień. fajne jest to że wszystkie prawie z tych układów przyjmują ta samą składnie rozkazów szeregowych. a poza tym w manualu jest opisane jakie stany powinny być nieużywanych nóżek układu. z głowy nie powiem ale mogą one generować niepotrzebne problemy w programowaniu układu.
  • #3 8486927
    Lech24
    Poziom 13  
    Problem rozgryzłem polegał na błędach wynikających z zastosowanego przeze mnie polecenia delay z nieznanych mi przyczyn nie działał tzn nie powodował żadnego opóźnienia. Zastosowałem procedurę zawartą w winavr. Reszta programu jest poprawna wystarczy wysłać po kolei wszystko co generuje dds configurator tzn te 128 w paczkach po 16 bitów(program umieszczony wyżej wysyła bajty od tyłu więc dodałem dodatkową funkcję przekręcającą). Mimo to dziękuję za próbę pomocy pozdrawiam.

    Poniżej gotowy sprawdzony kod.
    #include <stdlib.h>
    #include <avr/io.h>
    #include "lcd.h"
    #include <avr/delay.h>
    
    #define Gen_SCLK_DIR		    DDRC
    #define Gen_SCLK_PORT 	    PORTC
    #define Gen_SCLK			    (1 << PC5)
    #define Gen_SCLK_PIN		    PINC
    
    #define Gen_FSYNC_DIR		    DDRC
    #define Gen_FSYNC_PORT 	    PORTC
    #define Gen_FSYNC			    (1 << PC4)
    #define Gen_FSYNC_PIN		    PINC
    
    #define Gen_SDATA_DIR		    DDRC
    #define Gen_SDATA_PORT 	    PORTC
    #define Gen_SDATA			    (1 << PC0)
    #define Gen_SDATA_PIN		    PINC
    
    
    
    
    void send_freq(unsigned long int f)
    	{
    	DDRC=0xff;
    	
    
    	Gen_SCLK_PORT |=Gen_SCLK;
    		_delay_ms(1);
    	Gen_FSYNC_PORT &=~Gen_FSYNC;
    	_delay_ms(1);
    	int i;
    	for(i=0;i<16;i++)
    		{
    		if(f&0x0001)
    			//if(1)
    				{   
    					//PORTB=0xff;
    					Gen_SDATA_PORT |=Gen_SDATA;
    					lcd_puts("1");
    				}
    			else
    				{
    					Gen_SDATA_PORT &=~Gen_SDATA;
    					lcd_puts("0");
    				}
    		f=f>>1;
    
    		Gen_SCLK_PORT &=~Gen_SCLK;
    		_delay_ms(1);
    		Gen_SCLK_PORT |=Gen_SCLK;
    		_delay_ms(1);
    		}
    	
    	Gen_FSYNC_PORT |=Gen_FSYNC;
    	_delay_ms(1);
    	}
    	
    
    int przelicz (int liczba)
    {
    int wynik;
    int k;
    for(k=0;k<16;k++)
    	{
    	wynik = wynik<<1;
    	if (liczba & 0x0001)
    		{
      		wynik |= (1<<0);
    //		lcd_puts("h");
    		}
    	else
    		{
    	    wynik &=~(1<<0);
    	//	lcd_puts("m");
    		}
    
    	liczba = liczba>>1;
    	}
    	return wynik;
    }
    
    int main(void)
    {
    
    
    DDRC = 0xff;
    
    
    	Gen_SCLK_PORT &=~Gen_SCLK;
    	Gen_FSYNC_PORT |=Gen_FSYNC;
    	_delay_ms(10);
    
    
    char buffer[5];
    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
    /*
    int lic1 = 0x0002;
    int lic2 = przelicz (lic1);
    
    lcd_gotoxy(0,0);
    
    lcd_puts("1 ");
    itoa( lic1 , buffer, 10);
    lcd_puts(buffer); 
    
    lcd_gotoxy(0,1);
    
    lcd_puts("2 ");
    itoa( lic2 , buffer, 10);
    lcd_puts(buffer);
    */
    
    _delay_ms(100);
    /*send_freq(przelicz (0b0010000000000000));
    					
    send_freq(przelicz (0b0100000000000000));
    send_freq(przelicz (0b0111111111111111));
    send_freq(przelicz (0b0000000000000000));
    
    
    delay(100);
    */
    
    send_freq(przelicz (0x2100));
    send_freq(przelicz (0x6b85));
    send_freq(przelicz (0x4147));
    send_freq(przelicz (0xab85));
    send_freq(przelicz (0x8147));
    send_freq(przelicz (0xc000));
    send_freq(przelicz (0xe000));
    send_freq(przelicz (0x2000));
    }
    
REKLAMA