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.

[ATmega16][C] Połączenie z PCF8583P - Brak odpowiedzi?

Defozo 05 Mar 2011 21:47 3197 9
  • #1 05 Mar 2011 21:47
    Defozo
    Poziom 17  

    Witam, mam tak podłączony zegar RTC PCF8583P do ATmegi16:
    [ATmega16][C] Połączenie z PCF8583P - Brak odpowiedzi?

    Oraz napisany taki program:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wyświetlacz działa sprawnie, ale nie wyświetla on sekund z RTC.

    Jak to naprawić? Co źle robię? To wina software'a czy hardware'a?

    Proszę o pomoc,
    Pozdrawiam,
    Defozo

    0 9
  • #3 06 Mar 2011 11:44
    Defozo
    Poziom 17  

    piotrva napisał:
    Po pierwsze brak rezystorów podciagajacych 4,7k na liniach sda i scl

    Już przylutowałem, bez zmian.

    Zmieniłem również w kodzie:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oraz dodałem konwertowanie na ASCII:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A więc teraz kod wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kompilator wyświetla:
    Cytat:
    > "d:\WinAVR\utils\bin\make.exe" all

    -------- begin --------
    avr-gcc (WinAVR 20100110) 4.3.3
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


    Size before:
    AVR Memory Usage
    ----------------
    Device: atmega16

    Program: 2862 bytes (17.5% Full)
    (.text + .data + .bootloader)

    Data: 78 bytes (7.6% Full)
    (.data + .bss + .noinit)




    Compiling C: main.c
    avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
    main.c:1:1: warning: "F_CPU" redefined
    <command-line>: warning: this is the location of the previous definition
    main.c:29: warning: function declaration isn't a prototype
    main.c:37: warning: function declaration isn't a prototype
    main.c:61: warning: function declaration isn't a prototype
    main.c:98: warning: function declaration isn't a prototype
    main.c: In function 'I2C_Odczyt_AdresB':
    main.c:111: warning: no return statement in function returning non-void

    Linking: main.elf
    avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm

    Creating load file for Flash: main.hex
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock main.elf main.hex

    Creating load file for EEPROM: main.eep
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
    --change-section-lma .eeprom=0 --no-change-warnings -O ihex main.elf main.eep || exit 0

    Creating Extended Listing: main.lss
    avr-objdump -h -S -z main.elf > main.lss

    Creating Symbol Table: main.sym
    avr-nm -n main.elf > main.sym

    Size after:
    AVR Memory Usage
    ----------------
    Device: atmega16

    Program: 2862 bytes (17.5% Full)
    (.text + .data + .bootloader)

    Data: 78 bytes (7.6% Full)
    (.data + .bss + .noinit)



    -------- end --------


    > Process Exit Code: 0
    > Time Taken: 00:01


    A wyświetlacz (2x16 zgodny z HD44780) po zaprogramowaniu:
    Cytat:
    0.0000000 0.000
    0.0000000 0.000


    Dzięki za odpowiedź,
    Defozo

    0
  • Pomocny post
    #4 08 Mar 2011 10:18
    p_zag
    Poziom 13  

    Witam
    Kiedyś uruchomiłem PCF8583P na szynie TWI(i2c) oraz układ Atmega8, i działa mi do dziś. Zajrzyj na to na początek, a później tu zastosowanie.
    To powinno Ci pomóc.
    Powodzenia.

    0
  • #5 10 Mar 2011 21:37
    Defozo
    Poziom 17  

    Witam, postanowiłem "ugryźć" najpierw EEPROM.

    Więc napisałem sobie taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Warningi kompilatora:
    Cytat:
    main.c:15: warning: function declaration isn't a prototype
    main.c:25: warning: function declaration isn't a prototype


    Program zapętla się przy "while (!(TWCR & (1<<TWINT)));", gdy wywołuję "TWI_write(adres);" (gdzie adres=100).
    Wnioskuję to po tym, że na wyświetlaczu wyświetla mi się "1234567456".

    Dlaczego tak się dzieje? Jak to naprawić?

    Dzięki za odpowiedzi,
    Defozo.

    0
  • Pomocny post
    #6 10 Mar 2011 23:51
    JarekC
    Poziom 27  

    Witam,

    1. Nie podałeś jaki jest rozmiar pamięci EEPROM a od tego zależy sposób adresowania.
    Linie A0,A1,A2 masz podpięte do +5V (logiczna 1) czyli jeżeli masz pamięć mniejszą niż 24C16 to adres 0xA0 jest niewłaściwy.

    2. Linia WP dla normalnego trybu pracy powinna być podpięta do GND (logiczne 0).

    3. Aby zdiagnozować problemy na I2C po zakończeniu każdej operacji możesz odczytać rejestr TWSR który zawiera informację o statusie zakończonej operacji.

    4. Polecam mój gotowy i sprawdzony kod do obsługi I2C i PCF8583 znajdziesz go tutaj:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=8840368#8840368

    Pozdrawiam
    JarekC

    0
  • Pomocny post
    #7 11 Mar 2011 10:01
    p_zag
    Poziom 13  

    witam
    A gdzie masz inicjacje magistrali TWI. Brakuje mi w twoim programie

    Cytat:
    Witam, postanowiłem "ugryźć" najpierw EEPROM.
    czegoś np. takiego
    Kod: c
    Zaloguj się, aby zobaczyć kod
    brakuje też określenia portów SDA i SCL (porty TWI - wejścia, z podciągnięciem do VCC (pull-up) ), oraz pętli głównej programu np.
    while(1) /* Instrukcje wielokrotnego wykonania */
    { .... }

    0
  • #8 13 Mar 2011 16:42
    Defozo
    Poziom 17  

    Udało mi się uruchomić i pobrać sekundy z PCF8583P!
    Wasze porady były bardzo pomocne, problemem był zły adres i brak ustawienia częstotliwości TWI.

    Udało się odczytać sekundy, ale nie udało mi się odczytać minut, nie wiem czemu.

    Tak odczytuję sekundy:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Odczyt sekund jest prawidłowy, natomiast po zmianie tej linijki:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na ten kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Program się zapętla. Najprawdopodobniej przy tej linii:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W funkcji TWI_stop();

    Co robię nie tak?

    Dzięki za odpowiedzi,
    pozdrawiam,
    Defozo.

    0
  • #9 14 Mar 2011 22:23
    p_zag
    Poziom 13  

    witam
    ja odczytuje z pcf8583 tą procedurą (co prawda układem atmega8, ale atmega16 różni się ilością wyprowadzeń, natomiast rejestry sterujące są takie same):

    Kod: c
    Zaloguj się, aby zobaczyć kod

    natomiast to jest zastosowanie tej procedury
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Odczyt czasu(godzin, minut,sekund) robię w przerwaniu dlatego tablica w której przechowuje odczytane dane jest typu volatile (// volatile -> zmienna nie optymalizowana przez kompilator (występuje w przerwaniu i programie głównym))

    co do pytania
    Cytat:
    //0x03 - odpowiada minutom?
    -> tak
    co do pytania
    Cytat:
    Program się zapętla. Najprawdopodobniej przy tej linii:
    Kod C

    while((TWCR&(1<<TWSTO)));


    W funkcji TWI_stop();
    -> przeanalizuj procedurę którą wyżej zamieściłem

    0
  • #10 15 Mar 2011 00:07
    Defozo
    Poziom 17  

    Witam, problem udało mi się rozwiązać zupełnie przypadkiem.
    Okazało się, że zmieniam adres komórki do odczytu nie tu gdzie trzeba.

    Zmieniałem to:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na ten kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A trzeba było zamienić to:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na ten kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pomimo rozwiązanego problemu, pare rzeczy nie wiem jak działa, a chciałbym się coś o nich dowiedzieć.

    Przeanalizowałem twój kod (popatrz na komentarze):
    p_zag napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zastanawiam się również dlaczego u siebie używam:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dokładnie chodzi mi o to 0x02 - skąd to tam się wzięło?

    Moje aktualne funkcje, których używam i które działają:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dzięki za odpowiedzi,
    pozdrawiam,
    Defozo.

    0
  Szukaj w 5mln produktów