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

[BASCOM][atmega 32] rejestrator czasu

16 Wrz 2009 16:31 2199 10
  • Poziom 14  
    Ponownie chciałbym zwrócić się do kolegów z prośbą o pomoc.

    Chcę zrobić rejestrator czasu, zdarzeń występujących na przerwaniu.
    Układ miałby zapisywać do pamięci eeprom datę i godzinę wystąpienia zdarzenia.
    czyli zmienne

    _mies, _dzień, _godz, _minuta

    Myślę sobie tak. Skoro mam serie danych składającą się z czterech zmiennych więc muszę zarezerwować na każdą serię po 4 bajty eeprom Jakoś to podzielić, żeby tymi czwórkami mi potem odczytywało ale jak to zrobić ????... tutaj utknąłem

    Nie mam nawet pomysłu jak to można zrealizować. Próbowałem pętlami for next (kilka pętli w jednej ) ale sam się zapętliłem szybciej niż się spodziewałem Wydaje mi się też, że taka pętla to nie do końca właściwe rozwiązanie. Prosiłbym o podesłanie mi jakiegoś pomysłu. Na pewno wielu z Was budowało już takie układy i mają jakieś doświadczenie

    Właśnie doczytałem coś o tablicach w Bascomie, ale nie wiem jak się tym posługiwać Czy jako jeden rekord mam stworzyć tablicę z czterech elementów Ale jak to później zapisać w eeprom
  • Pomocny post
    Poziom 19  
    No np mozesz zrobić cos w tym stylu:

    Code:
    Dim T(4) as byte
    
    Dim i as byte


    For i = 1 to 4
     writeeprom T(i), i
    next i 


    W T(1) - T(4) umieścisz sobie dane (mintuty, godziny czy co tam jeszcze chcesz)
  • Poziom 14  
    Dzięki! A jest jakiś prostszy lub inny sposób na systematyzowanie tych danych po cztery czy tylko ten


    Code:
    For  I  =  1 to  100 Step 4 
    
    ..........
    Next I


    bo muszę wtedy zapisywać wszystkie komórki pamięci choć jest to niepotrzebne
  • Pomocny post
    Poziom 19  
    Systematyzować? Chodzi o to że chcesz zapisywać dane cały czas do nowych komórek? Sprecyzuj co chcesz zrobić :D
  • Pomocny post
    Poziom 26  
    Możesz rozwinąć to "systematyzować". Warto jedną(dwie) komórkę poświęcić by wskazać na której pozycji jest ostatni zapis lub ma być następny. Jeśli wystąpi zdarzenie to należy odczytać tą komórkę wykonać zapis np. 4 kolejnych komórek po czym zwiększyć i zapisać wskaźnik.
  • Poziom 14  
    Chodziło mi właśnie o systematyzowanie komórek po 4 żeby przy odczycie nie rozjechały mi się adresy.

    Zgadza się Właśnie o to mi chodziło Macie rację warto poświęcić jedną komórkę na wskaźnik. Właśnie tego mi brakowało Jeszcze nie wiem jak to zrobię, przede mną cała noc zabawy, dam jutro znać jak się udało , ewentualnie na czym utknąłem.
  • Pomocny post
    Poziom 36  
    Jarosław J napisał:
    Chodziło mi właśnie o systematyzowanie komórek po 4 żeby przy odczycie nie rozjechały mi się adresy.

    Zgadza się Właśnie o to mi chodziło Macie rację warto poświęcić jedną komórkę na wskaźnik. Właśnie tego mi brakowało Jeszcze nie wiem jak to zrobię, przede mną cała noc zabawy, dam jutro znać jak się udało , ewentualnie na czym utknąłem.


    Nie potrzebujesz zuzyc az 4 bajtow pamieci na kazdy event (zdarzenie).
    Mozesz czas zapisywac w formacie 24-godzinnym (patrz 'military time') doba zaczyna sie o godz 0000 a konczy na 2400, wtedy wystarczy 1 bajt na rejestr czasu i podobnie mozesz rejestrowac date.
    Kazdy wpis (address) do mem. increamentujesz co dwa bajty i traktujesz to jako packet, wtedy nie pogubisz sie kompletach zapisu.

    e marcus
  • Poziom 14  
    Obawiam się ze bascom nie obsługuje tego automatycznie a z tym sumowaniem i oddzielaniem tego czasu w jedną zmienną może być więcej zachodu niż warte te dwa bajty więcej na jedno zdarzenie. Ale dzięki za podpowiedź
  • Poziom 14  
    Zrobiłem, udało się, zamieszczam gotowca, jeśli ktoś będzie potrzebował:


    Code:
    Odczytzdarzen:
    
    Do
       Home
       Lcd "Odczytuje !"
    For J = 200 To 995 Step 5
    Do
    If J > 995 Then
    J = 200
    Numerzdarzenia = 1
    End If
    For K = 0 To 4
    L = J + K

    If K = 0 Then Readeeprom Godzzd , L
    If K = 1 Then Readeeprom Minzd , L
    If K = 2 Then Readeeprom Dziezd , L
    If K = 3 Then Readeeprom Miezd , L
    If K = 4 Then Readeeprom Rodzajzdarzenia , L
    Next K

    If Rodzajzdarzenia = 255 Then Srodzajzdarzenia = " PUSTE "

       Locate 2 , 1


        if Godzzd = 255 Or Minzd = 255 Or Dziezd = 255 Or Miezd = 255 Then
         Lcd Numerzdarzenia ; " --/-- --:-- " ; Srodzajzdarzenia
         Else
         Lcd Numerzdarzenia ; " " ; Miezd ; "/" ; Dziezd ; " " ; Godzzd ; ":" ; Minzd ; " " ; Srodzajzdarzenia
         'End If
         Waitms 200
    If S1 = 0 Then
    Incr Numerzdarzenia
    Cls
    Next J
    End If


    If S4 = 0 Then
    Pomocniczaustaw = 0
    Odczyt = 0
    Numerzdarzenia = 1
    Return
    End If
    Loop
    Loop
    '========================================Zapis zdarzen
    Zapiszdarzen:
    Cls
    Readeeprom Ostatnia , 1000

    Locate 1 , 1
    Lcd "ost=" ; Ostatnia
    J = Ostatnia + 5
    Locate 2 , 1
    Lcd "j" ; J
    Wait 2
    Cls
    For K = 0 To 4
    L = Ostatnia + K
    If K = 0 Then Writeeeprom _god , L
    If K = 1 Then Writeeeprom _min , L
    If K = 2 Then Writeeeprom Dzien , L
    If K = 3 Then Writeeeprom Mies , L
    If K = 4 Then Writeeeprom Rodzajzdarzenia , L
    Locate 1 , 1
    Lcd "K="                                                    'k
    Locate 2 , 1
    Lcd "l=" ; L
    Wait 1
    Next K
    Ostatnia = Ostatnia + 5
    Writeeeprom Ostatnia , 1000
    Reset Led2
    Return


    Dodano po 14 [minuty]:

    A może ma ktoś pomysł jak takie dane skompresować do jednej zmiennej
    na przykład godz, 23:35 Może jakoś binarnie, ale nie mam pojęcia jak to się robi A jak to potem oddzielić, w sumie z 1024 bajtów atmegi32 mogę zapisać ponad 160 zdarzeń. (reszta używana jest przez inne dane ) Gdyby udało się łatwo skompresować i zdekompresować godzinę i datę a jeszcze lepiej dołączyć też występującą w moim przykładzie jeszcze jedną zmienną - podwoiłbym ilość zdarzeń możliwych do zapisania
  • Pomocny post
    Poziom 26  
    Tak to da się zrobić. Godziny 5 bitów, minuty 6 bitów, miesiąc 4 bity, dzień 5 bitów, rodzaj x bitów. Razem 20 bitów + x. Kodowanie:
    Code:

    Dim temp as long
    '....
    temp = godziny
    shift temp, left, 5
    temp = temp OR minuty

    shift temp, left, 6
    temp = temp OR miesiac


    Działa jak widać dodajemy przesuwamy o odpowiednią ilość bitów i następną zmienną dodajemy w puste miejsce. Jeśli na rodzaj przeznaczysz 4 bity to zmieścisz całość na 3 bajtach.
  • Poziom 14  
    To może się udać, muszę pokombinować nie bawiłem się dużo na operatorach logicznych i na przesuwaniu Nie wiem też do końca ile bym zaoszczędził W wolnej chwili pokombinuję i napiszę o wynikach