Witam po dłuuuugiej przerwie ... pozwolę sobie zacytować wiadomość prywatną od Andrzeja SP3GTG (za jego wcześniejszym pozwoleniem)
Cytat:Cześć Marcin Mam nadzieję, iż będziesz kontynuował temat syntezy na AD9951.
Zaliczyłem dotychczasowe lekcje i wszystko do ostatniej zawsze działało mi bez problemu. Nie chwaliłem się tym na forum bo brak mi czasu na zbędną pisaninę.
Twój sposób nauki "C" jest w/g mnie bardzo dobry i zrozumiały, a każdy kto CHCE
dużo się nauczy. Pozdrawiam Andrzej sp3gtg
Dobrze, że ktoś w końcu napisał .... Jeśli ktoś był trochę na mnie zły że zniknąłem z tego tematu to tylko jego wina. Dwukrotnie zadawałem pytania co dalej mam wałkować czy syntezę czy coś innego - ale pozostało to bez echa, więc czułem się tu niepotrzebny. Teraz wiem, że dalsza część kursu będzie dla Andrzeja i pewnie Janka, który pokazał swoja aktywność
To tyle w kwestii wytłumaczenia się ...
Znany wszystkim nam Adam
ileś postów wcześniej podpowiedział mi fajne rozwiązanie wysyłania 32bitowego FTW do DDSa przez port SPI - zyskamy na prędkości naszej syntezy.
Na razie nie będę zajmował was portem SPI - zrobię to za jakiś czas. Teraz powiem/pokażę Wam jak działa unia.
Nasza unia będzie łączyła w sobie dwie zmienne: zmienną 32-bitową oraz tablicę 8-bitowych wartości o wielkości 4 elementów.
Kod:
union
{
unsigned long int u32;
unsigned char u8[4];
}
FTW;
przypominam, że ENTERY możemy zastąpić spacją jeśli ktoś chce oszczędzać miejsce na ekranie
Kod:
union { unsigned long int u32; unsigned char u8[4]; } FTW;
taka deklaracja powoduje że możemy używać zmiennej FTW.u32 która jest równoznaczna z tablicą która składa się z 4 elementów: FTW.u8[0], FTW.u8[1], FTW.u8[2], FTW.u8[3].
utwórzcie sobie nowy projekt ( przymusowa powtórka materiału
) oczywiście w języku C. W utworzony projekt wklejcie sobie kod:
Kod:
int main(void)
{
union { unsigned long int u32; unsigned char u8[4]; } FTW;
FTW.u32=0xafafafaf;
FTW.u8[0]= 0xaa;
FTW.u8[1]= 0xbb;
FTW.u8[2]= 0xcc;
FTW.u8[3]= 0xdd;
}
W opcjach kompilatora ustawcie zerowy stopień optymalizacji - tylko dla naszych eksperymetów, na razie w to nie wnikamy.
teraz skompilujcie i uruchomcie debugowanie
Jeśli nie widzicie okna MEMORY to włączie je
Okno memory ustawcie na DATA i przewińcie paskiem do samego dołu, Wciskajcie pojedynczo klawisz F11 i obserwujcie co sie dzieje w miejscu gdzie na rysunku jest AF AF AF AF czerwoną czcionką.
Widać że Zmienna FTW.u32 zmienia 4 bajty pamięci, a zmienna FTW.u8[x] po jednym bajcie wybranym przez index tablicy "x".
W programie naszej syntezy wykorzystamy to tak:
1. Obliczymy FTW tak jak do tej pory lecz zmienna FTW zostanie zastąpiona zmienną FTW.u32
2. Nie będziemy wysyłać, jak do tej pory, całego FTW lecz bajt po bajcie wykorzystując 4 bajty tablicy FTW.u8[x] (gdzie x to index elementu tablicy) narazie poprzez funkcję
bajt_DDS(unsigned char bobo), którą mamy w pliku obsługi AD9951.
Funkcję
ftw_DDS(unsigned long int FTW) usuniemy bo przy zastosowaniu unii nie będzie potrzebna.
Zmieniony w ten sposób program dam wam później bo właśnie kończy się mój czas. Wezmę ostatni umieszczony przeze mnie gotowiec (ten z postu #118, plik nowy.zip) i go zmienię, zmiany będą "okomentowane" aby było wyraźnie je widać.
Jeśli ktoś nie rozumie co się dzieje z tą unią to śmiało piszcie - zrobie jeszcze bardziej obrazowe wyjaśnienie. Do potem
Acha... te okno MEMORY to podgląd wewnętrznej pamięci RAM Atmegi (symulacja oczywiście), dzięki temu szczegółowo możemy znać poczynania naszej Atmegi. Zainteresujcie się debugowaniem bo warto - sam poznałem to około miesiąc temu.