Wpis z mikrobloga

Ma ktoś pomysł dlaczego mi się to wykrzacza? Wywołuję sobię funkcję w pętli for z wartościami od 10 do 2000Hz, i gdzies przy końcu tego zakresu zmienna wysyłana do AD9850 zostaje jakby zmniejszona. Obserwując u mnie wygląda to tak, że na głośniku słyszę coraz wyższe tony, i nagle się zmniejszają i od nowa rosną.(debug za pomocą głośnika, tego jeszcze ine grali :))

http://pastebin.com/K2bhKnxv

#avr #programowanie #dds
  • 9
@miszczo997: dobra całego kodu nie przeczytałem ;)

uint32*t freq = (uint32*t)((frequency * 4294967295ULL)/125000000ULL);


a tutaj czasami nie nastepuje przepelnienie? bo taki objaw, ze ci spada z wysokich hz do niskich to pierwsze co mi na mysl przychodzi to wlasnie przepelnienie
@zenkowik: z przyzwyczajenia wpisałem ms zamiast us, już to zauważyłem, jednak w przypadku samej transmisji nie ma to żadnego znaczenia, ot po prostu będzie się wolniej wysyłać. Problem leży gdzieś w funkcji, gdzie operuje na przesunięciach bitowych. Spróbuję podzielić zmienną sterującą na kilka mniejszych i dopiero wysłać, może pomoże.
@miszczo997: Czyli po prostu trzeba przesyłać kolejne bity - i tak właśnie robisz... Może nie jesteś w trybie serial load? Jeśli braknie pomysłów to spróbuj jeszcze dopisać to na początku AD9850senddata:

if (freq | 0x010000) freq |= 0x020000;
Powielenie bitu 17 na 18 jeśli jest ustawiony.
@gromwell: przepełnienie nastąpiłoby wtedy, gdybym podał częstotliwość większą jak 125Mhz jako argument, co odpada z założeń projektowych.(przepraszam, że teraz odpisuję, ale umknął mi ten post :( )

@zenkowik: problemem okazała się operacja przesunięcia. Jedynka którą przesuwam musi być jawnie zrzutowana do uint32t, inaczej po przekroczeniu dwóch bajtów zawszę będzie miała wartość zero. Tak działa już poprawnie:

if(freq&(1UL<<i)) AD
DAT_HI;

Dziękuję wszystkim za zainteresowanie i pomoc.