Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA8][BASCOM] Podtrzymanie czasu

evolucja 01 Sep 2009 21:38 3728 11
  • #1
    evolucja
    Level 20  
    Witam. Posiadam sklejony układ, którego schemat zamieszczam poniżej. Mam do niego także oczywiście program. Chciał bym mu dorobić podtrzymanie czasu. Czy ktoś może wyjaśnić mi jak się za to zabrać, jakie elementy będą potrzebne a także czy modyfikacja programu jest na tyle trudna, że dla mnie nie do zrealizowania?

    [ATMEGA8][BASCOM] Podtrzymanie czasu

    pozdrawiam.
  • #2
    elektronik999
    Level 26  
    a może zewnętrzny zegra RTC?
  • #3
    evolucja
    Level 20  
    tylko jak to podłączyć do całej reszty? i czy dużych zmian w programie to będzie wymagać?
  • #4
    wader_669
    Level 28  
    mi link do strony nie dziala.
    Ja osobiscie wole nie uzywac zew. ukladow do mierzenia czasu. Ja uzywam procka i trybu powersave
  • #5
    sysio10
    Level 16  
    jako zegar czasu rzeczywistego możesz użyć PCF8583
    korzysta z i2c (te same linie SDA i SCL które idą do pamięci 24c16)
    kod do obsługi możesz skopiować z ćwiczenia 6 bascom college
    Link
    jest tam również informacja jak zrobić podtrzymanie.
    Bascom college co prawda nie dotyczy AVR-ów (przygotowany był dla innych procesorów) ale różnica w składni jest niewielka, a w przypadku i2c raczej żadna.
  • #7
    sysio10
    Level 16  
    Chciałeś robić podtrzymanie czasu (brakuje mi baterii która przez diodę zasili nogę 8 PCFa, adres PCFa jest 162 (163) przy podłączeniu nogi A0 do zasilania.
    Sprawdź jaki masz adres odczytu i zapisu pamięci (aby się nie zdublowały z adresami zegara)
    Reszta wydaje się OK.

    Przy okazji: zwróć uwagę na to że niektóre rejestry PCFa przechowują dodatkowe dane,
    sam się zdziwiłem jak w pierwszym dniu działania wskazania były poprawne a w drugim miałem miesiąc 24-ty
    :D
    wszystko się wyjaśniło po wczytaniu w DATA SHEET
  • #8
    evolucja
    Level 20  
    W programie wyczaiłem taki kawałek:
    Const In_eep = 160                                          'Adresy dla EEPROM
    Const Out_eep = 161

    a więc moim zdaniem adres odczytu to 160 a zapisu 161.

    Z tego co widzę jest podłączone zasilanie przez diodę do nogi 8.

    A więc jeśli wszystko się zgadza to będę próbował wykonać płytkę.
  • #9
    Ficu
    Level 31  
    evolucja,
    dodanie zew RTC będzie się wiązało z dużymi zmianami w programie. Jeżeli aż tak bardzo Ci się nie śpieszy to jestem w trakcie pisania programu pod LCD3310, 24C64, zew RTC, mega32.
  • #10
    evolucja
    Level 20  
    No spodziewałem się, że wiąże się to z przebudowaniem prawie całego programu. Na jakim etapie prac jesteś?
  • #11
    Ficu
    Level 31  
    Pozostało mi połączyć podprogramy w całość i zaprojektować płytkę PCB.
  • #12
    sysio10
    Level 16  
    Fragment mojego kodu odczytu i zapisu zegara

    
    
    Sub Odczyt_czasu
    
       Local Sekundy As Byte
       Local Minuty As Byte
       Local Godziny As Byte
       Local Dni As Byte
       Local Miesiace As Byte
    
       I2cstart
       I2cwbyte 162
       I2cwbyte 2
       I2cstart
       I2cwbyte 163
       I2crbyte Sekundy , Ack
       I2crbyte Minuty , Ack
       I2crbyte Godziny , Ack
       I2crbyte Dni , Ack
       I2crbyte Miesiace , Nack
       I2cstop
       Dni = Dni And &B00111111
       Miesiace = Miesiace And &B00011111
    
       Sekundy = Makedec(sekundy)
       Minuty = Makedec(minuty)
       Godziny = Makedec(godziny)
       Dni = Makedec(dni)
       Miesiace = Makedec(miesiace)
    
          Locate 1 , 1
          If Godziny < 10 Then
             Lcd "0" ; Godziny ; ":"
          Else
             Lcd Godziny ; ":"
          End If
    
          Locate 1 , 4
          If Minuty < 10 Then
             Lcd "0" ; Minuty ; ":"
          Else
             Lcd Minuty ; ":"
          End If
    
          Locate 1 , 7
          If Sekundy < 10 Then
             Lcd "0" ; Sekundy
          Else
             Lcd Sekundy
          End If
    
    
          Locate 1 , 10
          Select Case Miesiace
             Case 1
                Lcd " styczen "
             Case 2
                Lcd "    luty "
             Case 3
                Lcd "  marzec "
             Case 4
                Lcd " kwiecen "
             Case 5
                Lcd "     maj "
             Case 6
                Lcd "czerwiec "
             Case 7
                Lcd "  lipiec "
             Case 8
                Lcd "sierpien "
             Case 9
                Lcd "wrzesien "
             Case 10
                Lcd "pazdzier "
             Case 11
                Lcd "listopad "
             Case 12
                Lcd "grudzien "
             End Select
    
          Locate 1 , 19
          If Dni < 10 Then
             Lcd "0" ; Dni
          Else
             Lcd Dni
          End If
    
    End Sub
    
    
    
    Sub ZAPIS
    
                Sekundy = Makebcd(sekundy)
                Minuty = Makebcd(minuty)
                Godziny = Makebcd(godziny)
                Dni = Makebcd(dni)
                Miesiace = Makebcd(miesiace)
                I2cstart
                I2cwbyte 162
                I2cwbyte 0
                I2cwbyte 8                                      'format że luty ma 29 dni i nie zlicza dni tygodnia
                I2cstop
                I2cstart
                I2cwbyte 162
                I2cwbyte 2
                I2cwbyte Sekundy
                I2cwbyte Minuty
                I2cwbyte Godziny
                I2cwbyte Dni
                I2cwbyte Miesiace
                I2cstop
    
    End Sub