logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak jednoczesnie mierzyc adc i wyswietlac wyniki pomiarow?

Balu 22 Wrz 2005 14:00 2394 27
REKLAMA
  • #1 1839775
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Taki problemik:

    chce aby pomiary byly robione caly czas, w tym samym czasie zeby pojawialy mi się na lcd dane... (to bedzie kilka pomiarow napiec) i bedzie "I ekran lcd" na nim kilka danych potem "drugi ekran lcd" i znow kilka danych...
    I teraz jak to rozwiazac?
    Umiem wrzucic w do loop najpierw pomiary adc a potem odswiezanie ale chcialbym aby caly czas byly mierzone... (spisuje je do zmiennych i potem wyswietlma na zadanie min i max napiecia.).

    Pozdrawiam

    Ah. Compilator to BASCOM.


    Da sie to jakos sensownie rozwiazac?
  • REKLAMA
  • Pomocny post
    #2 1839832
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Pomiary w przerwaniach zegara albo przetwornika, wyświetlanie w pętli głównej programu albo też w co którymś przerwaniu (jeśli program się wyrobi).
  • #3 1839837
    diag
    Poziom 29  
    Posty: 1401
    Pomógł: 45
    Ocena: 208
    Jaki procek?
  • REKLAMA
  • #4 1839851
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Procek mega8

    Dodano po 54 [sekundy]:

    Pomiary w przerwaniach przetwornika ... hmma możesz jakiś taki fragment kodu zarzucić?
    Nie musi być konkretny tylko jak to ogolem zrobić.
  • REKLAMA
  • #5 1839915
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Może być na przerwaniu przetwornika świadczącym o zakończeniu konwersji, niech przerwanie zapisuje wynik do kolejnej zmiennej i wyzwala kolejny pomiar.

    W programie głównym jest analiza tych kilku zmiennych (powiedzmy 4, zapisywanych kolejno) z wartościami i wyszukiwanie z nich najmniejszej i największej wartości i wyświetlanie konkretnych wyników.
  • #6 1839931
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Oki a mozesz mi dac kawalek kodu odpowiedzialny za ten timer? Reszte sobie zrobie.

    Pozdrawiam

    Dodano po 1 [godziny] 51 [minuty]:

    ja wymyslilem cos takiego:

    $crystal = 8000000


    Config Timer0 = Timer , Prescale = 256
    On Timer0 Zmierz

    Enable Interrupts
    Enable Timer0

    Load Timer0 , 156
    Do


    Lcd Pomiar
    Loop
    End

    Zmierz:
    Load Timer0 , 156
    Start Adc
    Pomiar = Getadc(3)
    Stop Adc
    Return

    w/g mnie będzie co 100ms mierzył zgadza się?

    (nie kompilowany - ma wyglądać inaczej, chodzi mi tylko czy tak to powinno wyglądać ogólnie).


    Pozdrawiam.
  • Pomocny post
    #7 1840405
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Nie znam BASCOMa ale mi wyszło 8000000/256/156=200Hz czyli 5ms :?:

    W pętli głównej chyba należałoby w trakcie pobierania wyniku na moment blokować przerwania albo w przerwaniu przesyłać dane przez jakis bufor żeby nie wyszlo tak, że mamy dwa bajty z różnych pomiarów (procesor jest ośmiobitowy, a wynik ADC chyba 16?).
  • #8 1840427
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    no tak;-)
    mea culpa :D

    mial byc prescaler 1024 i zeby liczyl paskudnik do 781.
    Teraz sie chyba zgadza prawda?;-)

    BTW jaki zakres ma taki licznik? (ile można doń wpisać?)

    Pozdrawiam.
  • #9 1840435
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Chodzi Ci o Timer?

    Podejrzewam, ze 16 bitów czyli max 65535
  • #10 1840456
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Nie używaj Timera. Po co? Użyj przerwania ADCC i ten start i stop ADC możnaby sobie podarować.

    Jak go używać w bascomie nie wiem, podejżewam że ten kompilator nie przewiduje aż takiej pomysłowości użytkownika... Samo przerwanie obsługuje, ale nie ma takiej instrukcji która wyzwala pomiar i nie czeka bezmyślnie na jego koniec. Getadc się nie nadaje, musiałbyś za pomocą wstawki asm odpalać konwersję i w czasie kiedy konwersja trwa obsłużyć wyświetlacz i reszte pierdół. Czasowo chyba się wyrobi, a pomiar będziesz miał ciągły.

    Poczytaj pdfa od tego procka, a wyczaisz o co chodzi.
  • #11 1840497
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Jeśli chcesz mieć pomiary synchronizowane zegarem możesz to zrobić jeszcze inaczej. W przerwaniu zegara wyzwalasz pomiar po czym wracasz do programu głównego nie czekając na wynik (masz wtedy więcej czasu na inne zabawy). W kolejnym przerwaniu pobierasz wynik z poprzedniego pomiaru i znowu wyzwalasz przetwornik.

    Jeśli nie ma stosownych funkcji w BASCOmie, możesz to zrobić bezpośrednio na rejestrach przetwornika.

    Inny wariant to wykorzystanie przerwania przetwornika z użyciem flagi ustawianej przez przerwanie zegara itd...itd
  • #12 1840502
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    @McRancor ja nie chcę ciągłego pomiaru... (chce próbkować kilkanaście razy na sekunde)
    bo na jednym przetworniku będzie mierzone kilka różnych napieć przełączanych multiplekserem analogowym (wiem że ten procek ma muxa w sobie ale z pewnych przyczyn chcę użyć zewnętrznego).

    Pozdro.

    Dodano po 7 [minuty]:

    narazie tyle;-)
    Napisze coś wiecej to podkleje i będziemy dalej dyskutować.
    Pozdrawiam.
  • #13 1840575
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    ok ok, kumam no to timer jest do tego bardzo dobry i ten kod który wykombinowałeś też jest ok. Po stop ADC możesz wstawić jeszcze coś w ten deseń:

    If pomiar < pomiar_min then pomiar_min = pomiar
    If pomiar > pomiar_max then pomiar_max = pomiar

    I masz od razu wartość maksymalną i minimalną, na bierząco uaktualniane.
  • REKLAMA
  • #14 1840593
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Jeszcze jedno...
    Ma ktos jakies przykladowe menu w bascomie?

    obsluge guziczkow sobie zrobie - nie problem,... problemem bardziej czy to robic na ifach wszystko?
    Czy sa jakies typowe aplikacje z takimi menusami?moze jakis link znacie?

    Pozdro

    Dodano po 1 [godziny] 21 [minuty]:

    I jeszcze jedno pytanko mam :D
    Czy da się coś zapisać (z poziomu uruchomionego układu) do tej megi? Jesli tak to jak??

    Potrzebuje spisać do pamięci takie rzeczy jak wartość PWM'a od podświetlania lcd...

    Pozdro;-)

    PS.
    Naprawde nikt nie ma pomyslu na jakiegoś menusa?
    (przewijanie w gore, w dol + w glab ).

    Dodano po 3 [minuty]:

    LOL;-)
    Dobra juz wiem ze sie da zapisac do pamieci eeprom:D

    Pozdro...
    Wciaz pozostaje wazne pytanie o tego menusa;-)

    Dodano po 19 [minuty]:

    No naprawde nie mam pojecia jak te menusy zrealizowac... myslalem nad czyms w stylu:

    mam guziki ESC OK UP DN

    (po wcisnieciu guzika ok - wywolywanie int0 - wlacza sie menu)

    i teraz chcialem tak:
    repeat

    (i tutaj nie wiem jak zrobić... chciałem żeby program oczekiwał czy użytkownik wcisnie up czy dn czy ok, a jesli nie ma reakcji w ciagu 5s to ESC, jesli up to zmienia to co bylo teraz na ekranie an cos a jesli dn to na cos innego , wyjscie z podprogramu obslugi menu, jesli up to bym zink).

    until esc (wydany z glownego menu)


    cos takiego;-)

    Pozatym kolejne pytanie mi się nasunęło - w Pascalu robilem menusy w ten sposob ze czekal az wcisne gora czy dol i potem incrementowal lub dekrementowal zmienna i wyswietlal na ekranie napis(x) gdzie napis byla tablica stringow a x to index;-)
    No i tutaj chcialem taka tablice sobie machnac a on mi z textem ze out of sram:D
    Da sie jakos to po ludzkiemu zrobic?
    Np zdefiniowac 10 elementowa tablice z np kazdym elementem max. 8 znakowym?
  • #16 1843254
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Cytat:
    out of SRAM

    Tablice musisz alokować w pamięci kodu, a nie w RAMie (masz w BASCOMie stałe? Const st="xxxxxxxx" czy DATA "aaaa") .

    Co do reszty to nie bardzo zrozumiałem w czym tkwi problem. Włącz wyobraźnię i zrób to podobnie do tego, co robiłeś w PASCALu. Na trzech przyciskach można stosunkowo prosto obsłużyć wielopoziomowe drzewko menu zwłaszcza gdy teksty masz w tablicy i użyjesz odpowiednika instrukcji case.
  • #17 1843310
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    No ok...
    Tylko ze bascomik sie pluje że nie można robić:

    Dim Nazwa(10) As String * 6

    Const Nazwa(1) = "tst"

    twierzi ze nie mozna stałych z () używać? to jak ja to mam przypisać do tej paskudnej tablicy?

    Dodano po 2 [minuty]:

    ups stalych sie nie definiuje wczesniej ;-) ale to tez nic nie zmienia :-(

    Dodano po 4 [minuty]:

    a co do obslugi przyciskami... to zrobic ja w petli
    repeat
    <czekam czy na ktoryms sie pojawi 1>
    until <na ktoryms sie pojawil 1> lub <minelo 10s> cos takiego? czy jakoś szprytniej się da?
  • #18 1843329
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Jeśli masz jakieś funkcje dostępu do pamięci kodu (pobieranie spod określonego adresu) to wpisz te stałe do wolnego obszaru za programem i pobieraj tą funkcją. Jeśli nie masz tej funkcji możesz to zrobić wstawką asemblerową.

    Najlepiej żeby się wypowiedział ktoś, kto na codzień używa i dobrze zna BASCOMa, ale jak widać że o takich akurat dziś nie łatwo.

    Co do przycisków nie mam zdania (każdy wariant jest dobry, jeśli spełnia zadania ;-) ).
  • Pomocny post
    #20 1843530
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Balu napisał:
    widze właśnie :/ a bez tablic to ja się zajadę z tym menu...:/

    Nie będę się wiele rozpisywał(narzekał na wszechobecne lenistwo ;) ) , tylko skrobnę przykładzik:
    
    
    $regfile = "m8def.dat"
    '$regfile = "8535def.dat"
    $crystal = 7372800
    Dim I As Byte , B As String * 10
    Do
    For I = 6 To 0 Step -1
    Print Lookupstr(i , Tablica)
    Next I
    Loop
    Tablica:
    Data "jeden" , "dwa" , "trzy" , "cztery" , "jedzie" , "pies" , "Huckelberry"
    

    Odpalić symulator i ... obserwować , obserwować ... .

    Piotrek
  • #22 1843598
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    zumek napisał:
    Nie będę się wiele rozpisywał(narzekał na wszechobecne lenistwo ;) ) , tylko skrobnę przykładzik:

    No proszę, to jednak jest DATA w BASCOMie. Nie chcę się przechwalać jasnowidztwem, ale przeglądając tematykę BASCOMową byłem niemal przekonany, że jeśli ktoś się odezwie w tym temacie to właśnie zumek.

    Pozdrowienia dla wszystkich, którym jeszcze w piątek wieczorem się chce ;-)
  • #24 1845226
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Zumek my master ;-))
    Mam kolejny problemik;-)
    Mam dziwne wrażenie że te stringi mi się nie zmieszczą do tej atmegi;-))

    I tutaj mam pytanko czy dałoby się to zapisywać do AT24C04 i z niej odczytywac?;-)

    Jesli tak to czy nie byłoby to zbyw spowalniające cały układ...;-)

    Pozdrawiam
  • #25 1845349
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Balu napisał:

    Mam kolejny problemik;-)
    Mam dziwne wrażenie że te stringi mi się nie zmieszczą do tej atmegi;-))

    A co , książkę piszesz :?: ;)
    Masz przecież jeszcze 512 B eepromu , kilka setek B RAM-u do dyspozycji i to wszystko mało :!: :?: :!: :?:
    Balu napisał:

    I tutaj mam pytanko czy dałoby się to zapisywać do AT24C04 i z niej odczytywac?;-)

    Pewnie :!:
    Balu napisał:

    Jesli tak to czy nie byłoby to zbyt spowalniające cały układ...;-)
    Pozdrawiam

    To zależy od wielu czynników.Myślę , że wyświetlenie stringa na LCD , zajmuje więcej czasu niż jego odczyt , z szregowego eepromu ;)

    Podejrzewam również , że optmalizacja kodu , pozwoliła by zaoszczędzić parę(set ?)dziesiąt B FLASH-a.
    Jednak te wszystkie moje dywagacje nic nie znaczą , bo ja nie wiem co Ty tam hmm ... stworzyłeś i ile Ci tegp "proca" brakuje ;)

    Piotrek

    PS
    A kod już zamknięty na ostatni guzik :?:
  • #27 1847624
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Obywatelu pamiętaj!

    Im prostrze menu, tym większe szczęście dla całego ludu!

    Krowiaste i przerośnięte menu < Twój wróg!

Podsumowanie tematu

✨ Dyskusja dotyczy problemu jednoczesnego ciągłego pomiaru kilku napięć za pomocą przetwornika ADC i wyświetlania wyników na LCD w mikrokontrolerze Atmega8 programowanym w BASCOM. Proponowane rozwiązania obejmują wykorzystanie przerwań przetwornika ADC do zapisu wyników pomiarów do zmiennych oraz wyzwalanie kolejnych konwersji w przerwaniach, co pozwala na ciągłe próbkowanie bez blokowania głównej pętli programu. Alternatywnie sugerowano użycie przerwań timera do wyzwalania pomiarów w określonych odstępach czasu (np. co 100 ms), z jednoczesnym aktualizowaniem wartości minimalnych i maksymalnych. Dyskutowano także kwestie synchronizacji i buforowania danych, aby uniknąć błędów przy odczycie wielobajtowych wyników ADC na 8-bitowym procesorze. Autor rozważał implementację menu na LCD z obsługą przycisków, napotykając trudności z definiowaniem tablic stringów w BASCOM, co zostało rozwiązane przez wykorzystanie dyrektywy DATA. Poruszono także temat zapisu ustawień (np. PWM podświetlenia LCD) do pamięci EEPROM mikrokontrolera oraz ewentualnego użycia zewnętrznej pamięci AT24C04, z uwzględnieniem wpływu na szybkość działania układu. Wskazano na konieczność prostoty menu dla stabilności i wygody użytkowania.
Wygenerowane przez model językowy.
REKLAMA