HomeMade
Programowanie w języku C w środowisku AVR Studio4 - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Oprogramowanie (/forum-84.html)
+--- Dział: Technika programowania mikroprocesorów (/forum-85.html)
+--- Wątek: Programowanie w języku C w środowisku AVR Studio4 (/thread-1161.html)

Strony: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 15-02-2012 16:13

Dobra, skoro SQ6OXK nie ma czasu to ja zacznę wałkować temat syntezy DDS....
Zainteresowani tym tematem koniecznie muszą ściągnąć sobie pdf o AD9951, w google pełno tego.
Dam wam niedługo przepis na płytkę wraz ze spisem części... ale możeci zrobić obojętnie jaką znalezioną w internecie z układem AD9951 - ważne tak na prawdę aby była mozliwość podłaczenia wszystkich wyprowadzeń DDSa o których mowa niżej do naszej płyty ewaluacyjnej - a każda płytka ma taką możliwość Smile
Będziemy wysyłać do układu AD9951 instrukcje wykorzystując wyprowadzenia, po stronie DDS:
1. RESET
2. CS
3. SCLK
4. SDIO
5. I/O UPDATE
Zaznaczyłem je na poniższym rysunku dwoma kolorami - zielone są mało istotne:
- RESET można pominąć bo po włączeniu układu jest jakby po resecie - podanie przez chwile stanu wysokiego powoduje zresetowanie układu, a potem przez cały czas pracy ma być stan niski
- CS ( chip select - po polskiemu "wybór cipu" Smile ) - jeśli jest w stanie wysokim to układ olewa wszystko co mu próbujemy przekazać. CS można na stałe podłaczyć do masy jeżeli nie chcemy sterować dwiema lub więcej DDSami.
[attachment=4742]
I/O UPDATE to wyprowadzenie, które służy do tego aby wprowadzona przez nas zmiana częstotliwości przyniosła efekt. Jeżeli wyślemy rozkaz zmiany częstotliwości a nie wyślemy impulsu na to wyprowadzenie częstotliwość się nie zmieni.
SCLK to wyprowadzenie taktujące naszą szeregową szynę danych pomiędzy atmega i AD9951. W "rytm" zmian tego sygnału wysyłamy polecenia i dane do układu, poprzed wyprowadzenie SDIO, według przepisu podanego poniżej. Poniższy przykład obrazuje jak wysłać do AD9951 jeden bajt, który reprezentuje adres rejestru do którego chcemy zapisać dane, a po nim jeden bajt danych - czyli zawartość tego rejestru.
[attachment=4743]
Teraz opisze jak za pomoca dwóch kabli ( SDIO i SCLK ) wysłać jeden bajt...
Przypuśćmy że SCLK naszego DDSa będzie podłączone do wyprowadzenia B0, a SDIO podłączone jest do B1.
Chcemy wysłać bajt który jest wartością zmiennej bobo typu unsigned char (czyli ośmiobitowa bez znaku) ... będziemy wysyłać bit po bicie zmiennej bobo, począwszy od najstarszego bitu, skończywszy na najmłodszym. Acha, DDS "łyka" bit danych/instrukcji przy zboczu narastającym sygnały SCLK - czyli w momencie gdy stan na SCLK przechodzi z niskiego na wysoki.

Kod:
for(i=0; i<8; i+=1)     // pętla wykonująca polecenia w nawiasie klamrowym 8 razy - czyli tyle ile bitów ma bajt
{
   if(bobo&0b10000000)    // jeżeli najstarszy bit zmiennej bobo jest równy 1 to ..
   { PORTB = PORTB|0b00000010; }   // SDIO (PB1) będzie miał stan wysoki
   else         // w przeciwnym wypadku
   { PORTB = PORTB&(~0b00000010); }   // SDIO bęzie miał stan niski
   PORTB = PORTB|0b00000001;   // SCLK (PB0) przechodzi w stan wysoki - teraz DDS "zapamiętuje" jaki stan jest na SDIO
   PORTB = PORTB&(~0b00000001);  /// SCLK przechodzi w stan niski
   bobo = bobo << 1;      // bity zmiennej bobo przesuwane są o jedno miejsce w lewo czyli w stronę najstarszego bitu
}
Nie pamiętam czy opisywałem przesunięcie bitowe a więc opowiem o tym :
przypuśćmy że nasza zmienna bobo ma wartość
0b10001001, gdy poddamy ją przesunięciu jednobitowemu w lewo (czyli bobo = bobo << 1; to będzie miała wartość
0b00010010, znowu przesuwamy w lewo o jedno miejsce, i po tej operacji ma wartość
0b00100100, znowu ..
0b01001000, znowu ...
0b10010000, znowu ...
0b00100000, znowu ...
0b01000000, i ostatni raz ...
0b10000000. Zwróciliście pewnie uwagę, że przy przesuwaniu wartość uzupełnia się zerami (po prawej stronie zapisu)
Przesunięcie o dwa miejsca zapisujemy bobo = bobo << 2; i działa tak:
0b10001001 - wartość przed przesunięciem
0b00100100 - wartość po przesunięciu. Przesunięcie o 3, 4, itd ... chyba już będzie zrozumiałe.
Przy przesunięciu w prawo np. bobo = bobo >> 1; działa to analogicznie w przypadku zmiennych "unsigned" czyli bez znaku.
Jeżeli mamy do czynienia z typem zmiennej signed (ze znakiem) to przy przesuwaniu w prawo jej wartość uzupełnia się jedynkami (z lewej strony). Przeanalizujcie ten kod zerkając co i raz na rysunek z ilustracja przebiegu sygnałów CS SCLK SDIO, który wkleiłem w tym poście, wyżej (CS na razie nie ważny)
Studiując pdf o AD9951 zobaczycie tabelą z adresami rejestrów... najczęściej będziemy używać rejestru "Frequency Tuning Word", który jak widać w tej tabeli, ma adres o wartości 0x04 czyli 0b00000100 lub poprostu 4.
Zatem żeby zmienić częstotliwość trzeba najpierw wysłać bajt o wartości 0x04 do DDSa, który mówi za chwile będę przesyłać wartość częstotliwości. Po tym nastąpić powinno wysłanie 4 bajtów (czyli 32 bitów) zawierających "słowo z wartością częstotliwości" jaką chcemy wygenerować. Zatem typ zmiennej określającej częstotliwość musi być 32 bitowy bez znaku (bo ujemnych częstotliwości raczej nie będziemy wysyłać) czyli unsigned long int... to będzie ta zmienna z programu wyświetlającego częstotliwość, który już mamy zrobiony, czyli frequency
Teraz zajmiemy się problemem przesłania tego "słowa określającego częstotliwość". Będzie to kod bardzo podobny do tego, którym wysyłaliśmy bajt bobo do DDSa, dodam jednak sygnał I/O UPDATE który będzie w naszych rozważaniach podłączony do PB2.
Poczytajcie w pdf-ie o AD9951 jeśli chcecie znać szczegóły - mi brakuje teraz czasu na wszystkie wyjaśnienia, wkleję wam tylko rysunek z którego coś można zakumać. [attachment=4744]
Na razie kod bez sygnału I/O UPDATE
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)    // jeżeli najstarszy bit zmiennej frequency jest równy 1 to ..
   { PORTB = PORTB|0b00000010; }   // SDIO (PB1) będzie miał stan wysoki
   else         // w przeciwnym wypadku
   { PORTB = PORTB&(~0b00000010); }   // SDIO bęzie miał stan niski
   PORTB = PORTB|0b00000001;   // SCLK (PB0) przechodzi w stan wysoki - teraz DDS "zapamiętuje" jaki stan jest na SDIO
   PORTB = PORTB&(~0b00000001);  /// SCLK przechodzi w stan niski
   frequency = frequency << 1;      // bity zmiennej frequency przesuwane są o jedno miejsce w lewo
}
Teraz dodam sygnał I/O UPDATE...
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;    
}
Zapis tych 32 cyfr jest trochę kłopotliwy zatem w docelowym programie będzie zapis szesnastkowy czyli
if(frequency&0b10000000000000000000000000000000) zamienie na if(frequency&0x8000)
Czekam na pytania .... na następnej lekcji będzie inicjacja DDSa a po niej będzie program docelowy i już gotowy do tego by samemu zrobić syntezę DDS !!


RE: Programowanie w języku C w środowisku AVR Studio4 - SP3SWJ - 19-02-2012 17:02

(15-02-2012 16:13)SP4EJT napisał(a):  . .... na następnej lekcji będzie inicjacja DDSa a po niej będzie program docelowy i już gotowy do tego by samemu zrobić syntezę DDS !!


Po pierwsze gratulacje za zapał i pracę jaką w to wkładacie... to jest bardzo ważne - bo jak uda się wam zarazić procesorkami... dalej będzie z górki...


... ale należy pamietać wysterowanie DDSa to jeszcze nie jest napisanie "syntezy" - czyli potocznie zdanego VFO.

W takim programie 99% kodu to jest interfejs obsługi użytkownika - klawisze gałki enkodery, wyjścia LCD itp ,,, a pozostałe 1% to jest wysłanie danych sterujących do DDS

Nie chcę być natrętnym - ale zapewniam Was że używając BASCOM już byście dawno zrobili dużo więcej...

ot taki przykład - wysłanie danych z uC do DDSa w Bascom to dwie linijki używając wbudowanych komend BASCOM Shiftout ... i do tego jest dobry help ... a także help w naszym rodzimym języku


język C to potężny język - bardzo rozbudowany i mało przyjazny dla początkujących a języki z rodziny BASIC zostały stworzony by ludzie umiejący myśleć i wiedzieć co chcą zrobić - mogli to zrobić ŁATWO i SZYBKO :-) ...


... życząc powodzenia i nie utraty zapału !!! ... pozdrawiam sp3swj


RE: Programowanie w języku C w środowisku AVR Studio4 - SP3IQ - 19-02-2012 20:30

Cześć Jarku,
Myślę, że na pewno warto założyć i poprowadzić konkurencyjny wątek "Programowanie w języku Basic w środowisku Bascom". Jednocześnie w tym samym wątku trudno będzie prowadzić dwa języki programowania, język C i Basic. Można będzie wtedy dowiedzieć się, że to co jest wadą dla jednego, jest jednocześnie zaletą drugiego i odwrotnie. Ja w każdym razie w Basicu pisałem tylko "czasem" i tylko z "wielkiej konieczności" i nigdy nie czułem dużej satysfakcji (jako informatyk rzecz jasna). Język C istnieje od kilkudziesięciu lat (od 197? i jest zarazem całą historią Unixa i Linuxa) i jest uznawany jako język typowo narzędziowy, dla mikrokontrolerów jeden z podstawowych. Poza tym koszt zakupu Bascoma to kilkaset PLN, AVR4 łącznie z GCC (najlepszy kompilator C) jest całkowicie bezpłatny.
Uważam, że jeśli uczestnicy tego wątku mają zacięcie do języka C, to nie należy zniechęcać lecz kontynuować. Jeśli tylko z całej ekipy tylko kilku z nas będzie kontynuowała już samodzielnie naukę w języku C to będzie osiągnięty sukces. Jeśli ktoś z nas, z grubsza wszystko rozumie, to na pewno przyda się to w przyszłości i należy Marcinowi SP4EJT podziękować za pomysł i upór. Ale jeśli ktoś z nas będzie potrzebować umiejętności programowania "tylko tak z grubsza" to Basic będzie raczej wystarczający lub nawet "aż nadto wystarczający".
73 Bogdan, SP3IQ.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP3SWJ - 19-02-2012 20:41

(19-02-2012 20:30)SP3IQ napisał(a):  ..... Język C istnieje od kilkudziesięciu lat (od 197? i jest zarazem całą historią Unixa i Linuxa) i jest uznawany jako język typowo narzędziowy, dla mikrokontrolerów jeden z podstawowych. ....
przecież pisałem IN-PLUS że jestem pełen podziwu... ale z pewnego doświadczenia boję się by koledzy się nie zniechęcili... :-(

Jeśli tylko bym miał czas - z chęcią bym poprowadził podobny wątek - konkurencyjny - ale brak czasu... :-(

dla unixowców C jest naturalny.... ale.... ale dla majsterkowiczów liczy sie szybki efekt i klarowność i prostota...

a wracając do histori.... jeśli już datę przytoczyłeś...

BASIC (Beginner's All-purpose Symbolic Instruction Code) - język programowania wysokiego poziomu, opracowany w 1964 przez Johna George'a Kemeny'ego i Thomasa E. Kurtza w Dartmouth College w oparciu o Fortran i Algol-60. Jego pierwsza wersja znana była później pod nazwą Dartmouth BASIC, pierwszy program w BASIC-u został uruchomiony 1 maja 1964 na komputerze General Electric GE-225 typu mainframe[1].


Wracając do samego PROGRAMOWANIA.... trzeba nauczyć siępisac dobry interfejs użytkownika .... i nie ważnie w jakim języku - dobry interfejs to cięższa sprawa i bardzo ważna...

Trzeba by znaleźć dobry fajny projekt w C działającego urządzenia dobrze okomentowany i na nim się nauczyć.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP3IQ - 19-02-2012 21:22

Uważam, że należy pozwolić Marcinowi realizować jego autorski pomysł. Efekt, który podałeś, że w Bascom napisanie Menu to sprawa kilku wierszu kodu źródłowego, to w zasadzie w języku C jest tak samo, pod warunkiem, że korzysta się z bardzo łatwo dostępnej i zarazem bardzo fajnej biblioteki. Na razie Marcin nie podjął problemu bibliotek i bardzo dobrze, że nie podjął (temat byłby wtedy mało czytelny i zbyt długi do zrealizowania). Na razie Marcin SP4EJT zasygnalizował podstawy języka C (instalacja narzędzi, typy danych, podstaowe operatory, podstawowe instrukcje sterujące). Tak więc uważam, ze warto wpierw poznać podstawy oraz meritum sprawy (to co teraz właśnie robimy). Natomiast sprawa interfejsu użytkownika oraz realizacja różnych funkcji potrzebnych dla DDS (pamięci QRG pasm, zamiana QRG, RIT dla Rx i Tx, zmiana emisji, itp) można zrealizować później. Jak tylko Marcin skończy swoje dzieło, jestem gotów do kontynuacji tematu (jeśli tylko będą chętni). Dobrze by było wykonać kilka projektów typowo "krótkofalarskich" od A do Z. Natomiast tematy takie jak pomiar temperatury, zegarek, częstościomierz i inne są dostępne w sieci. Mimo, że też nie za bardzo mam czas, ale jeśli na takie tematy będą chętni to jestem gotów do realizacji.
73 Bogdan, SP3IQ.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 19-02-2012 22:02

(19-02-2012 20:41)SP3SWJ napisał(a):  Jeśli tylko bym miał czas - z chęcią bym poprowadził podobny wątek - konkurencyjny - ale brak czasu... :-(
Cool wszyscy wiemy że nikt nie ma czasu, ja też nie mam Smile
Ale dla chcącego nic trudnego poświęcić np. godzinkę snu Tongue
... przydałby się wątek Bascoma - właśnie dla tych co chcą szybko osiągnąć cel.

Teraz najważniejsza sprawa: nie ważne czy uczymy się języka prostego czy skomplikowanego ... ważne byśmy mieli nauczyciela !
Jeśli nikt tych nieprzekonanych ludzi nie chce uczyć to inaczej się nie podejmą nauki bo droga w samotności bywa długa i kręta . Myślę że to jest odpowiedź dlaczego nie podjęli nauki BASCOMA.
Sam potrzebowałem pomocy i siegałem do internetu niestety opracowania na które trafiałem początkowo, były jakieś "za trudne" - po prostu nie tłumaczyły "od początku" tylko od "pewngo stopnia zaawansowania" ... niewysokiego stopnia ale jednak zbyt dużego dla kompletnego laika w dziedzinie mikrokontrolerów i programowania. Długo trzeba błądzić by trafić na strony, które dadzą nam odpowiedzi.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 19-02-2012 23:20

Jadymy dalej... skopiowałem kod z posta #117 i troche go dostosowałem do naszych potrzeb - zrobiłem z niego osobną funkcję która wysyła bajt do DDSa. Usunąłem też komentarze z kodu, żeby nie "zaśmiecały"
Kod:
void bajt_DDS(unsigned char bobo)
{
   for(i=0; i<8; i+=1)
   {
      if(bobo&0b10000000)
      { PORTB = PORTB|0b00000010; }
      else
      { PORTB = PORTB&(~0b00000010); }
      PORTB = PORTB|0b00000001;
      PORTB = PORTB&(~0b00000001);
      bobo = bobo << 1;
   }
}
Przypuścmy że wlutowaliśmy w płytkę DDSa generator kwarcowy 100MHz i chcemy żeby DDS chodził na częstotliwości nominalnej czyli 400MHz.
Aby zainicjować naszego DDSa musimy po podaniu napięcia/zresetowaniu
wysłać do niego 4 bajty:
1. 0b00000001
2. 0b00000000
3. 0b00000000
4. 0b00100100
Czynimy to za pomocą naszej funkcji bajt_DDS(tu_wpisujemy_wartość_bajtu)
Czyli w program trzebaby wpisać:
Kod:
bajt_DDS(0b00000001);
bajt_DDS(0b00000000);
bajt_DDS(0b00000000);
bajt_DDS(0b00100100);
KONIEC inicjacji !!
Najważniejsza z tego sprawa to czwarty bajt ... ustawia się nim mi ędzy innymi mnożnik dla taktowania DDSa. 5 najstarszych bitów tego bajtu za to odpowiada
czyli 0b00100100
Jeśli chcecie przetaktować na 500 MHz - mając generator 100MHz mnoznik musi być 5x - będzie to wyglądać tak: bajt_DDS(0b00100100);
Jesli zaś nie dysponujecie generatorem 100MHz, a posiadacie 50MHz lub 40 lub inny jakiś to tez da radę. Dla 50MHz trzeba ustawić mnożnik 8x bo 8x50=400MHz czyli bajt_DDS(0b01000100);
Dla generatora 40MHz trzeba ustawić mnożnik 10x czyli bajt_DDS(0b01010100);
Jutro dalsza część a mianowicie sklejanie obsługi DDSa do kupy a potem dodanie konfiguracji aby możnabyło wykorzystać dowolny PORT atmegi do sterowania DDSem wedle naszych potrzeb.


RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 22-02-2012 23:10

"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 Smile
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:[attachment=4802]
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:[attachment=4801]
A cały program macie gotowy poniżej:[attachment=4803]

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/radio-related/AD9951_DDS/DDSAdaptor.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 Smile powstał w dziwnych okolicznosciach :[attachment=4804]

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: [attachment=4806]

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 Smile ja o tym wszystkim nie pisałem bo już jest napisane a poza tym ten wątek miałby już setki stron Tongue :
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


RE: Programowanie w języku C w środowisku AVR Studio4 - SP5FCS - 26-02-2012 2:13

Marcin, nie jestem ekspertem od GCC-AVR ale zastanawia mnie jakim cudem podczas mnożenia dwóch liczb 4 bajtowych (long int) chcesz zmieścić wynik na 4 bajtach.

Kod:
unsigned long int FTW, fs;   // deklaracja zmiennej FTW i zmiennej fs
fs=400000000;         // fs to częstotliwość taktowania DDSa
...
...
FTW=4294967296*frequency/fs;

Kompilator języka C w wielu przypadkach uważa że programista wie co robi dlatego pozwala na większą swobodę niż w innych językach. Tak jak pisałem wcześniej składnia tego języka jest dosyć trudna i wymaga dużej dyscypliny.

Zastanawiam się czemu do komunikacji z układem DDS-a nie wykorzystujesz sprzętowego interfejsu SPI który jest na pokładzie ATmega32 ?


RE: Programowanie w języku C w środowisku AVR Studio4 - JaHo - 26-02-2012 12:10

2UL * 2UL = 4UL
Wniosek => wynik mnożenia dwu liczb "unsigned long" może się zmieścić w "unsigned long".

Warto pamiętać żeby zawsze dodawać przyrostek "UL" (albo "ul", "LU", "lu") do stałych "unsigned long".

Problem dużo poważniejszy to ... 4294967296 ... ta wartość wymaga 33 bitów, więc na pewno nie zmieści się w "unsigned long".
Kompilator powinien się wściec (zgłosić błąd) ... jeśli tego nie zrobił to nie wiadomo jaką stałą wstawił w to równanie.
Max. wartość która zmieści się w "unsigned long" to 4294967295UL ... czyli 0xFFFFFFFFUL