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.

[Atmega16][BASCOM] Przerwanie od PCF8583.

pempek 09 Jul 2009 18:56 2581 4
  • #1
    pempek
    Level 10  
    Używam zegara PCF8583, działa mi jego obsługa itp, natomiast mam problem z jego przerwaniami. Układ jest skonfigurowany by generować przerwanie co 1s, po którym procesor ponownie ustawia odpowiednie flagi w zegarze, bowiem samo przerwanie jest jednokrotne.

    W celu inicjalizacji przerwań od zegara używam procedury:
    Code:
    Sub Init_alarm
    
       I2cstart                                                          'generate start
       I2cwbyte &HA0                                               'write address
       I2cwbyte &H00                                               'select control register
       'I2cwbyte &H80                                               'stop counting
       I2cwbyte &H04                                               'start counting and alarm enable
       I2cstop

       I2cstart                                                         'generate start
       I2cwbyte &HA0                                               'write address
       I2cwbyte &H08                                               'select alarm register
       I2cwbyte &B11000010                                     'alarm timer 1s int
       I2cstop

       I2cstart
       I2cwbyte &HA0
       I2cwbyte &H0F                                               'select alarm timer
       I2cwbyte 1                                                    '1 count
       I2cstop



       I2cstart
       I2cwbyte &HA0
       I2cwbyte &H07                                               'select timer
       I2cwbyte 0                                                     'reset timer counter
       I2cstop
    End Sub


    a następnie w obsłudze przerwania w procesorze trzeba ponownie ustawić odpowiednie flagi na zegarze, co robi poniższa procedura:
    Code:

    Sub Reset_alarm
       I2cstart                                                 'generate start
       I2cwbyte &HA0                                            'write address
       I2cwbyte &H00                                            'select control register
       I2cwbyte &H04                                            'start counting and alarm enable
       I2cstop

       I2cstart
       I2cwbyte &HA0
       I2cwbyte &H07                                            'select timer
       I2cwbyte &H00                                            'reset timer counter
       I2cstop
    end sub


    Problem w tym, że czasami generuje w ten sposób przerwania przez 10s a czasem przez 10min. Podejrzewam, że to może być spowodowane używaniem magistrali I2C w przerwaniu procesora.

    Jak temu zaradzić?
  • #2
    janbernat
    Level 38  
    Jakieś to dziwne.
    Ustawiasz PCF aby generował z INT sygnał co 1s.
    Sygnał ten dajesz np. na INT0 procesora.
    Potem w programie:

    On int0:
    ustawianie, sprawdzanie itp.

    To że PCF jest I2C nie sprawia że należy sprawdzać przerwania po magistrali I2C.
    Można bardziej sprzętowo- szybciej.
  • #3
    pempek
    Level 10  
    Tak też robię :) Wszystko się zgadza oprócz tego, że nie sprawdzam przerwania po I2C.
    Kwestia jest taka, że ten zegar generuje przerwanie jednokrotnie, więc w obsłudze przerwania w procesorze trzeba ponownie ustawić pewne flagi by zegar wygenerował kolejne przerwanie za sekundę i tak w kółko.

    Problem w tym, że nie wiem czemu po pewnym nieustalonym czasie zegar nie generuje więcej przerwań i tyle. Może procek nie ustawia odpowiednich flag w zegarze...
  • #4
    janbernat
    Level 38  
    To jest niemożliwe.
    Jak PCF jest odpowiednio skonfigurowany to po prostu generuje sygnał co 1s.
    Nie raz a stale- dopóki ma zasilanie.
    Czy ma podtrzymanie bateryjne i odpowiedni układ diod?
    Kondensator przy zasilaniu?
    Za diodami?
    Późno, jutro do pracy.
    Daj cały kod- można by go sprawdzić.
  • #5
    pempek
    Level 10  
    Zainspirowała mnie Twoja odpowiedź
    Quote:
    To jest niemożliwe.
    i jeszcze raz sprawdziłem wszystkie ustawiane flagi. Okazało się, że w procedurze inicjalizacji zamiast
    Code:
    I2cwbyte &B11000010                                     'alarm timer 1s int 
    powinno być
    Code:
    I2cwbyte &B11001010                                      'alarm  timer 1s int   
    i sprawa rozwiązana - jest przerwanie równo co sekundę.

    Dzięki za podpowiedzi!

    Swoją drogą, dokumentacja do tego PCF'a jest nijaka :/

    Temat do zamknięcia.