Dla tych którzy nie wiedzą jak działa enkoder ( są tacy ? ;P ) ... wklejam tajemnicę obsługi ENKODERA ... dla ścisłości: "tego co przy pokręcaniu gałką produkuje dwa przebiegi prostokątne przesunięte w fazie o 90 stopni".
W tym celu muszę posłużyć się obrazkiem ściągniętym z sieci
1. przy pokręcaniu osią enkodera wytwarzają się sygnały takie jak opisałem wcześniej i które są widoczne na obrazkach. Pojawiają się one oczywiście na wyprowadzeniach enkodera.
2. Jedno wyprowadzenie enkodera, powiedzmy że A, podłączamy pod INT0/PD2 Atmegi. To Atmegowe wyprowadzenie jest tak ustawione aby wykrywać narastające zbocze sygnału A.
3. Jeśli takie się pojawi to uruchamia się programik przerwania 0 ( INT0 )
4. Programik ten sprawdza jaki występuje stan na wejściu PB0 ... w momencie wystąpienia wspomnianego wcześniej zbocza narastającego na wejściu INT0.
5. Jeśli stan na PB0 jest niski to enkoder kręcisz w kierunku X a jeśli kręcisz w drugą stronę to stan PB0 jest (w momencie wystąpienia przerwania) na pewno wysoki ... jeśli nie kumasz jeszcze przeanalizuj rysunki.
Na dole załączony gotowiec - program naszej nieszczęsnej syntezy ( Doszły nowe pliki: enkoder.c i .h )
Ci co go uruchomią zauważą zapewne, jak wolno odświerza się wyświetlacz i częstotliwość wysyłana do układu DDS. jest za to odpowiedzialna pętla delay na końcu programu, która przy używaniu przycisków była sensowna a teraz nam przeszkadza, usuńcie ją i zobaczycie jak śmiga wtedy.
Kod:
LCD_PORT &= (~1<<LCD_RS);
bajt_lcd(0x85);
wys_freq(frequency);
LCD_PORT &= (~1<<LCD_RS);
bajt_lcd(kursor);
_delay_ms(200); // wywal tą pętlę jeśli stosujesz enkoder aby odswierzanie było szybsze
}
}
Jeśli wywaliliście tę pętlę to napewno zauważycie jak kłopotliwe jest teraz korzystanie z przycisków
Jak temu zaradzić ? Może ktoś pomyśli i zapoda nam rozwiązanie, które jest bardzo proste zresztą. Dodam to zdanie choć nie wiem czy jest sens: "Jak zwykle czekam na pytania."
Jeszcze jedna sprawa ... chcę uświadomić Was, że
macie tu wszystko co jest niezbędne i zarazem najtrudniejsze do ogarnięcia (chyba) na drodze do tego aby napisać własny program syntezy na AD9951. Przy minimum wysiłku możecie sobie odjąć lub dodać częstotliwość przemiany pośredniej, jeśli macie radio z pośrednią lub pomnożyć częstotliwość przez 4 jeśli chcecie zastosować ją w homodynie. Wstęp do obsługi pamięci po I2C macie, ja co prawda zrobiłem tylko 10 kanałów bo to lekcje ale możecie zrobić 50... 100 ... 2000, zależy od pojemności pamięci. Sygnały sterujące do płytki BPF to też prosta sprawa. Ustawianie częstotliwości pilotów itp... to tylko kwestia czasu, który musicie na to poświęcić.
Powodzenia.
Na jakiś czas rzucam tę robotę ... chcę pobawić się moim wyświetlaczem 480x272 (4 cale) i zrobić z niego i Xmegi wobuloskop ... Myślę że katowanie dalej kwestii syntezy jest słabym pomysłem ... chyba że stwierdzicie inaczej....
post w trakcie pisania ...
Czas na odrobinkę somokrytyki ... na poprawienie błędów raczej istotnych ...
1. pisanie w każdym pliku źródłowym ( czyli .c )
Kod:
#ifndef F_CPU
#define F_CPU 16000000
#endif
Jest to raczej głupie z mojej strony bo jak się okazuje można wpisać wartość w kratce Frequency w ustawieniach programu ( lub dopisać do pliku makefile "-DF_CPU 16000000UL" ) ... raz ... dla wszystkich plików użytych w projekcie ... czyli nie trzeba powtarzać tego jak mantrę w każdym pliku - mój błąd
... ale wybaczcie mi bo programuję tylko trochę ponad rok i dokopałem się do tej wiedzy dopiero teraz.