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

[C][ATMega8] Zegar na PCF8563

^Rachel 04 Lis 2011 17:59 4474 8
REKLAMA
  • #1 10100843
    ^Rachel
    Poziom 21  
    Kod :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na wyświetlaczu nr 4 wyświetla się zero. Pozostałe wyświetlacze nieaktywne.

    Funkcje zapisu i odczytu, oraz sterowania wyświetlaczami działają, bo sprawdzałem bardzo dokładnie.

    Co tu jeszcze jest nie tak ?
    Proszę o pomoc.

    Dodano po 1 [godziny] 3 [minuty]:

    Dodam jeszcze schemat w razie wątpliwości :
    [C][ATMega8] Zegar na PCF8563
    I co ważne, pomyliłem się wcześniej, źle podłączyłem na płytce kondensator przy rezonatorze ( do Vcc zamiast do GND ). Teraz już jest podłączony dobrze, ale na wyświetlaczach są same 0 .
    Zamieszczę jeszcze za chwilę przebiegi czasowe z analizatora.

    Dodano po 9 [minuty]:

    Przebiegi czasowe :
    [C][ATMega8] Zegar na PCF8563

    Trigger : falling edge
  • REKLAMA
  • Pomocny post
    #2 10101180
    Krauser
    Poziom 26  
    AVCC powinno byc podpięte do VCC nawet jak nie korzystasz z ADC.
    Jeśli wyświetlanie samo w sobie działa to odczyt musi być błędny. Rozszerz tablicę do 16 i umieść tam kod cyfry zero i zobacz co będzie.
  • REKLAMA
  • Pomocny post
    #3 10101340
    mirekk36
    Poziom 42  
    Ja się zawsze zastanawiam skąd się biorą u tylu ludzi , początkujących te schematy bez podłączonego AVCC i AGND ??? przecież - trąbi się o tym nie tylko w nocie PDF ale i na forum - no wszędzie. Wprawdzie ATmega8 ma zwarcie wewnątrz pomiędzy VCC i AVCC ale nie podłączanie jeszcze niefrasobliwie drugiej nogo GND to już - proszenie się na własne życzenie o takie właśnie różne dziwne problemy.

    Druga sprawa - panie kolego - odczyty z PCF'a robisz w przerwaniu od Timera ? podczas multipleksowania ???? ;) .... czas zmienia się tobie co 1 sekundę a ty męczysz go co ileś tam ms ??? ;) zastanów się

    Masz z PCF'a piękne wyjście INT na którym generowany jest impuls 1Hz. Teraz tylko go podpiąć pod jakieś wejście INT0, INT1 lub INT2 i masz gotową flagę równo co 1 sekundę - dzięki której w pętli głównej możesz dokładnie co sekundę odczytywać pięknie czas z PCF'ka ;) Nie mówię że to przeszkadza w całości - ale z drugiej strony nie analizowałem całości więc - może sam to zrób i przemyśl czy tak warto zrobić jak piszę ? bo to jest najbardziej typowy i optymalny sposób z uwagi nie tylko na obciążenie procka ale i samej magistrali I2C. Bo co by było gdybyś podłączył sobie jeszcze jakiś inny układ na I2C - chyba już kaplica.
  • REKLAMA
  • REKLAMA
  • #5 10107390
    ^Rachel
    Poziom 21  
    mirekk36 napisał:

    Druga sprawa - panie kolego - odczyty z PCF'a robisz w przerwaniu od Timera ? podczas multipleksowania ???? ;) .... czas zmienia się tobie co 1 sekundę a ty męczysz go co ileś tam ms ??? ;) zastanów się

    Masz z PCF'a piękne wyjście INT na którym generowany jest impuls 1Hz. Teraz tylko go podpiąć pod jakieś wejście INT0, INT1 lub INT2 i masz gotową flagę równo co 1 sekundę - dzięki której w pętli głównej możesz dokładnie co sekundę odczytywać pięknie czas z PCF'ka ;) Nie mówię że to przeszkadza w całości - ale z drugiej strony nie analizowałem całości więc - może sam to zrób i przemyśl czy tak warto zrobić jak piszę ? bo to jest najbardziej typowy i optymalny sposób z uwagi nie tylko na obciążenie procka ale i samej magistrali I2C. Bo co by było gdybyś podłączył sobie jeszcze jakiś inny układ na I2C - chyba już kaplica.


    Tak jak w kodzie widać będę wykorzystywać do tego celu Timer1, który przepełnia się w czasie 400ms i w przerwaniu odczytywał czas. W tym kodzie wstawiłem odczyt do multipleksowania, bo myślałem, że tu jest błąd. No ale jednak nie.

    A co do nie podłączonych pinów.
    Tak wiem o tym i do symulacji podłączenie tych pinów nie jest tak konieczne, bo nic to nie zmienia. A w rzeczywistości mam przy resecie rezystor 1k i piny z ADC także odpowiednio.

    Cytat:
    Jeśli wyświetlanie samo w sobie działa to odczyt musi być błędny. Rozszerz tablicę do 16 i umieść tam kod cyfry zero i zobacz co będzie.


    Dobra uwaga, spróbuję tak i dam znać.

    Dodano po 2 [godziny] 45 [minuty]:

    Jednak to nie pomogło.

    Spróbowałem tak :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na wyświetlaczach była 12:18, co by wskazywało na to, że "PCF_Read_Byte(0x02);" wcale nie odczytał minut. Ciekawe teraz tylko czy wina stoi po stronie układu, czy po stronie złej funkcji do odczytu z magistrali TWI.
  • #6 10114429
    ^Rachel
    Poziom 21  
    wymieniłem PCF'a i nadal to samo :(
  • Pomocny post
    #7 10114568
    JarekC
    Poziom 32  
    Witam,

    Przyczyną problemów może być brak skonfigurowania prędkości portu I2C.

    Prędkość portu jest określana wzorem:

    SCL frequency = CPU Clock frequency/(16 + 2(TWBR) ⋅ 4^TWPS)

    Jeżeli rejestry TWBR i TWSR nie są inicjowane, to po resecie TWBR i TWPS mają wartości =00h.
    Czyli dla oscylatora 8MHz otrzymamy częstotliwość szyny 8Mhz/16=500kHz
    a maksymalna częstotliwość szyny I2C dla układu PCF8563 wynosi 400kHz.
    Dodatkowo jeżeli układ jest zmontowany na płytce testowej to pojemności
    występujące na liniach I2C mogą dodatkowo ograniczyć max. częstotliwość pracy.

    Na początek zalecam ograniczenie f I2C do 100kHz.

    Pozdrawiam
    JarekC





    = -----------------------------------------------------------
  • #8 10115481
    ^Rachel
    Poziom 21  
    Dzięki wielkie, zauważyłem też, że mam problem z wyświetlaczami multipleksowanymi, zmniejszyłem preskaler Timera0 aby zobaczyć czy wszystko poprawnie się wyświetla, przy preskalerze 1024 świeciły się tylko 2 segmenty od godziny. A więc zmienie jeszcze sposób wyświetlania i zobaczymy jak to będzie.
  • #9 10118223
    ^Rachel
    Poziom 21  
    Wystarczyło zmienić sposób sterowania wyświetlaczami:| Wrzucę jeszcze kod, gdyby ktoś miał podobne problemy :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA