Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie w języku C w środowisku AVR Studio4
SP3IQ Offline
Bogdan
*

Liczba postów: 22
Dołączył: 23-10-2011
Post: #121
RE: Programowanie w języku C w środowisku AVR Studio4
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.
19-02-2012 21:22
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
***

Liczba postów: 123
Dołączył: 06-05-2011
Post: #122
RE: Programowanie w języku C w środowisku AVR Studio4
(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.
(Ten post był ostatnio modyfikowany: 19-02-2012 22:31 przez SP4EJT.)
19-02-2012 22:02
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ4AVS Offline
Rafał
****

Liczba postów: 403
Dołączył: 29-01-2010
Post: #123
RE: Programowanie w języku C w środowisku AVR Studio4
Z tą dobrocią avr gcc to się zgodzić nie mogę lepsze są kompilatory komercyjne ale niestety płatne.
19-02-2012 23:08
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
***

Liczba postów: 123
Dołączył: 06-05-2011
Post: #124
RE: Programowanie w języku C w środowisku AVR Studio4
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.
(Ten post był ostatnio modyfikowany: 19-02-2012 23:20 przez SP4EJT.)
19-02-2012 23:20
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
***

Liczba postów: 123
Dołączył: 06-05-2011
Post: #125
RE: Programowanie w języku C w środowisku AVR Studio4
"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:
.zip  AD9951-BEZ-KONF.zip (Rozmiar: 802 bajtów / Pobrań: 5)
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:
.zip  AD9951.zip (Rozmiar: 1.17 KB / Pobrań: 3)
A cały program macie gotowy poniżej:
.zip  nowy.zip (Rozmiar: 52.93 KB / Pobrań: 3)

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 Smile powstał w dziwnych okolicznosciach :
.zip  moduł-AD9951-jedna-masa.zip (Rozmiar: 49.52 KB / Pobrań: 2)

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:
.zip  Wideo0107_001.zip (Rozmiar: 2.05 MB / Pobrań: 1)

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
(Ten post był ostatnio modyfikowany: Wczoraj 23:42 przez SP4EJT.)
Wczoraj 23:10
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości