"Jutro" przerodziło się w "za tydzień" za co przepraszam. Już nadrabiam zaległości ...
UWAGA ! Naprawiam swój błąd ! Napisałem Wam wcześniej tę funkcję
Kod:
for(i=0; i<32; i+=1) // pętla wykonująca polecenia 32 razy - czyli tyle ile bitów ma "słowo częstotliwości"
{
if(frequency&0b10000000000000000000000000000000)
{ PORTB = PORTB|0b00000010; }
else
{ PORTB = PORTB&(~0b00000010); }
PORTB = PORTB|0b00000001;
PORTB = PORTB&(~0b00000001);
if(i==15) { PORTB = PORTB&(~0b00000100); } // I/O UPDATE w stan niski
if(i==31) { PORTB = PORTB|0b00000100; } // I/O UPDATE w stan wysoki
frequency = frequency << 1;
}
która wysyła wartość częstotliwości do DDSa, ale tak naprawdę trzeba do układu syntezy wysłać wyrażenie FTW (jest o nim mowa w pdf-ie od AD9951) - zatem funkcja jest ok tylko należy wywalić z niej zmienną frequency i wstawić FTW, wszystko wyjaśni się niżej...
Musze opisać co trzeba zrobić aby DDS zaczął wytwarzać pożądaną częstotliwość - taki prosty algorytm:
Jeśli dopiero włączyliśmy układ musimy zainicjować DDS, po zmianie częstotliwości poprzez naciskanie guzików, program ma obliczyć wyrażenie FTW, które trzeba wysłać do DDSa. KONIEC
FTW to 32-bitowe słowo ustawiające częstotliwość. Jest ono zależne od częstotliwości taktowania naszego DDSa oraz częstotliwości przez nas żądanej czyli tej jaką ma wytworzyć AD9951.
FTW= częstotliwość * 4294967296 / zegar_DDSa - taki zapis będziemy wykorzystywać w programie.
należy więc dodać do naszego programu trzy linijki:
Kod:
unsigned long int FTW, fs; // deklaracja zmiennej FTW i zmiennej fs
fs=400000000; // fs to częstotliwość taktowania DDSa
...
...
FTW=4294967296*frequency/fs;
Ostatnia linijka musi być wstawiona w kod programu po obliczeniu nowej wartości częstotliwości.
Zrobię Wam gotowca a wy sobie zobaczcie gdzie to się znalazło.
Więc mamy obliczone FTW i teraz wystarczyłoby wysłać FTW do DDSa żeby wytwarzał chcianą częstotliwość.
tak na tym etapie wyglądałby plik obsługi DDS jakim jest układ AD9951:
AD9951-BEZ-KONF.zip (Rozmiar: 802 bajtów / Pobrań: 1061)
ale ... działa to narazie na porcie B - a my może nie chcemy na porcie B tylko na innym porcie, należy zatem dodać konfigurację i plik będzie wyglądał wtedy tak:
AD9951.zip (Rozmiar: 1.17 KB / Pobrań: 832)
A cały program macie gotowy poniżej:
nowy.zip (Rozmiar: 52.93 KB / Pobrań: 886)
EDIT: 1. Układ funkcjonuje z umasionym wyprowadzeniem CS układu AD9951. Odkryłem że RESET nie może być umasiony na stałe bo impuls RESET jest konieczny do uruchomienia układu. Więc na chwilkę będzie trzeba zapodać stan wysoki na wypr. RESET a potem cały czas ma być niski - kod poniżej - wstawiłem go do funkcji inicjującej DDSa
Kod:
DDS_PORT = DDS_PORT | (1<<DDS_RESET);
_delay_ms(10);
DDS_PORT = DDS_PORT & ~(1<<DDS_RESET);
_delay_ms(10);
no i zapomniałem o określieniu wyprowadzeń portu który ma obsługiwać DDSa jako wyjścia czyli:
Kod:
#define DDR_DDS DDRC // część konfiguracyjna
DDR_DDS = (1<<DDS_UPDATE)|(1<<DDS_SDIO)|(1<<DDS_SCLK)|(1<<DDS_RESET); // to wstawię również do funkcji inicjującej DDS
Projekty płytek dostępne pod linkami (wybierzcie jeden i zróbcie sobie moduł z układem AD9951):
http://sp-hm.pl/thread-144-post-8775.html#pid8775
http://www.haukolor.de/projekte-neu/dds/ad9951
http://www.dl4jal.eu/avfo/avfo.html
http://myweb.tiscali.co.uk/radiokits/rad...daptor.htm
lub mój projekt - pliki dla programu eagle + plik partlist.txt aby wiedzieć co trzeba zakupić. Nie krytykujcie mnie za schemat bo wiem że jest nieczytelny
powstał w dziwnych okolicznosciach :
moduł-AD9951-jedna-masa.zip (Rozmiar: 49.52 KB / Pobrań: 837)
Program został sprawdzony - DZIAŁA ! - Nie zapomnijcie skonfigurować portów według swoich połaczeń i mnożnika częstotliwości taktowania DDSa oraz zmiennej fs czyli częstotliwości taktowania - w programie są moje ustawienia
Na dowód że działa filmik:
Wideo0107_001.zip (Rozmiar: 2.05 MB / Pobrań: 884)
Teraz pytanie do WAS :
Czy ulepszamy program syntezy częstotliwości aby miał ładne wyświetlanie i niezbędne do działania radia bajerki ... ?
Czy robimy inny projekt, np. obsługa pamięci EEprom lub przetwornika Analogowo-cyfrowego, który jest w Atmedze - można na nim zrobić prosty voltomierz np. napięcia akumulatora. Albo coś innego co napiszecie a ja będę w stanie ogarnąć swym umysłem.
Na koniec linki które polecam przeczytać - dużo wniosą do Waszego życia
ja o tym wszystkim nie pisałem bo już jest napisane a poza tym ten wątek miałby już setki stron
:
http://hobby.abxyz.bplaced.net/index.php?pid=4&cid=1 - tu o programowaniu w C - polecam tę stronę
http://atmega32.republika.pl/ - o mikrokontrolerze Atmega32