Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMEGA8][BASCOM] - Zliczanie czasu pracy Atmegi / RTC

maciejbilu 09 Lis 2013 22:29 3252 19
  • #1 09 Lis 2013 22:29
    maciejbilu
    Poziom 11  

    Witam,
    Temat zliczania czasu na mikro kontrolerach to temat rzeka, jednak wałkując forum chciałem się dowiedzieć najbardziej podstawowych rzeczy. Takich jak np. podpięcie układu Real Time Clock do Atmegi i sposób pozyskiwania danych z niego.
    Bardzo proszę o wyrozumiałość co do pytań.

    Ideą, dlaczego zadaje pytanie jest liczenie czasu pracy... Atmegi. Mówimy tu o setkach jak nie tysiącach godzin z rozdzielczością najlepiej 1 minuta. Chcę aby układ (oczywiście w tle) zliczył do 6 minut, co jest równowartością 1/10 godziny, a następnie wygenerował przepełnienie. 10 przepełnień wygeneruje przepełnienie dla 1 godziny. Dopuszczam spory błąd bo 1 minuta na 1 godzinę. Zapis godzinowy byłby ostateczną najwyższą wartością. Wartości musiałyby być zapisywane w pamięci ERAM, aby po włączeniu zasilania atmega dodawała kolejne jednostki czasu do zapisanych.

    Do odczytu czasu pracy służyła by funkcja Print lokująca sygnał w porcie TX Atmegi.
    Funkcja Print umieszczona byłaby w głównej pętli programu i wykonywała się co mniej więcej 2 sek.

    Reasumując pytania:
    1.Czy podłączenie portów SDA do SDA i SCL do SCL załatwia fizyczną sprawę komunikacji z Atmegą? Pomijam kwestię elementów peryferyjnych RTC.
    2. Jak wygląda sprawa doboru kwarcu dla RTC? Program dla Atmegi (i sama Atmega bez zewnętrznego kwarcu) jest napisany i pracuje na 1MHz. Czy Atmega będzie odbierała dane poprawnie z RTC jeżeli ten będzie na innym kwarcu?
    3. Jak wygląda sprawa komunikacji? Jak programowo odebrać dane z RTC? Czy za pomocą funkcji #GET ... ? Jak jeżeli chcę odczytywać tylko kolejne minuty?
    4. Jak załatwić zliczanie czasu w tle? Czy załatwią sprawę INTERRUPTS ?
    5. Zadeklarowanie zmiennej np. W jako:
    Dim W as ERAM Byte
    spowoduje, że zostanie ona zapisana w pamięci nieulotnej. Jak ją z niej potem odzyskać i wysłać za pomocą funkcji PRINT ? Czy wystarczy po prostu przywołać ją (upraszczając formułę) Print, W ?

    Bardzo dziękuję

    0 19
  • #3 10 Lis 2013 21:32
    maciejbilu
    Poziom 11  

    Ok, a jak to się będzie miało do samego programu napisanego na 1Mhz ?
    Nigdy jeszcze z zewnętrznym kwarcem do czynienia nie miałem. W jaki sposób należy programowo z niego skorzystać?
    Czy do kwarcu należy podłączyć jakieś kondensatory ?

    0
  • #4 19 Lis 2013 20:55
    gandzia
    Poziom 11  

    Próbuję odpalić zegarek RTC, ale brak reakcji, czy ktoś mógłby coś podpowiedzieć? Pomóc w uruchomieniu?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 19 Lis 2013 21:23
    BlueDraco
    Specjalista - Mikrokontrolery

    delay w przerwaniu?! Nie przesadzasz? Dlaczego 2 razy ustawiasz TOIE2? Po co zerujesz TCNT2? Po co ustawiasz TOV2?

    Spróbuj najpierw sprawdzić ten kod z taktowaniem timera z podstawowego zegara, nie z kwarcu zegarkowego. Wtedy będziesz wiedział, czy problem leży w oprogramowaniu, czy w braku oscylacji.

    0
  • #6 19 Lis 2013 21:45
    gandzia
    Poziom 11  

    Po małych zmianach działam na czymś takim. Pomimo taktowania z wewnętrznego kwarcu nie widać efektu. Jakiegokolwiek.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 20 Lis 2013 06:05
    emarcus
    Poziom 34  

    maciejbilu napisał:
    Ok, a jak to się będzie miało do samego programu napisanego na 1Mhz ?
    Nigdy jeszcze z zewnętrznym kwarcem do czynienia nie miałem. W jaki sposób należy programowo z niego skorzystać?


    Normalnie Timer2 jest taktowany z tegosamego zegara co microkontroller. Aby uzyskac taktowanie z rezonatora 'zegarkowego' podłączonego do pinów XTAL1/XTAL2, potrzebujesz zmienic jego tryb na pracę asynchroniczną (Bit AS2=1 w rejestrze ASSR). Wtedy cały system jest taktowany z wewnętrznego oscylatora z częstotliwiścią określoną przez fusebity CKSEL/SUT (1MHz, 2MHz, 4MHz, 8MHz), a tylko Timer2 otrzymuje 32768 Hz.

    oto przykład kodu:

    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Cytat:


    Czy do kwarcu należy podłączyć jakieś kondensatory ?


    Nie, nie trzeba; patrz Nota Katalogowa:
    AVR4100: Selecting and testing 32 kHz crystal oscillators for AVR

    www.atmel.ca/Images/doc8333.pdf


    e marcus

    0
  • #8 21 Maj 2014 22:11
    maciejbilu
    Poziom 11  

    Witam,
    emarcus - bardzo ci dziękuję za podpowiedź. Dowiedziałem się ciekawego polecenia :-). Nie miałem ostatnio czasu, ale wczoraj ruszyłem z tematem.
    Wszystko chula - sekunda się odlicza. Jutro sprawdzę dokładność.

    Do pełni szczęścia brakuje mi jednego. Jak przy przepełnieniu SEC równym 60 sek wyzerować ją.

    Poniżej kod z zaznaczonym miejscem o które mi chodzi.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #9 22 Maj 2014 06:00
    yokoon
    Poziom 28  

    emarcus napisał:
    maciejbilu napisał:
    Ok, a jak to się będzie miało do samego programu napisanego na 1Mhz ?
    Nigdy jeszcze z zewnętrznym kwarcem do czynienia nie miałem. W jaki sposób należy programowo z niego skorzystać?


    Normalnie Timer2 jest taktowany z tegosamego zegara co microkontroller. Aby uzyskac taktowanie z rezonatora 'zegarkowego' podłączonego do pinów XTAL1/XTAL2, potrzebujesz zmienic jego tryb na pracę asynchroniczną (Bit AS2=1 w rejestrze ASSR). Wtedy cały system jest taktowany z wewnętrznego oscylatora z częstotliwiścią określoną przez fusebity CKSEL/SUT (1MHz, 2MHz, 4MHz, 8MHz), a tylko Timer2 otrzymuje 32768 Hz.

    oto przykład kodu:

    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Cytat:


    Czy do kwarcu należy podłączyć jakieś kondensatory ?


    Nie, nie trzeba; patrz Nota Katalogowa:
    AVR4100: Selecting and testing 32 kHz crystal oscillators for AVR

    www.atmel.ca/Images/doc8333.pdf


    e marcus


    Witam.
    Otóż zrobiłem taki zegarek wraz z kalendarzem tj. Atmega8 - LCD 16*2 - kawrc 32768. Kondensatory przy kwarcu musiałem dołożyć, ponieważ układ "wariował" tzn. wyświetlał głupoty. Kondensatory dobierałem w zakresie od 10pF do 18pf.

    U mnie wyszło 12pF i 15pF pracuje dokładnie, od tych kondensatorów załeży dokładność pracy zegarka w czasie.

    0
  • #10 26 Maj 2014 09:36
    maciejbilu
    Poziom 11  

    Czas zmierzony. Na 4 godziny Atmega spieszyła się aż 8 sekund.
    Wynika to zapewne z tego, że kwarc jest ok 2 cm od nóżek - niestety innej możliwości nie ma. Trzeba dołożyć kondensatory.

    Czy ktoś wie dlaczego nie chce mi się zerować wartość sekund co te 60 sekund?

    Bo tak to licznik zlicza te sekundy idąc w tysiące :/.

    0
  • #11 30 Maj 2014 21:44
    emarcus
    Poziom 34  

    maciejbilu napisał:

    Czy ktoś wie dlaczego nie chce mi się zerować wartość sekund co te 60 sekund?



    Zmień nazwę zmiennej sekund ("Sec") na coś innego np: "sec_", albo "sek" (bez znaków " ").
    Bascom akceptuje instrukcje ASM, gdzie "SEC " oznacza "Set Carry", zatem prawdopodobnie może tu wystąpic konflikt.
    Nie bardzo rozumiem po co ta cała kombinacja.
    Zliczania czasu zalączenia możesz dokonac w prosty sposób wykorzystując wbudowany w Bascom "SOFT Clock" z zastosowaniem Timera2 i 32 kHz rezonator.

    Częściowy przykład kodu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus

    0
  • #12 22 Cze 2014 21:37
    maciejbilu
    Poziom 11  

    Hej,
    Ahaaaaa.... i jeszcze raz AHAAAA ! Dziękuję :-)
    No tak, czytałem o tym poleceniu SOFT, ale nie bardzo wiedziałem jak można go użyć. Niby działa, ale Atmega wysyła mi ciągle czas 00:00:00. Nic nie zlicza.

    Czy możecie sprawdzić czy dobrze zapisałem wytyczne do zapisu przy zaniku zasilania?
    Nie wiem też czy dobrze zainstalowane są kondensatore podtrzymujące (podeslę później schemat. Wsadzony jest 220uF 10V na wyjściu za stabilizatorem 5V LM2940 (+ dioda jednokierunkowa).

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #13 23 Cze 2014 06:19
    emarcus
    Poziom 34  

    maciejbilu napisał:
    Hej,
    Niby działa, ale Atmega wysyła mi ciągle czas 00:00:00. Nic nie zlicza.


    Bo prawdopdobnie jest błędna instrukcja warunkowa, albo nie właściwy sygnał na wejściu sensorowym processora. Potrzebny diagram

    Cytat:

    Czy możecie sprawdzić czy dobrze zapisałem wytyczne do zapisu przy zaniku zasilania?


    Nie,...... to znaczy; możemy sprawdzic, ale instrukcje są błędne i nie kompletne.


    Cytat:

    Nie wiem też czy dobrze zainstalowane są kondensatore podtrzymujące (podeslę później schemat. Wsadzony jest 220uF 10V na wyjściu za stabilizatorem 5V LM2940 (+ dioda jednokierunkowa).


    Jeżeli całoś jest zasilana ze źródła o napięciu Vrms = 14V to kondensator electr. przed regulatorem dasz 35V, a za regulatorem i diodą (Schottky) daj 16 V.

    e marcus

    0
  • #14 23 Cze 2014 19:54
    maciejbilu
    Poziom 11  

    Tak wygląda schemat funkcjonalny obecnego układu testowego.

    Na pająka wlutowana jest dioda D2 i D1.
    Kwarc jest daleko od nóżek więc dodane będą kondensatory.

    Instrukcje są błędne i nie kompletne... - troszkę nie wiem co jest nie kompletne i błędne. Bazując na tematach z podobnym problemem wyczytałem, że to powinno wystarczyć.

    Czyli 25V i 16V - a pojemności będą ok? Podtrzymają te 10ms ?

    0
  • #15 24 Cze 2014 02:18
    emarcus
    Poziom 34  

    maciejbilu napisał:
    Tak wygląda schemat funkcjonalny obecnego układu testowego.

    Na pająka wlutowana jest dioda D2 i D1.
    Kwarc jest daleko od nóżek więc dodane będą kondensatory.



    Kilka spostrzeżeń:
    1. Condensator C6 ; włączony w odwrotnej polaryzacji. (!?)
    2. Rezystor(Reset) ; 100k zamiast 10k
    3. Także rezystory podciągające do GND R13 i R14 = 100k zamiast powiedzmy...10k ; jaka ich rola?
    4. Condensatory C6 i C8
    Cytat:

    Czyli 25V i 16V - a pojemności będą ok? Podtrzymają te 10ms ?


    Trudno tu coolwiek gwarantowac; popatrz:
    -przy zaniku napięcia 14V twój sensor (dzielnik napięcia) jest zasilany energią zgromadzoną w C6, której jest około 8 razy wiecej niż w C8 i wystarczy jej na bardzo długo zasilając także C8 poprzez regulator napięcia. Czy uda ci się "wyłapac" poprawnie moment niekontrolowanego lub słabo kontrolowanego zaniku/spadku napięcia zasilania 14V ?

    5. W programie:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    - dla Mega8 - Internal Vref =2.56V; więc nie będzie porównania nawet przy 14 V

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Stan pinu wejściowego C.4 kontrolujesz 'zworką dolną' (z prawej strony diagramu); - jeżeli brak zworki na pinach 1-2, program traci sens- "liczyłby" (?) czas pracy także przy odłączonym lub zerowym 5 VDC za diodą D2.

    Korrekta: zworka na pin1-2 oraz

    If Pinc.4 = 1 Then
    '.....

    Cytat:

    Instrukcje są błędne i nie kompletne... - troszkę nie wiem co jest nie kompletne i błędne. Bazując na tematach z podobnym problemem wyczytałem, że to powinno wystarczyć.

    No więc:
    Instrukcja niekompletna:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Instrukcja popawiona:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W podobnej formie winien wyglądac zapis do EEPROM

    e marcus

    0
  • #16 24 Cze 2014 13:22
    maciejbilu
    Poziom 11  

    Hej,

    1. C6 - racja! błąd w schemacie.
    2 i 3. Wszystkie rezystory 0603 mają wartość 100K (tam nigdzie nie ma 10K)... !?
    A jaka ich rola... ideą jest aby wejścia do Atmegi nie wisiały w powietrzu tylko były podciągnięte do potencjału "niskiego" (przy braku zworki oczywiście).

    4. Rzeczywiście - dopiero jak zwróciłeś uwagę to zauważyłem, że ta C6 zasila mi obwód dzielnika. W sumie tej C6 być nie musi... w nocie katalogowej LM2940 wystarczy konsator ceramiczny na wejściu.

    5. Cholera... :-). Zmieniam dzielnik na 100K i 36K.

    6. Zaraz. W programie wpisałem polecenie, że jeżeli na PINC.4 jest "zero" wtedy ma się wykonywać program wraz ze zliczaniem czasu. I to działa, dioda świecąca sygnalizuje mi działanie.

    7. Instrukcji zapisu/odczytu EPROM fizycznie nie wpisywałem (jeszcze). Chodziło mi jedynie czy samo przerwanie zareaguje prawidłowo i skoczy do "zapisu". Ale bardzo dziękuję. Zdaje się, że załapałem swoje błędy.





    P.S. A jak to jest z napięciem z kondensatora C8 ? Po wyłączeniu zasilania podtrzyma on atmegę, ale jakie napięcie na niej będzie? Czy nie rozsądniej byłoby dać jednak ten C6 przed stabilizator ale tuż przed nóżką plusową kondensatora od strony pinów zasilania, a tuż za rozgałęzieniem do dzielnika wsadzić diodę?

    0
  • #17 02 Lip 2014 17:37
    maciejbilu
    Poziom 11  

    Hej,
    Nie mogę zmusić Atmegi do zliczania tego czasu.
    Wpisałem polecenia wczytywania czasu z EPROM i zapisu. Różnica jest teraz taka, że co sekundę dostaję:
    255:255:255

    Kondensator elektrolityczny przed stabilizatorem został wylutowany.
    Dzielnik zmieniony. Teraz przy 14Vin jest 3,6V na sensorze. 2,56 jest osiągane dokładnie przy 10,00Vin. Niestety Atmega nic sobie z tego nie robi i przy spadku poniżej 10V dalej tkwi w pętli głównej. A więc coś jest nie tak z przerwaniem.
    Coś gdzieś źle wpisałem.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [godziny] 15 [minuty]:

    Chodzi i zlicza. Tylko nie wiem dlaczego :-).
    Zamieniłem miejscami ENABLE ACI z ON ACI ZAPIS.
    Uszczegółowiłem bity rejestru ADMUX.

    Przy nagłym odcięciu zasilania z 14V IN czas jest zapisywany do EPROM.
    Natomiast coś dalej jest nie tak z przerwaniem ACI.
    Z badań wynika, że jak powoli obniżam napięcie to przerywa przy 4,5V IN - ale też nie wiem czy to przerwanie czy po prostu za niskie napięcie dla stabilizatora. Wtedy zapis jest ale nieprawidłowy/przekłamany - zapisują się inne wartości.
    Jeżeli jest to przerwanie to oznaczałoby, że wewnętrzne referencyjne jest ok. 1,2V a nie 2,56V.
    Atmega8 Datasheet - tabelka 16, str. 42

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #18 02 Lip 2014 18:26
    emarcus
    Poziom 34  

    [quote="maciejbilu"]Hej,


    Cytat:

    Wpisałem polecenia wczytywania czasu z EPROM i zapisu. Różnica jest teraz taka, że co sekundę dostaję:
    255:255:255


    Wyświetlał ci wszędzie 255 bo taka jest wartośc każdej komórki "surowego" EEPROM (FF).
    Aby tego uniknąc proponowałem 'startowe wyzerowanie':

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Skoro EEPROM nie jest już "pusty" to nie powinno byc problemu z odczytem ostatnio wpisanych doń wartości.

    Cytat:

    Przy nagłym odcięciu zasilania z 14V IN czas jest zapisywany do EPROM.
    Natomiast coś dalej jest nie tak z przerwaniem ACI.
    Z badań wynika, że jak powoli obniżam napięcie to przerywa przy 4,5V IN - ale też nie wiem czy to przerwanie czy po prostu za niskie napięcie dla stabilizatora.

    Spróbuj zmienic:

    Config Aci = On , Compare = On , Trigger = Rising
    oraz
    dodaj wyłączony capacitor C6, a sensor (dzielnik napięcia) włącz przed diodą D1.
    Dzielnik napięcia zdaje się winien byc w odwróconej konfiguracji (36k od strony GND, a 100k od strony "+")...(??)

    e marcus

    0
  • #19 06 Lip 2014 12:45
    maciejbilu
    Poziom 11  

    Hej,
    Rezystory są źle oznaczone na schemacie - przepraszam.
    Wlutowane są prawidłowo - napięcie pomierzone względem masy jest prawidłowe.

    Dzielnik zmieniłem i jest przed diodą. Dodanie kondensatora C6 za diodą powodowało, że przy rozłączeniu zasilania mega nic nie zapisywała i zliczała od zera.
    Podobnie jak wpisanie polecenia RISING.

    Odlutowałem C6 i zmieniłem polecenie na FALLING. Zamieniłem dzielnik tak jak był na początku a więc 100K i 18K tak aby comparator wyzwalał się przy 1,25V. Efekt? Żadnego efektu.
    Tzn. Przy szybkim rozłączeniu zasilania Atmega zapisuje prawidłowo dane. Przy zmniejszaniu napięcia poniżej 4V zapisują się bzdury.
    Przy napięciu 5,5V nagłe rozłączanie zasilania powoduje prawidłowy zapis.

    Wychodzi na to, że comparator wyzwala się jakoś poniżej 5V... Nie czaje.

    0
  • #20 07 Lip 2014 03:55
    emarcus
    Poziom 34  

    maciejbilu napisał:
    Hej,


    Dzielnik zmieniłem i jest przed diodą. Dodanie kondensatora C6 za diodą powodowało, że przy rozłączeniu zasilania mega nic nie zapisywała i zliczała od zera.
    Podobnie jak wpisanie polecenia RISING.

    Odlutowałem C6 i zmieniłem polecenie na FALLING. Zamieniłem dzielnik tak jak był na początku a więc 100K i 18K tak aby comparator wyzwalał się przy 1,25V. Efekt? Żadnego efektu.
    Tzn. Przy szybkim rozłączeniu zasilania Atmega zapisuje prawidłowo dane. Przy zmniejszaniu napięcia poniżej 4V zapisują się bzdury.
    Przy napięciu 5,5V nagłe rozłączanie zasilania powoduje prawidłowy zapis.

    Wychodzi na to, że comparator wyzwala się jakoś poniżej 5V... Nie czaje.


    To troche jest bez sensu..
    Musi byc gdzieś błąd; albo dioda D1 przewodzi w dwu kierunkach (możliwe przebicie złącza?...) albo błąd w programie.
    Interrupt winien reagowac na zbocze rosnące (RISING).
    Chodzi tu o zmiane poziomu ACO, które zmienia stan logiczny na (1) przy przekraczaniu Vin w dół względem granicznych wartości napięcia bandgap (BG).
    Ustawienie na Toggle jest ryzykowne, gdyż może reagowac każdorazowo (w 2-ch kierunkach) przy oscylacji napięcia na wejściu neg. (AIN1) w okolicy napięcia bandgap ref.

    Odnośnie napięcia BG (bandgap).
    Nie wiem czym się zasugerowałem, kierując że jest ono równe wewn. napięciu referencyjnemu ADC (!) Tak nie jest....
    Wewn. napięcie referencjne bandgap (BG) dla Comparatora w Mega8 jest 1.15 V ÷ 1.4 V
    Wewn. napięce referencyjne 2.56V dla ADC jest generowane z tego powyżej.

    Spróbuj jeszcze zmienic:
    Config Aci = On , Compare = off , Trigger = Rising
    oraz linia:
    Acsr.acbg = 1

    Masz ją wpisaną wyżej, lecz powinna byc w tej kolejności: po "Config Aci..."
    W tej configuracji "compare = ..." odnosi sie do włączenia/wyłączenia (ACIC) Input Capture dla Timera1, co u ciebie nie występuje

    e marcus

    0