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

[Atmega8][Bascom] pomiar stoperem krótkich czasów.

Fsoliebhaber 10 Gru 2009 19:19 5810 30
  • #1 7371271
    Fsoliebhaber
    Poziom 17  
    Witajcie.
    Zaczynam swoja przygodę z mikrokontrolerami AVR -> Atmega8.

    Postawiłem sobie za problem zmierzenie czasów migawki starych aparatów fotograficznych. Myślę sobie problem banalny więc do dzieła... niestety poległem.

    O ile program wykorzystujący polecenie waitus1 faktycznie działał to jednak nie do końca.
    Czyli
    Do
    waitus 1
    Incr X 
    Loop


    Jednak to nie to, te czasy jakiś dziwne wychodzą.

    Profesjonalnie powinno się wykorzystać wbudowany w procesor timer. No właśnie tylko jak. Ani ośla łączka ani książka Marcina Wiązani nie naprowadziła mnie na dobrą drogę.

    Czasy które chce zmierzyć to odcinki od 0,001s do 1s.

    I tak procesor taktowany 8MHz, preskaler ustawiany na 64 co daje okres impulsów licznika 8µs. Licznik ma zliczać do 125 co daje 125 x 8µs = 1000µs czyli 1ms czyli 0,001s.

    Możecie rzucić okiem na program czy dobrze mam skonfigurowany timer0? Bo czasy jakie mi wychodzą są kosmiczne (oczywiście chwilowo migawkę udaję "mikrosłiczem" ale to chyba nie ma znaczenia jeśli przycisk trzymam 3s a na wyświetlaczu dostaje wartość np 87).

    Naciśniecie przycisku pod pinb.5 ma uruchomić odczyt wyniku na 5 sekund.

    Oto mój tragiczny program:

    'pomiar ultrakrotkich czasow
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
                                                                 'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
                                                                 'o częstotliwości oscylatora
                                                                 'taktującego mikrokontroler
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    
    
    Config Portb.0 = Output                                     'konfiguracja buzerka
    
    Config Portb.3 = Input                                      'konfiguracja wlacznika S1
    Config Portb.5 = Input                                      'konfiguracja wlacznika S3
    
    
    Dim X As Single                                             'deklaracja zmiennej X do wait X
    
    Set Portb.3                                                 'dołączenie do linii
    Set Portb.5                                                 'rezystora podciagajacego
    '*******************************************************************************
    Config Timer0 = Timer , Prescale = 64
    Enable Interrupts
    Enable Timer0
    Load Timer0 = 125
    
    '*******************************************************************************
    Cursor Off Noblink                                          'Likwiduje mruganie kursora na koncu slowa
    Cls
    Lcd "    POMIAR"
    Lowerline : Lcd "    MIGAWKI"
    Waitms 1500
    Portb.0 = 1
    Waitms 50
    Portb.0 = 0
    Waitms 100
    
    
    Start:
    Cls
    Lcd "Wyzwalaj"
    Lowerline : Lcd "migawke..."
    
    Do
    
    If Pinb.3 = 0 Then
       Start Timer0
       Incr X
       Else
       Stop Timer0
       End If
    
    Loop Until Pinb.5 = 0
    
    X = X / 1000
    
    Cls
    Lcd "T= " ; X
    Wait 5
    X = 0
    
    Goto Start
    
    
    End


    Wszelkie sugestie mile widziane.

    Pozdrawiam Was Konrad
  • #2 7371477
    tmf
    VIP Zasłużony dla elektroda
    Prawidlowo powinienes to zrobic tak, ze sygnal z migawki podajesz na jakies wejscie przerwan procesora, ustawiasz timer, ktory po prostu sobie liczy. Teraz migawka przy otwieraniu wywoluje twoja procedure obslugi przerwan, zapamietujesz stan timera, migawka sie zamyka, wywoluje proc. obslugi przerwania - zapamietujesz stan timera. Roznica pomiedzy tymi wartosciami to czas otwarcia migawki. Mozesz to tez zrobic w petli tak jak masz, tyle, ze musisz odczytywac stan timera a nie tej zmiennej X, ktora jest iloscia obiegow petli i istotnie moze byc kosmiczna.
    BTW, tak z ciekawosci po co to mierzysz?
  • #3 7371656
    Fsoliebhaber
    Poziom 17  
    Mam dużo rożnych wiekowych aparatów na 35 mm oraz średni format i chciałbym wiedzieć jak pracują ich migawki. Często się zdarza tak, że nastawa 1/30 , 1/60 i 1/125 to zwyczajnie ten sam czas. Po prostu mechaniczna usterka. Wiedząc choćby mniej więcej jakie są czasy ich otwarcia mogę nad tym jakoś zapanować.


    Przyznam szczerze, że Twoja rada (aczkolwiek bardzo pomocna) jest niestety zbyt zawiła jak na umiejętności laika którym jestem.

    Start Timer0
       Incr X 

    To zaczerpnąłem z oślej łączki. Mógłbyś podpowiedzieć jak odczytać wartość timera? w moim programie. Tak by to był faktycznie czas? Wysyłałem do wyświetlacza wartość Tcnt0 ale to tez jakieś farmazony wskazywało.
  • #4 7372020
    tmf
    VIP Zasłużony dla elektroda
    Na Bascomie sie nie znam i nie wiem jak sie tam nazywa rejestr timera. Byc moze Tcnt0, w takim wypadku musisz przy wyzwoleniu zapamietac jego wartosc i ponownie odczytac po zamknieciu - analogicznie roznica jest czasem otwarcia migawki. Swoja droga jak mierzysz czas otwarcia? Jakis uklad dioda/fotoelement?
  • #5 7372192
    janbernat
    Poziom 38  
    Najpierw "mikroswłicz" który po wciśnięciu drga.
    Czyli przełącza wielokrotnie- a nie wiesz jaki stan procesor bada na wejściu- po są drgania.
    Najprostsza metoda:
    If Pinb.3 = 0 Then
    waitms 20
    If Pinb.3 = 0 Then

    .........
    end if
    end if
    To oznacza że po wciśnięciu mikroprzełącznika odczekujesz 20ms i jeśli po tym czasie masz taki sam stan to się "uspokoił" i przestał drgać.
    20 ms zwykle wystarczy.
    To na początek.
    O dim single postaraj się zapomnieć na jakiś czas.
    Potem doczytasz w helpie po polsku.
    Zacznij używać dim byte dla timerów 8-bit lub dim word dla timera 16 bit.
    Zamiast:
    Config Portb.0 = Output 'konfiguracja buzerka

    Config Portb.3 = Input 'konfiguracja wlacznika S1
    Config Portb.5 = Input 'konfiguracja wlacznika S3
    Użyj:
    Config pinb.0= Output itd.
    Bascom tak ma.
    Niby config portb.0= x znaczy to samo co Config pinb.0=x ale nie zawsze to działa.
    Podciąganie pinów wejścia jest ważne.
    Wtedy piszesz np: set portb.3
    A rejestr Timera naztwa się tak jak powinien nazywać się rejestr- np: TCNT0
  • #6 7372938
    xury
    Specjalista automatyka domowa
    Z ta konfiguracją portów w helpie mamy:
    CONFIG PORTx = state

    CONFIG PINx.y = state
    I w teorii kompilator powinien wywalić błąd jeśli napiszemy np.:
    Config portb.3 = Output
    ale tego nie robi. Czy tak działa po zaprogamowaniu to nie sprawdzałem.
  • #7 7373025
    janbernat
    Poziom 38  
    "I w teorii kompilator powinien wywalić błąd "
    Ale nie wywala.
    Ale raz jest dobrze- a drugi raz źle.
    Jeszcze w wielu miejscach nie wywala błędu a nie działa.
    Po prostu nie "widzi" różnicy.
    Jakie pieniądze- taki kompilator.

    Mam nadzieję że niechcący nie rozpętam wojny...

    Ale fsolibhaber ten program da się zrobić w Bascomie.
    Tylko duś mnie o to dwa razy dziennie.
  • #8 7373408
    Fsoliebhaber
    Poziom 17  
    Już odpowiadam na pytania i sugestie.
    Tak jak napisałem chwilowo otwarcie zamkniecie migawki symuluję mikrowłącznikiem.
    Zdaje siebie sprawę, że jest to generator drgań, drgań o charakterze losowym.
    Ale czy to ma aż taki wpływ gdy przycisk trzymam 3 - 5 sekund a wynik pomiaru mam błędny. Ale rozumiem, że popełniłem błąd w założeniach. Dziś postaram się podłączyć tak jakiś fotodiodę/fototranzystor + jakiś tranzystorek sterujący i prosto na nogę procesora. Czyli: nie ma swiatła na nodze procesora jest 1; jest światło na nodze procesora jest 0.
    Wyeliminuję jeden błąd z mej prototypowej konstrukcji.

    Napisałem wczoraj jeden program wykorzystujący polecenie waitus 1 czyli czekaj 1mikrosekundę. Wrzuciłem go do pętli w ten sposób (piszę z pamięci bo teraz jestem w pracy)

    Start:
    x=0
    Do
    If pinx.y = 0 then  ' przycisk nacisniety
    
    wait 1us              'jesli przycisk nacisniety powiekszaj co 1us wielkosc X
    Incr X                 ' czyli odmierzaj kolejne odcinki czasu 1us; ilosc X to tyle us czasu 
    End if
    Loop until Pinx1.y2 = 0
    
    Cls
    Lcd" T =" ; X
    Wait 5
    Goto Start


    To o dziwo jakoś działało, tj dawało wyniki mniej więcej pokrywające się z tym co palcem wysterowałem przycisk.

    Ale polecenie wait chyba do najdokładniejszych nie należy więc chcę okiełznać funkcję timer0.


    Co do zmiennych typu single to tylko one umożliwiają operacje z liczbami i ułamkami(po przecinku)
    Bo wynik w mikrosekundach muszę podzielić przez 10000 aby uzyskać wynik w sekundach to raz.
    Dwa wynik ten jest dzielony rpzez jedynkę tak aby uzyskać "fotograficzny" zapis czasu np 1/1000 zamias 0,001s

    Czyli robię tak:
    
    X=X/10000
    
    X= 1/X
    
    Lcd "T= 1/" ;X


    Tego na innych zmiennych nie wykonam.
    Wiem, że wychodzą mi idiotyczne wyniki np 1/67,896764765 ale to i tak daje bardzo dobry obraz uzyskanego pomiaru.
  • #9 7373473
    tmf
    VIP Zasłużony dla elektroda
    wait 1us pewnie jest dokladne, ale w petli masz przeciez nie tylko ta instrukcje, wiec calkowity czas wykonania petli jest dluzszy.
    Pomiar spokojnie mozesz zrobic na liczbach calkowitych, przeciez zapis:
    X=X/10000
    X= 1/X

    jest rowny x=10000/x, ulamkow miec nie bedziesz bo przeciez kolejne liczby czasu to liczby calkowite.
  • #10 7373505
    Fsoliebhaber
    Poziom 17  
    Ale, ale... chcąc zrobić dla zmiennych np Word takie równanie:


    Dim A as Word
    Dim B as Word
    Dim C as word
    A=5
    B=3
    
    C=A/B
    
    Lcd: C



    to zwraca mi "czystą" jedynkę zamiast 1,6666666666666666.

    Uwaga ta się tyczy tego zapisu: X = 1/X. Chyba, ze ja coś motam.

    Ale ok, sprawdzę w domu wasze sugestie(zamiana config portx.y na pinx.y, podłączenie fototranzystora zamiast przycisku oraz inne zmienne) to musi lepiej działać! :)


    Dziękuję serdecznie za pomoc!

    Pozdrawiam Konrad
  • #11 7374506
    janbernat
    Poziom 38  
    A ja dzisiaj nie byłem w pracy.
    Wziąłem zaległy urlop z 2007r.
    I oto co zrobiłem

    
    'program do pomiaru czasu wciśnięcia przycisku podpiętego do PD.2(INT0) i PD.3(INT1) przez układ RC tłumiący drgania przycisku.
    'Przy tych ustawieniach Timer1 zwiększa się co 128us a licznik przepełnia się co 8.389s
    'Program sprawdzony i działa.
    'W celu wyświetlenia czasu w bardziej przyjaznej formie należy przeliczyć zawartość licznika T1 na to co potrzeba.
    
    
    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Int0 = Falling                                       'naciśnięcie przycisku- opadające zbocze
    Config Int1 = Rising                                        'puszczenie przycisku- narastające zbocze
    
    Config Pind.2 = Input
    Config Pind.3 = Input                                       'A tu ustawiamy podciąganie wejść przez rezystory wewnątrz procesora
    Set Portd.2
    Set Portd.3
    Config Timer1 = Timer , Prescale = 1024
    
    Timer1 = 0                                                  'Ustawiamy licznik na 0
    Stop Timer1
    
    Enable Interrupts
    Enable Int0
    Enable Int1
    
    On Int0 Startuj                                             'jak wciśniemy przycisk to będzie przerwanie ilicznik zacznie liczyć
    On Int1 Zatrzymaj                                           'a jak puścimy- to przestanie liczyć
    
    Cls
    Lcd "OK"
    Waitms 500
                                                                  'głowna pętla
    Do
    
    Cls                                                         'wyświetlamy zawartość licznika
    Lcd Tcnt1
    Waitms 15
    
    Loop
    End
    
    Startuj:                                                    'było przerwanie- wciśnięty przycisk- licznik zaczyna liczyć
    
    Timer1 = 0
    Start Timer1
    
    Return
    
    Zatrzymaj:                                                  'było drugie przerwanie- puszczony przycisk- licznik przestaje liczyć
                                                                 'i można odczytać ile zliczył
    
    Stop Timer1
    
    Return
    :D
  • #12 7375350
    Fsoliebhaber
    Poziom 17  
    Dziękuję janbernat za fantastyczną i rzeczową pomoc oraz wkład pracy w rozwiązanie mojego problemu.
    Widać, ze program ma ręce i nogi! Niestety nie będę mógł go sprawdzić tak "ad hoc" ponieważ moja płytka testowa (gotowa bo kupiona ) Pind.2 i Pind.3 oddaje wyświetlaczowi. Będę musiał spreparować coś na szybko na płytce uniwersalnej i wtedy uruchomić...
    O efektach dam znać! Bowiem na rozwiązaniu problemu mi zależy, środowisko kolegów fotografów (Gdańskich) naciska abym to ustrojstwo w końcu zmajstrował. Hehe właśnie dzięki takiemu "kopowi" skierowałem się w końcu ku AVRom.

    W międzyczasie zmajstrowałem już interwałometr oraz programowanego pilota do lustrzanek obsługującego czasy B

    Konrad
  • #13 7377277
    Konto nie istnieje
    Poziom 1  
  • #14 7377468
    Fsoliebhaber
    Poziom 17  
    emarcus napisał:

    Latwiejszym rozwiazaniem byloby: zamiast tego przycisku (SW) zastosowac element swiatloczuly (fototranzystor, fotodioda) usytuowany w miejscu kliszy fotograficznej.
    e marcus


    Napisałem o tym wyżej, wystarczy przeczytać moje posty. To nie jest trudne. Przycisk jest tymczasowo, bowiem ucząc się Bascoma musiałem jakkolwiek sprawdzić czy program w ogóle działa.

    emarcus napisał:

    O ile sprawa pomiaru czasu dla aparatow z centralna migawka jest oczywista i trywialna, to dla tych z migawka szczelinowa, moze wymagac wiecej przemyslenia i dyskusji.

    e marcus


    Wiem o tym doskonale ale mi wystarczy przybliżona wartość, nie dokładna. Nie prowadzę serwisu aparatów, ale chciałbym wiedzieć jak owe czasy się kształtują.

    Słuchanie "kłapania" migawki nie zawsze daje mi pogląd czy jej czasy są ok. Bywa czasem tak, że nastawa 1/60 i 1/500 to ten sam czas. Co wychodzi dopiero na filmie.

    A mogąc sobie zmierzyć w sposób przybliżony parametr migawki to da mi dużą pomoc.

    Tematem wątku jest problem programowy a nie toru optyczno-pomiarowego.
  • #15 7378951
    Fsoliebhaber
    Poziom 17  
    Witam ponownie.

    Nie mogąc jeszcze sprawdzić programu napisanego przez janbernat sprawdziłem swój błędny w założeniach program.
    Podłączyłem na wejście procesora prosty układzik z fototranzystorem i tranzystorem + dwa rezystorki. Fototranzystor umieściłem od strony obiektywu a latarkę od strony filmu.
    Program działający na zasadzie:

    Do
       If Pind.1 = 1 Then
    
          Waitms 1
          Incr X
       End If
    
    Loop Until Pinb.5 = 0
    X = X / 1000
    S = 1 / X
    
    Cls
    Lcd "T= 1/" ; S
    Lowerline : Lcd "T= " ; X


    Okazał się programem działającym. O dziwo... Choć formalnie nie do końca on jest poprawny. Ograniczam się na razie do pomiarów czasów 1/1000 (pi * oko)
    Sprawdziłem to na dwóch aparatach, bo tylko dwa mam niezaładowane chwilowo filmami.
    Na pierwszy ogień poszła Minolta 7000 Maxxum. Tutaj czasy od 2s (dłuższych nie mierzyłem) do 1/125 pokrywają się idealnie. Niestety powyżej 1/500 nie chce sie "trzymać".
    Co zresztą słychać, 1/1000 brzmi jak 1/2000 a wskazanie dla 1/1000 to 1/550s.

    Na drugi ogień poszła Minolta 505si i tu miłe zaskoczenie. Dla 1/1000 wynik 1/1000 (powtarzalny!), dłuższe czasy(1/60, 1/30 i dłuższe) też ok. Tylko w okolicach 1/90 i 250 jakieś drobne zamieszanie.

    Czyli ogólnie stwierdzam, że projekt, choć w moim wykonaniu wielce niedoskonały ma prawo bytu i może być przydatnym narzędziem w rękach fotoamatora.

    Z taką motywacją walczę dalej. Konrad
  • #16 7380118
    janbernat
    Poziom 38  
    Dobrze że mi przypomniałeś że chodzi o 1/1000s.
    Dawno nie zajmowałem się fotografią.
    A 1/1000s to jest 1ms- tak że z tym waitms 1 to trzeba uważać.
    A już zacząłem tworzyć program z "odpytywaniem" pinów co 8ms żeby ominąć problem zajętych pinów INT0 I INT1- ale byłaby kicha.
    Z tego co widzę masz wolny pind.1.
    A wyświetlacz masz jak wynika z Twojego programu na pd.2-pd.7.
    Czyli niestety wejścia komparatora analogowego są też zajęte.
    I widać że wykorzystujesz dwa wejścia- d.1 i b.5.
    Chyba niepotrzebnie- wystarczy sprawdzić czy pind.1 jest już 0.
    Migawka jest też elementem mechanicznym- choć dużo bardziej precyzyjnym niż mikroprzełącznik to może też mieć drgania.
    Jakie- to trzeba użyć oscyloskopu cyfrowego.
    Spróbuj w Swoim programie użyć opóźnienia waitus 100 i wynik podzielić przez 10000.
    A potem waitus 50/20000 itd.
    Przy tej częstotliwości zegara jeden takt procesora trwa 0.125us.
    Może Minolta 7000 Maxxum też wtedy pokaże dokładniej.
    Ale trzeba jeszcze nad tym popracować aby środowisko fotografów otrzymało dobry sprzęt.
    P.S.
    emarcus- też nad tym myślałem-ale:
    Wcale nam nie zależy aby po pomiarze licznik się natychmiast zerował- bo następny pomiar nie odbędzie się natychmiast.
    Wejścia na koparator analogowy są zajęte.
    Program miał być zrozumiały dla użytkownika.
    Następny może będzie lepszy- ale trudniejszy do zrozumienia.
  • #17 7380486
    tmf
    VIP Zasłużony dla elektroda
    Fsoliebhaber napisał:

    Na pierwszy ogień poszła Minolta 7000 Maxxum. Tutaj czasy od 2s (dłuższych nie mierzyłem) do 1/125 pokrywają się idealnie. Niestety powyżej 1/500 nie chce sie "trzymać".
    Co zresztą słychać, 1/1000 brzmi jak 1/2000 a wskazanie dla 1/1000 to 1/550s.

    Na drugi ogień poszła Minolta 505si i tu miłe zaskoczenie. Dla 1/1000 wynik 1/1000 (powtarzalny!), dłuższe czasy(1/60, 1/30 i dłuższe) też ok. Tylko w okolicach 1/90 i 250 jakieś drobne zamieszanie.


    Twoj program w ogole nie jest zdolny do pomiaru czasow krotszych niz 1/500s, w granicach 1/1000s ma jakistam blad zalezny od efektywnosci Bascoma, a dla czasow krotszych niz 1/1000s to pokazuje bajki, w ogole nie nadaje sie do pomiaru takich czasow. Zauwaz, ze w petli czekasz 1ms, czyli 1/1000s, jak wiec chcesz mierzyc czasy 2x krotsze? Dla 1ms masz spory narzut otaczajacych instrukcji, w C bym to pominal, ale Bascom z pewnoscia nie generuje zbyt efektywnego kodu. Nie wiem czemu uparles sie na te opoznienia, skoro odczytywanie czasu z timera jest jeszcze prostsze i daje lepsze rezultaty.
  • #18 7380652
    Fsoliebhaber
    Poziom 17  
    -> janbernat
    Probowałem już kombinacje z waitus 10. Zapowiada się interesująco. Teraz staram się skupić na torze optycznym. Przetestowałem dwa fototranzystory, jeden na pełne pasmo światła widzialnego drugi li tylko widzący podczerwień. Druga opcja z diodą IR i fototranzystorem na podczerwień się sprawdzi doskonale, brak reakcji na światło zewnętrzne.

    Oto piny (wolne) jakimi dysponuje moja płytka testowa:
    -	złącze 1 wire – uniwersalne złącze podłączone do PD1
    
    -	złącze wyświetlacza standardowe w programie BASCOM należy wkleić configurację nastepującą.:
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
    
           -złącze SDA i SCL standardowe do podłączenia szyny I2C 
    SCL podłączone do PC5 (poracuje również jako wejście przetwornika ADC5 !!!)
    SDA podłączone do PC4 (poracuje również jako wejście przetwornika ADC4 !!!)
    
    -	złącze ADC (wejście przetwormika A/C)
    IN 1 podłączony do PC0 (ADC0)
    IN 2 podłączony do PC1 (ADC1)
    IN 3 podłączony do PC2 (ADC2)
    IN 4 podłączony do PC3 (ADC3)


    ->tmf Napisałem, że mój program jest błędny i niedokładny ale bez prób i błędów do niczego nie dojdę (choćby poprawiania toru optyczno-pomiarowego). Kombinuje jak potrafię. Jeśli drażni Cię moja programowa nieudolność to zwyczajnie nie wypowiadaj się w wątku. Uczę się Bascoma od 1,5 tygodnia...
    Nigdzie nie napisałem iż zmierzyłem obecnym programem czas krótszy niż 1/1000 (aż tak głupi nie jestem). Zresztą... Domyślnie chciałem testować tym aparaty na średni. Coś ala Kiev60, Psix itp bo to najczęściej się przez łapy przewija to tam i tak maks 1/500s. Owszem one chodzą na 1/1000s ale przy tak wielkiej migawce to cudów nie ma. Nie trzyma czasów... Raczej się nie "foci" średnim przy takich czasach.


    Cytat:
    Nie wiem czemu uparles sie na te opoznienia, skoro odczytywanie czasu z timera jest jeszcze prostsze i daje lepsze rezultaty.


    Ja się nie zaparłem, napisałem tylko, że testuję z ciekawości słuszność pomysłu powastania takiego urządzenia. Tak, z pewnością odczytywanie czasu z timera jest lepsze. Wystarczy przeczytać mój pierwszy post (to naprawdę nie trudne!).
    Zauważ jeszcze taki drobiazg. Gdybym wiedział jak odczytać czas z "tajmera" nie zakładałbym tego wątku.
  • #19 7380900
    janbernat
    Poziom 38  
    Czyli przypadkiem zmajstrowałem najprostszy program- i jak dotychczas najlepszy dla tego zadania.
    To co bym zmienił- to prescale dla timer1 na 8.
    Wtedy timer zwiększa się co 1us i przepełnia się co 65ms.
    Pomiary czasu dla 1/1000s mają błąd 0.1%
    Ale max migawki ma wtedy ok.1/30.
    Może to wystarczy.
    Napiszcie lepiej.
    Ja tez spróbuję.
    A Fsoliebhaber- zdecyduj się- albo gotowa płytka albo inna.
    Bo albo zwolnisz piny na int lub komparator- albo trochę trudniej to zrobić.

    Dodano po 11 [minuty]:

    "Druga opcja z diodą IR i fototranzystorem na podczerwień się sprawdzi doskonale, brak reakcji na światło zewnętrzne. "
    To uważaj, wszystko zależy od natężenia światła zewnętrznego.
    Jak lampę na stole mocno zbliżysz to fototranzystor się i tak nasyci i przestanie reagować.
    Ale przy pewnej nieśmiałości będzie działać.
    Dla mnie sprawa jest fajna i będę pomagał.
    Nie wiem gdzie schowałem swoją starą Exaktę- ale może znajdę.
    A czas z timera odczytujesz jak w tym zaczątku programu wysłanego:
    Cls
    LCD tcnt1
    Potem to "przerabiasz" na wartość "przyjemną" do odczytu.
  • #20 7381086
    Fsoliebhaber
    Poziom 17  
    Mam uniwersalną płytkę. Musze dokupić kwarc i parę drobiazgów. Ale to dopiero w poniedziałek...

    Może na samym początku źle sprecyzowałem założenia projektu. Nie zależy mi na aptekarskiej dokładności pomiaru czasu. Ważne aby w sposób mniej lub bardziej (trudno to mniej lub bardziej liczbowo sprecyzować, więc dla niektórych to stwierdzenie podziała jak płachta na byka) mógł określić czasu migawki. Dokładność jaką uzyskałem swoim błędnym programem mnie zaczyna zadowalać. Ale skoro z pomocą kolegów można to zrobić lepiej... to hoho tylko pracować dalej.

    A wszystko to (problem) zaczął się od Psix'a kupionego przez kolegę. Psix trzepał od 1/60 do 1/500 ten sam czas(1/ 1000 to kosmos, o czym napisałem wyżej). Oczywiście na słuch było to podejrzane, a na pierwszej rolce filmu wszystko wyszło. Aparat wędrował od jednego specjalisty (Gdańsk) do drugiego (Bydgoszcz) aż w końcu zaczął strzelać jak należy.

    Mając taki choćby prymitywny przyrząd możemy sobie sprawdzić na bieżąco co w trawie piszczy. I nawet nie ingerując w mechanikę aparatu tak dobierać czasy aby zdjęcia były poprawnie naświetlone.
    Ja wiem, że dla wielu mój problem jest abstrakcyjny, pewna część w ogóle nie wie o czym piszę ale fotografia klasyczna nie umarła, ma się całkiem, całkiem nieźle.
  • #21 7383501
    janbernat
    Poziom 38  
    No to jak fotografia klasyczna nie umarła- to masz:

    
    'program do pomiaru czasu wciśnięcia przycisku podpiętego do pinb.0
    'Do pinb.1 podpięta dioda
    'Przy tych ustawieniach Timer1 zwiększa się co 128us a licznik przepełnia się co 8.389s
    'przy timer1 prescale=64 Timer1 zwększa się co 8us i ma zakres 0.524s
    'Przy ustawieniu Timer0 prescale= 256 sprawdzanie stanu pinb.0 co 8.2ms
    'Przy ustawieniu Timer0 prescale= 1 sprawdzanie stanu pinb.0 co 32us- ale tego nie sprawdzałem
    'Poderzewam że pętla wykonuje się dłużej- czego też nie sprawdzałem
    'Program sprawdzony i działa-to co mogłem sprawdzić.
    'W celu wyświetlenia czasu w bardziej przyjaznej formie należy przeliczyć zawartość licznika T1 na to co potrzeba.
    'To co mnie niepokoi- nie powinienem mieć wskazań krótszych niż 8.2ms a niekiedy mam.
    'Może jakiś błąd logiczny- może ktoś znajdzie
    
    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    
    Config Timer1 = Timer , Prescale = 1024
    Config Timer0 = Timer , Prescale = 256
    
    
    Timer1 = 0                                                  'Ustawiamy licznik na 0
    Stop Timer1
    
    Enable Interrupts
    Enable Ovf0
    On Ovf0 Petelka
    Sw0 Alias Pinb.0
    Config Pinb.0 = Input
    Set Portb.0
    Config Portb.1 = Output
    Set Portb.1
    
    Dim Temp2c As Byte                                          'zmienne pomocnicze
    Dim Temp2b As Byte
    Dim Temp2a As Byte
    Dim Flaga0 As Byte
    
    Cls
    Lcd "OK"
    Waitms 500
                                                                  'głowna pętla
    Do                                                          'mocno porąbane sprawdzanie stanu przycisku Pinb.0 czyli Sw0
      If Flaga0 = 1 Then                                        'w pętelce co 8.2ms zarówno czy jest wciśnięty jak i czy puszczony
        If Sw0 = 0 Then
          Temp2a = 1
          Temp2c = 1
           If Temp2a = 1 And Temp2b = 0 Then
            Temp2b = 1
            Reset Portb.1
            Timer1 = 0
            Start Timer1
           End If
        Else
           Temp2a = 0
           Temp2b = 0
    
           If Temp2c = 1 Then
             Temp2c = 0
                Set Portb.1
                Stop Timer1
                Cls                                             'Tu można przeliczyć wyświetlanie na to co się chce- teraz wyświetla
                Lcd Timer1                                      'liczbę impulsów z Timer1
                'Wait 1
            End If
        End If
      Flaga0 = 0
      End If
    Loop
    End
    
    Petelka:
      Flaga0 = 1
      Return
    


    Jak napisałem- ustawienia prescaler dobierz doświadczalnie.
    Różne rzeczy można jeszcze zmienić i poprawić- sprawdzaj.
    Masz szkielet do dalszej pracy.
  • #22 7421314
    Fsoliebhaber
    Poziom 17  
    Witajcie ponownie. Problem wątku nie umarł, żyje sobie po cichu. Niestety nadchodzące święta wyjątkowo mocno absorbują czas człowieka... sami rozumiecie.

    Ale do rzeczy. Wczoraj w korzystając z wolnej chwili w końcu zrobiłem płytkę testową do sprawdzenia programu napisanego przez janbernat.

    Kupiłem drugą atmegę8, wyświetlacz, spreparowałem wszystko jak trzeba iiii... niespodzianka!
    Otóż nowy procek (programowany przez programator USB) owszem programuje sie ale wykonywany program(dowolny, np miganie diodą LED) wykonuje 8 razy wolniej.
    Tj dioda LED zapala się na 8 sekund zamiast na 1sekundę. Włożony w podstawkę procek drugi programuje się poprawnie (tak samo jak powyższy) ale program jest wykonywany z właściwą "prędkością".

    Czy możliwe, że procek kupiłem uszkodzony czy to moja nieudolność wychodzi?
    Bo na zdrowy rozsadek powinno być wszystko OK ale zamieniając identyczne procesory w podstawkach osiągam różne efekty.

    Spotkał się ktoś z czymś takim?
  • #23 7421802
    janbernat
    Poziom 38  
    Fusebit C powinien być disable.
    A jest enable i procesor chodzi na 1Mhz.
    Wszystko normalne, tak jest fabrycznie ustawiony.
    W programatorze wchodzisz w zakładkę fusebits i ustawiasz fusebit C na disable.
    NIE RUSZAJĄC INNYCH FUSEBITÓW!
    P.S
    Sprawdzony program wysłałem Ci w mailu.
    Ale jest on przeznaczony do pomiaru czasu z fototranzystorów a nie z przełączników- nie ma eliminacji drgań styków.
  • #24 7425722
    Fsoliebhaber
    Poziom 17  
    Dziękuję za pomoc. Poradziłem sobie ciut wcześniej za pomocą programu burnomat. Swoją drogą bardzo przejrzysty program i prosty w obsłudze.
    Oczywiście uprzednio sporo czytając, że ów problem leży w tych magicznych fusebitach (o których do tej pory nie musiałem nic wiedzieć, bo procesor który dostałem z płytką testową był już odpowiednio "ustawiony"). Ahhh mógł się człowiek uczyć tej techniki mikroprocesorowej ciut wcześniej. Teraz chyba jestem za stary na takie rebusy.

    Ale już wszystko działa. Gdy nadejdą wolne dni, zabieram się do pracy!

    janbernat -> nie dostałem od Ciebie nic:(

    Pozdrawiam Konrad
  • #25 7625091
    mezcook
    Poziom 12  
    Odświerzę trochę temat. Ja konkretnie muszę w miarę precyzyjnie zmierzyć prędkość obrotową w możliwie krótkim czasie. prędkość w zakresie 750-6500 obr/min. Dysponuje tarczą 25 nacięć na obrót i fotokomórką szczelinową która daje ttl na wyjściu. Puki co ttl generuje z generatora ne555 by uniknąć błędów pomiarów związanych ze stroną mechaniczną systemu. Puki co mierzyłem prędkość zliczając impulsy w konkretnym czasie. Przy czasie 100ms uzyskam dokładność rzędu 24 obr/min. Niestety chciał bym osiągnąć większą dokładność pomiaru. Nie chcę zliczać czasu między dwoma impulsami, lecz co 5 impulsów. Na podstawie propozycji napisanej przez janbernat pomyślałem o czymś takim. Czy to będzie działać ?

    $crystal = 8000000
    $regfile = "Attiny2313.dat"
    
    Dim X As Byte
    
    Config Timer0 = Counter , Edge = Rising
    Config Timer1 = Timer , Prescale = 1024
    
    Config Int0 = Rising
    
    Enable Interrupts
    Enable Int0
    
    Do
    On Int0 Startuj
    IF Tcnt0 = 5 Then Goto Stopuj
    
    Lcd Tcnt1
    
    
    Loop
    End
    
    Startuj:
    Timer0 = 0
    Timer1 = 0
    Start Timer0
    Start Timer1
    Return
    
    Stopuj:
    Stop Timer0
    Stop Timer1
    Return
  • #26 7627163
    LED5W
    Poziom 34  
    Proponuję zamiast mierzyć czas 5 obrotów sprawdzać ilość impulsów co stały czas.
  • #27 7628627
    janbernat
    Poziom 38  
    Aaa- przypomniałem sobie.
    To jest różnica- migawka strzela raz- i trzeba zmierzyć ile czasu była otwarta.
    Strzał jest jeden i niepowtarzalny.
    Tzn. można go wykonać wiele razy i za każdym razem zmierzyć ten czas.
    Ale to jest urządzenie mechaniczne i za każdym razem ten czas będzie inny.
    A tu- odwrotnie.
    Możemy sobie wygenerować w procesorze stały czas bramkowania- jak napisał LED5W- i mierzyć zmienną liczbę impulsów czyli obrotów.
    Im dłużej będziemy mierzyć tym dokładniej zmierzymy ŚREDNIĄ wartość obrotów w tym przedziale czasu.
    Problem co jaki czas potrzebna jest nam ta wartość.
  • #28 7628964
    mezcook
    Poziom 12  
    Właśnie o to chodzi... wartość musi być mierzona możliwie często i dokładnie niestety bez przetestowania układu nikt z nas nie będzie w stanie ocenić jaki sposób będzie dobry. A jeśli chodzi o moje wyliczenia to:
    przykład1.
    t=100ms=0.1s - czas pomiaru
    25 imp na obrót
    1000 RPM -> 1000*0.1*25=41.7 impulsów w ciągu 0.1 sec.
    rozwarzamy dwa możliwe przypadki:
    1. zliczył 41 impulsów ->(41*60)/(25*0.1)=984 obr/sec
    2. zliczył 42 impulsy ->(42*60)/(25*0.1)=1008
    1008-984=24
    przykład2.
    t=100ms=0.1s - czas pomiaru
    25 imp na obrót
    6000 RPM -> 6000*0.1*25=250 impulsów w ciągu 0.1 sec.
    rozwarzamy dwa możliwe przypadki:
    1. zliczył 250 impulsów ->(250*60)/(25*0.1)=6000 obr/sec
    2. zliczył 251 impulsów ->(251*60)/(25*0.1)=6024
    6024-6000=24
    W praktyce tez tak było. Pokazywał stałą wartość obrotów a od czasu do czasu mignęło coś - to jest właśnie sytuacja kiedy zliczył jeden impuls więcej.
    t=0.1s uważam za maksimum więc chcę usprawnić metodykę pomiarów.
    Te 5 impulsów to tak z głowy - konkretną wartość ustaliłbym doświadczalnie.
  • #29 7629368
    LED5W
    Poziom 34  
    W takim razie:
    mezcook napisał:
    Czy to będzie działać ?

    Nie. Konfigurujesz przerwanie w pętli zamiast przed. Brakuje END IF... Gdybyś spróbował to skompilować to byś wiedział... *

    Pamiętaj, że polecenie LCD trwa bardzo długo.

    * - wycofuję
  • #30 7629703
    janbernat
    Poziom 38  
    Nieee- to się kompiluje.
    Sprawdziłem.
    To jest stary, klasyczny problem.
    Czętościomierz- czasomierz.
    Dokładność zależy od częstotliwości- czasu.
    Przy dużej częstotliwości otwieramy "okno"- bramkę i zliczamy ile tych impulsów było.
    Przy małej częstotliwości mierzymy czas między impulsami a bramka- pracująca teraz jako generator impulsów- zlicza czas między nimi.
    Dokładność zawsze zależy od czasu pomiaru.
    No i od częstotliwości.
    Na to są wzory- ale sami sobie znajdźcie w wikipedii- ja już nie pamiętam.
REKLAMA