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.

DS1302 atmega16 - Odczyt czasu i daty na LCD z HD44780

mirek1968 17 Lis 2012 00:09 2964 12
  • #1 17 Lis 2012 00:09
    mirek1968
    Poziom 13  

    Mam problem z wyświetleniem na moim LCD 2X16 czasu i daty .Posiadam płytkę testową na której mam atmegę 16 oraz zegar czasu rzeczywistego DS1302.W chwili obecnej wyświetlają mi się tylko sekundy i nic więcej nie potrafię uzyskać.Poniżej podaję plik main.c .
    Jestem początkującym w programowaniu .Interesuje mnie tylko realna i efektywna pomoc .
    Proszę o wyrozumiałość i pomoc.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    #include <stdio.h>
    #include <avr/io.h>
    #include <util/delay.h>
    #include "hd44780.h"
    #include "rtc.h"

    int main(void)
    {
    char tekst[255];
    char tekst1[255];

    char second;
    char minute;
    char hour;
    char day;
    char month;
    char year;
    char dz_tygodnia;

    /* Funkcja inicjalizuje wyświetlacz */
    lcd_init();
    /* Włącza wyświetlanie */
    LCD_DISPLAY(LCDDISPLAY);

    rtc_init();
    rtc_set_time(00,00,00);
    rtc_set_date(0x00,0x00,0x00,0x00);

    for(;;)
    {
    rtc_get_time(&second);

    sprintf(tekst, "%02d", second);//Tu wyświetlam sekundy i tylko to działa

    LCD_LOCATE(0,0);
    lcd_puts(tekst);
    }
    }
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 12
  • #2 17 Lis 2012 00:46
    GSM
    Poziom 25  

    Jeśli się dokopałem do tej samej biblioteki do obsługi DS1302, to widzę, że funkcje rtc_set/get* nie przyjmują poszczególnych wartości tylko referencję do struktury rtc_time.
    Sekundy udaje ci się odczytać, bo akurat są pierwszym polem tej struktury.
    Zamień to na strukturę i powinno działać.

    Pozdrawiam,
    GSM

    0
  • #3 17 Lis 2012 02:08
    mirek1968
    Poziom 13  

    Jak to mam wykonać?.Brakuje mi doświadczenia w poruszaniu się po programie i dlatego jeśli możesz to popraw mój plik main.c

    0
  • #4 17 Lis 2012 02:38
    GSM
    Poziom 25  

    Czego nie rozumiesz? Ja (lub ktoś inny) ci wytłumaczy.
    Funkcje ustawiania i pobierania czasu przyjmują wskaźnik (adres) do struktury. Zamiast zmiennych, które sobie zadeklarowałeś, zadeklaruj strukturę i z niej korzystaj.

    Pozdrawiam,
    GSM

    0
  • #5 17 Lis 2012 14:02
    mirek1968
    Poziom 13  

    Sprawdź czy dobrze stosuję tę strukturę.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    int main(void)
    {
    char tekst[255];

    struct rtc_time test;
    lcd_init();

    LCD_DISPLAY(LCDDISPLAY);

    rtc_init();
    rtc_set_time(00,00,00);
    rtc_set_date(0x00,0x00,0x00,0x00);

    for(;;)
    {
    rtc_get_time(&test);

    sprintf(tekst, "%02d", test);
    LCD_LOCATE(0,0);
    lcd_puts(tekst);
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #6 17 Lis 2012 14:18
    GSM
    Poziom 25  

    A możesz zamieścić zawartość pliku "rtc.h" z biblioteki, której używasz? Poza tym jeśli sam go przejrzysz to może ci się rozjaśni.

    Pozdrawiam,
    GSM

    0
  • #7 17 Lis 2012 14:55
    mirek1968
    Poziom 13  

    Proszę oto plik rtc.h

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    #ifndef _RTC_H_
    #define _RTC_H_

    #include <avr/io.h>
    #include <avr/delay.h>
    #include <avr/pgmspace.h>
    #include <string.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    #include <avr/eeprom.h>
    #include <stdio.h>

    #define READ 1
    #define WRITE 0

    struct rtc_time{
    char second;
    char minute;
    char hour;
    char day;
    char month;
    char year;
    char dz_tygodnia;
    };

    void rtc_init(void);
    void rtc_comms(unsigned char * data, char address, char rw);
    void rtc_get_time(struct rtc_time *);
    void rtc_set_time(unsigned char godz,unsigned char min,unsigned char sek);
    void rtc_set_date(unsigned char dzien,unsigned char mies,unsigned char rok,unsigned char dz_tyg);
    #endif
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #8 17 Lis 2012 15:50
    GSM
    Poziom 25  

    No to wszystko w porządku, tylko teraz dobrać się do zawartości struktury (w linijce z sprintf-em).

    Pozdrawiam,
    GSM

    0
  • #9 18 Lis 2012 16:01
    mirek1968
    Poziom 13  

    Popatrz proszę co robię źle z tą funkcją sprintf i jeśli możesz popraw ją.
    Pozdrawiam

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    struct rtc_time time;
    time.second;
    time.minute;
    time.hour;
    time.day;
    time.month;
    time.year;
    time.dz_tygodnia;

    for(;;)
    {
    rtc_get_time(&time);

    sprintf(tekst,"%2d",time.dz_tygodnia);


    LCD_LOCATE(0,0);
    lcd_puts(tekst);
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #10 18 Lis 2012 21:02
    GSM
    Poziom 25  

    1. Unikaj nazw które mogą w jakiś sposób kolidować nazwami deklarowanych przez biblioteki funkcji/zmiennych/etc. (patrz: nazwa struktury która deklarujesz typu rtc_time)
    2. Po co są te linijki typu "time.second;"?
    Dalej w sprintf jest już dobrze.

    Opisz jakie objawy nie działania są. Może schemat układu jakiś? resztę kodu?

    Pozdrawiam,
    GSM

    0
  • #11 18 Lis 2012 21:39
    mirek1968
    Poziom 13  

    Zmieniłem nazwę przy "rtc_time" z time na czas.
    Po wgraniu projektu do sterownika z lewej strony LCD wyświetla mi sekundy,jak dojdzie do 60 sekund to dodaje mi do tej wartości+255 i liczy dalej następną minutę ze stanem licznika 315 po czym dodaje znów 255 po minucie i tak co minutę to samo .Poza tym wyświetla mi cyfry 2560 i 203072 w następnych wierszach LCD.
    Przyznam że nie rozumiem tego .

    0
  • #12 19 Mar 2013 23:39
    mirek1968
    Poziom 13  

    Program do obsługi mojego zegara na DS1302 już działa.Mam za to inny problem po włożeniu baterii 3V CR 2032 do układu zauważyłem że układ bardzo się grzeje a jak się wyciągnie baterię to wszystko jest ok.Nie wiem co może być powodem.Bateria podłączona jest prawidłowo czyli minus do masy wspólnej z zasilaniem 5V a plus baterii do pinu 8 układu zegara.Proszę o opinie .Jeśli układ jest padnięty to jak to możliwe że nie grzeje się jeśli nie włożę baterii ?

    0
  • #13 10 Kwi 2013 23:24
    mirek1968
    Poziom 13  

    Wymieniłem układ na nowy ale ten nic mi nie pokazuje tzn. nie działa po prostu a nawet nie można ustawić niczego tzn. godziny,minut ani sekund -stale pokazuje datę 01.01.2000 a czas to są same zera i nic poza tym .
    Proszę o pomoc w czym tkwi problem bo na pewno układ jest dobry bo mam ich więcej i wszystkie pokazują na LCD to samo co pisałem powyżej.
    Proszę o konkretny odzew-mój program napisany jest na wcześniejszych postach powyżej.

    0