Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom][atmega8]Zegar na pcf8583 gubi sekundy

pys1986 10 Dec 2008 19:12 6941 5
  • #1
    pys1986
    Level 14  
    Witam,
    podłączyłem do Atmegi8 zegar PCF8583 tak jak na rysunku
    [bascom][atmega8]Zegar na pcf8583 gubi sekundy
    SCL i SDA podłączyłem przez oporniki 1k do +5V

    użyłem takiego programu:
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 1000000

    Config Pinc.4 = Input
    Config Pinc.3 = Input
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5       'tu zmien na odpowiednie piny
    Config Lcd = 20 * 4
    Cls
    Cursor Off Noblink

    Config Scl = Portc.4
    Config Sda = Portc.3
    Config I2cdelay = 5

    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte

    Cursor Off

    Const Pcf_o = 161                                           'adres zegara RTC odzczytu
    Const Pcf_z = 160                                           'adres zegara RTC zapisu



    'poczatek programu
    Const Control = 8

    I2cinit
    I2cstart
    I2cwbyte Pcf_z
    I2cwbyte 0
    I2cwbyte Control
    I2cstop

    Do

    I2cinit
    I2cstart
    I2cwbyte Pcf_z
    I2cwbyte 2
    I2cstart
    I2cwbyte Pcf_o
    I2crbyte Sekundy , Ack
    I2crbyte Minuty , Ack
    I2crbyte Godziny , Nack
    I2cstop

    Cls
    Lcd "ZEGAR:" ; "    ERR:" ; Err
    Lowerline
    Lcd Bcd(godziny) ; ":" ; Bcd(minuty) ; ":" ; Bcd(sekundy)

    Waitms 500

    Loop
    End


    i mam problem bo wyświtlacz mruga :( i zegar gubi co kilka sekund jedną sekunde :( co robię źle ??

    Poprawiłem tytuł - regulamin p.11.1, p.11.2
    [zumek]
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    dawid512
    Level 32  
    Po pierwsze rezystory zamień na 4k7. Po drugie cls wyrzuć przed pętlę a w niej zastosuj locate. Opóźnienie 500ms także z niej usuń.
  • #3
    pys1986
    Level 14  
    zrobiłem tak i chyba juz nie gubi sekund ale teraz mruga tak szybko że ledwie widać godzine :( czy nie da sie tego zrobić tak żeby wyświetlacz się odświeżał dokładnie gdy zmienia sie sekundnik ??
  • #4
    mirekk36
    Level 42  
    bo na pewno zostawiłeś CLS w pętli DO..LOOP - prawda?

    a kolega wyżej mówił ci żebyś wywalił tego CLS'a i użył polecenia LOCATE, które wyświetla dane zawsze na tej samej pozycji i wtedy nie trzeba kasować całego ekranu LCD.

    Po drugie sam jakby słusznie podejrzewałeś że warto zrobić odczyt z zegarka co jakiś czas a nie bez przerwy w pętli go odczytywać.

    Zobacz sobie, że PCF ma wyjście INT, które może generować przerwanie np co 1 sekundę. Warto to wyjście podłączyć do wejścia INT procka i za pomocą jakiejś flagi informować procedurę w pętli głównej, żeby dokonała odczytu czasu. Wtedy odczyt będzie się dokonywał równiutko co sekundę, procek nie będzie nadmiernie obciążony itp itd
  • #5
    pys1986
    Level 14  
    OK ta odpowiedź rozwiąże mój następny problem:
    - chcę na wyświetlaczu wyświetlać zegar i temperature ale w funkcji odczytu temperatury mam "waitms 750" przez co zegarek się trochę gubi :(

    jak mam dokładnie wykożystać to wyjście INT ?? jestem jeszcze troche zielony bo to moje początki z mikrokontrolerami i bascomem :(

    Dodano po 5 [godziny] 47 [minuty]:

    zrobiłem tak:
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 32768000

    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5       'tu zmien na odpowiednie piny
    Config Lcd = 20 * 4

    Config Portc = &B00000000                                   'port jako wejscie
    Portc = &B00100111                                          'ustawiamy piny 0,1,2,5 na 1
    Config 1wire = Portd.7
    Config Pind.7 = Input

    Config Sda = Portc.3
    Config Scl = Portc.4
    Config Twi = 100000
    I2cinit
    .
    .
    .
    Config Int0 = Falling
    Enable Interrupts
    Enable Int0

    On Int0 Clk
    .
    .
    .
    T2 = 0

    Clk:
       Incr T2

        1wreset
        1wwrite &HCC
        1wwrite &H44
        'Waitms 750

        1wreset
        1wwrite &HCC
        1wwrite &HBE

        I = 1wread(2)
        S = I / 16
        Temp = Fusing(s , "##.#")

    Locate 3 , 1
    Lcd "Temp:" ; Temp ; Chr(0) ; "C"

    Locate 4 , 1
    Lcd T2
    Return

    no i efekt jest taki że T2 zwiększa sie o 1 co sekunde ale temperatura jest ciągle -0.1 :(
  • #6
    mirley
    Level 17  
    Zablokuj przerwania na czas odczytu temperatury, powinno pomoc.

    Druga opcja to wykorzystać przerwanie zegara i od razu po odczycie czasu wykonać odczyt temperatury i potem wysłać rozkaz konwersji temperatury do DS. Jak podczas nadawania po 1Wire program wykona jakieś przerwanie to będą problemy z DS (przynajmniej ja takie miałem)