♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ Psycrence ⚡ ☘ ⚡ A Frail Deception ♪ ♩ ♫
https://youtu.be/rLMgFKdFZoMApetyt rośnie... w miarę jedzenia, no tak. Choć ja jednak z tych niejadków z niedowagą jestem, to drobne sukcesy z rysowaniem na ekranie Mini-4 uskrzydliły i powstała nagła ochota na więcej. Czyli na model-zabawkę prawdziwego DSO, nawet kulejący i zrobiony z tego co pod ręką. Kluczowy element to oczywiście przetwornik analogowo-cyfrowy, ale do obróbki szybszych sygnałów kostka musi być nieco żwawsza niż poprzednio występujące układy. Witamy zatem na planie ADC0804 - ośmiobitowy przetwornik A/C z sukcesywną aproksymacją o czasie konwersji około 100 us, do zabawy wyśmienity. Dokumentacja układu tutaj:
https://www.intersil.com/content/dam/In ... 803-04.pdfA tak wygląda w podstawowej aplikacji, w trybie autonomicznym (sam się biedak taktuje):
Budowa:
Dylemat skąd tu kondensator 150..200 pF wytrzasnąć i to taki, który będzie zacnie wyglądał na þłytce stykowej.
Może bez przesady jednak.
I taki oto rurkowy, szklany został wylosowany.
Wygląda dostatecznie dziwnie na tle reszty plątaniny.
Oczywiście AD2 na podorędziu, ale jednak zaczyna mi brakować takiego prawdziwego, klasycznego, analogowego generatora...no tak jakoś.
Przetwornik zapięłam do portu B układu VIA-2, wejście do Analog Discovery, do generatora W1, zagonik z przetwornikiem.
Pierwsze próby z przetwornikiem, po wystartowaniu konwerter jest samograjem, układ RC zapewnia autonomiczną pracę, kwestia tylko, aby wystartować skubańca zwierając na chwilę /WR do masy. Częstotliwość taktowania wyszła na poziomie 9 kHz, nie wyrywa to z majtek, ale do eksperymentów, które planuje z powodzeniem wystarczy.
I tu ciekawostka przy okazji: zasilony, ale nie wystartowany przetwornik ADC0804 potrafi się czasem (ale nie zawsze) mocno nagrzać, po starcie wszystko wraca do normy. Deko niepokojące zjawisko a i ręczne odpalanie kostki upierdliwe zaczyna być, coś sobie zaniedługo zatem wymyślę do tego.
TransparentnośćSprawdzenie jak funkcjonuje przetwornik w Motorolkowym ekosystemie mym takim oto prostym strzępkiem kodu:
Kod: Zaznacz cały
.transparent:
lda VIA2+IRB ; get sample
sta VIA1+ORA ; put sample
jmp .transparent
To klasyczny przesmark prosty - pobranie danej z A/C i zapisanie do C/A, bez żadnej synchronizacji ani nic, na pełnych obrotach pracowitej Księżniczki. Kilka testowych przebiegów dla przykładu, nałożone na siebie - widać zgodność faz sygnałów wejściowego i wyjściowego, ale też konsekwencje konwersji A/C/A - wynikowy przebieg jest dość mechaty.
Test że tak ujmę przepustowości układu, widać, ze w moich realiach 2kHz wejściowego sygnału zaczynają generować problemy, sinus to jeszcze niech tam...
Ale prostokąt już wymaga sporej wyobraźni w interpretacji. Kłania się Pan Nyquist.
Rzut oka na futerkową sinusoidę powstałą po zsamplowaniu tej śliczniej, którą wyprodukowało AD2.
Kolejny kod, tym razem z malowaniem podstawy czasu. Przy okazji ponazywałam te przetworniki sobie jakoś po ludzku, po kilku pomyłkach i malowaniu przebiegu z pionie to było konieczne.
Kod: Zaznacz cały
TIMEBASE .eq VIA1+ORB
SAMPLEIN .eq VIA2+IRB
SAMPLEOUT .eq VIA1+ORA
.osc:
lda SAMPLEIN
sta SAMPLEOUT
inc TIMEBASE
jmp .osc
Na ekranie Mini-4 przebieg ma niezłe ADHD, jest wyświetlany jakkolwiek bądź.
Na żywo wygląda to równie nerwowo.
https://youtu.be/yNCRJpe5gj8SynchronizacjaZ powyższego widać, że aby cokolwiek sensownie zobaczyć na ekraniku Mini-4 sygnał pokazywany w osi Y musi być zsynchronizowany z biegnącą w X podstawą czasu. Ot, podstawy działania oscyloskopu, piszą o tym w szkolnych podręcznikach. Niestety już mniej piszą jak to zrealizować i to na drodze czysto programowej, no w końcu zachciało mi się cyfrowego oscylka.
Koncepcja moja na trigger programowy wygląda jak na bazgrole poniżej.
I już wyjaśniam co jest do czego w bohomazie, a mianowicie: jeżeli wykryjemy interesującą nas wartość progową `A` (dla ułatwienia przyjęłam wirtualne zero na poziomie $80), to jest to potencjalnie interesujący nas moment, od którego można zacząć kolekcjonować próbki. Tyle tylko, że taki moment powtórzy się w każdym półokresie ( rys: A') i przebieg będzie dalej latał jak poparzony. Trzeba zatem zaraz za pierwszym złapanym progowym samplem `A` odczekać chwilkę (kilka próbek) i pobrać kolejną wartość `B`. I teraz, zależnie od relacji pomiędzy próbkami A>B lub B>A możemy stwierdzić czy mamy do czynienia z narastającą czy opadającą częścią przebiegu w ramach jednego półokresu. Interesuje nas wariant B>A czyli narastające zbocze. Matematycznie to jest zwykłe określanie znaku pierwszej pochodnej funkcji, jak widać matma przydaje się nawet na płytce stykowej.
Tu testowe półprodukty działania testowych programików, no powiem szczerze - umordowałam się z tym triggerem, tym bardziej że u mnie niestety powtarzalność wykrywania zboczy zależy też od szybkości narastania/opadania badanego przebiegu czyli nie tylko znaku ale i od wartości pochodnej.
Takie to dziwadła były:
https://youtu.be/PxPOrpz-yeUO mało co - DSO Po wielu układankach udało mi się wypracować kawałek kodu, który meldował na oscyloskopie miejsca mogące być potencjalnymi momentami wyzwolenia podstawy czasu czy rozpoczęcia kolekcjonowania próbek.
Whoooooa! Oto sygnał wejściowy z AD2, wygnał wyjściowy na DAC i drugi DAC produkujący podstawę czasu, normalnie odjazd!
No i przebiegi przestały wierzgać na ekranie i dały się jakoś sensownie sfotografować w końcu.
Dalej to właściwie było reużycie procedurek do kursora i poszatkowanej ośki, zaczęło to wyglądać całkiem sensownie - sinus na Mini-4 i rozebrany na czynniki pierwsze na Rigolu.
I podobnie dla trójkąta.
Po dołożeniu kursora robi się niezły galimatias - ale co ciekawe stabilnie stojący na ekranie, ot trigger na kolanie napisany działa jak złoto!
Problemik tylko taki drobny się wykluł, że pętelka przyczajona na nadejście próbek o zadanych wartościach wysmażała mi luminofor na lampie cholera jedna, no ale tu wiele nie zrobię, niestety. Dodanie negacji/toggle podczas fazy czekania rozrzucało wartości nieco, ale i tak problem jest. Mini-4 nie ma wyprowadzonego sygnału wygaszania wiązki, szkoda wielka. Eksperymenty robiłam zatem przy minimalnej jasności i rozmemłanej maksymalnie plamce, ponieważ większość moich pomyłek skutkowała zatrzymaniem plamki w miejscu.
Rzeczony kod pętłi głównej z triggerem:
osc-demo-2.asm pisze:Kod: Zaznacz cały
triggerWait:
; dummy move beam to save
neg SAMPLEOUT ; the osc lamp
lda SAMPLEIN ; get sample
cmpa #trigLevel
bmi .triggerWait ; wait if < trig
; first sample > trig
jsr smallDel ; let wave rise a bit
lda SAMPLEIN ; get next sample
cmpa #trigLevel+trigHeight
bpl .waveInSync ; if > trig+heigh - wave is rising
jmp .triggerWait
.waveInSync
; triggered - save samples
ldx #waveForm
.scan:
lda SAMPLEIN
sta ,x+
cmpx #waveForm+$FF
bne .scan
; play stuff on the screen like DSO :))))))
ldx #waveForm
jsr processWave
jsr processScale
jsr processCursor
jmp .triggerWait
A całość jak zwykle
https://github.com/bienata/monoboard9/b ... demo-2.asmFilm kręcą:
Tak wygląda to uspokojone na zdjęciach - z Analog Discovery 2 różne kształty przebiegu i współczynniki symetrii
A to zachowanie aplikacji przy zmianach ustawień generatora w AD2. Widać momenty, że program nie jest w stanie wykminić punktu startu i przestaje generować podstawę czasu, no, to jest do poprawy stanowczo. Ale i tak jest śmiesznie.
https://youtu.be/ivXqyjTFN04Na górze róże, na dole fiołkiA kruk czeka cierpliwie i jak się tam coś kiedyś zewrze i jak grzmotnie...
...to będzie dobranoc.