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.

pcf8583 i atmega8 - minuty się zerują

szwester 30 Lip 2016 20:13 930 15
  • #1 30 Lip 2016 20:13
    szwester
    Poziom 8  

    Witam, mam mały problem: chcę odczytać minuty z układu pcf8583. Wartość tą odczytywałam co sekundę z przerwania INT0, tak samo jak sekundy, tyle że sekundy pokazuje mi dobrze, a minuty się zerują po 10 s. Jak zaczyna się kolejna minuta, to znowu ta dobra wartość mi się pokazuje przez 10 s. a potem się zeruje. Z czego to może wynikać?

    0 15
  • #2 30 Lip 2016 20:30
    excray
    Poziom 39  

    Problem jest na 99% w kodzie. Załącz kod.

    0
  • #3 30 Lip 2016 20:34
    szwester
    Poziom 8  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 30 Lip 2016 20:53
    excray
    Poziom 39  

    Po pierwsze do zapisania 10 i wyżej jako string to trzeba 3 bajtów a nie dwóch bo jeszcze trzeba zapisać 0 na końcu jako znacznik końca stringu. Po drugie nie itoa, bo format danych pcfa to bcd.

    0
  • #5 30 Lip 2016 21:01
    szwester
    Poziom 8  

    Na razie próbowałam z mniejszą liczbą - żeby z 5 minut przeskoczyło na 6 :) A format z bcd mam już zmieniony w funkcji i2c_read_data.

    0
  • #6 30 Lip 2016 21:11
    excray
    Poziom 39  

    Do zapisania cyfry 10-99 jako string potrzebujesz bufora conajmniej 3-bajtowego.

    0
  • #7 30 Lip 2016 23:07
    szwester
    Poziom 8  

    Tak, wiem, ale na razie chciałam wpisać 5 a potem 6. Mam zamiar zmienić rozmiar tej tablicy :) tylko teraz na próbę nie dawałam większej.

    0
  • #8 30 Lip 2016 23:36
    excray
    Poziom 39  

    I weź tutaj pomóż człowiekowi, skoro on sam sobie nie chce pomóc. Kobieto ogarnij się. Czy Ty te bajty RAMu to wykupujesz za funty, czy jak, że je tak oszczędzasz i bronisz się przed ich dołożeniem? Skoro rezerwujesz na string "sek" 2 bajty RAM, a funkcja itoa wklepuje tam 3 bajty, to jak myślisz, co się dzieje z tym 3-cim bajtem?

    0
  • #9 30 Lip 2016 23:45
    szwester
    Poziom 8  

    Sorry - mój błąd. Szkoda tylko, że reagujesz od razu z taką złością, zamiast spokojnie wytłumaczyć. Nie wiedziałam, że funkcja itoa przekazuje 3 bajty. Sekundy mi działały, więc myślałam, że minuty też będą tak działać. W każdym razie dziękuję za pomoc :)

    0
  • #10 31 Lip 2016 00:02
    excray
    Poziom 39  

    To nie jest złość, tylko już nie wiem jak mam to tłumaczyć. 2 razy napisałem Ci, żebyś zwiększyła te tablice, a Ty 2 razy mi odpisujesz, że nie bo nie. Normalnie to już dla odczepnego byś to zrobiła, aby mi pokazać, że się mylę. Takie oszczędności w kodzie mszczą się.

    0
  • #11 31 Lip 2016 21:13
    atom1477
    Poziom 43  

    Problemem nie jest długość stringa na minuty, tylko długość stringa na sekundy.
    Wszystko wskazuje na to że jest on w pamięci umieszczony przed stringiem na minuty. Czyli prawie ciągle (bo dla wartości od 10 do 59) nadpisuje on wartością \0 pierwszy bajt minut, czyli wartość dziesiętną tych minut. Stąd minuty ciągle mają tylko wartości jednostek*, czyli zmieniają się od 0 do 9.
    Oczywiście mimo że długość stringa na minuty nie jest tutaj problemem, to jest problemem w ogóle więc i tak trzeba zwiększyć jego długość.

    *Zastanawiające jest tylko że taki string z \0 na samym początku jest w ogóle wyświetlany. Ale pewni wynika to ze sposobu sprawdzania treści stringa. Pewnie sprawdzanie jest po prostu nie w pętli while, tylko w do..while. Czyli pierwsze sprawdzenie jest dopiero po wyświetleniu pierwszego znaku i przesunięciu wskaźnika na kolejny znak. Więc zakończenie wyświetlania będzie dopiero po wykryciu kolejnego \0.

    0
  • #12 31 Lip 2016 23:14
    szwester
    Poziom 8  

    Ten string chyba nie ma zera na początku, aby godziny i minuty od 0-9 były tak wyświetlone musiałam potem dopisać odpowiedni fragment kodu. Tak to by mi się wyświetliło np. 7:3 zamiast 7:03.

    0
  • #13 31 Lip 2016 23:19
    excray
    Poziom 39  

    0 a '0' to dwie różne wartości.

    0
  • #14 31 Lip 2016 23:25
    szwester
    Poziom 8  

    Hmmm a czym one się różnią, jeśli można zapytać?

    0
  • #15 31 Lip 2016 23:34
    excray
    Poziom 39  

    Tym, że '0' to tak naprawdę 0x30 lub dziesiętnie 48:
    https://pl.wikipedia.org/wiki/ASCII
    Gdybyś zapisała w pamięci string str[]= {"012"} to tak naprawdę w pamięci miałabyś 4 bajty o wartości: 0x30, 0x31, 0x32, 0x00, gdzie ostatni bajt = 0 oznacza koniec ciągu, a pierwszy o wartości 0x30 oznacza '0' jako znak ascii.

    0
  • #16 31 Lip 2016 23:38
    szwester
    Poziom 8  

    Ok, bardzo dziękuję Wam za pomoc :)

    0