logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8L, DS1307, Bascom – brak komunikacji przez sprzętowy I2C/TWI po zmianie MCU

Logan 10 Mar 2010 20:44 3572 22
REKLAMA
  • #1 7811512
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Witam

    Mam bardzo dziwny problem z komunikacją z układem DS1307. Zacznę od początku. Mam zestaw ewaluacyjny z Atmega8 i układem DS1307, jakiś czas temu napisałem sobie pogram do komunikacji poprzez sprzętowy TWI. Wszystko działało aż miło, teraz chciałem znowu skomunikować się z DS'em, ale okazało się, że nie mam żadnej komunikacji. Sprawdziłem 10 razy wszystkie połączenia i jest OK (z resztą tu się nie da pomylić bo to płytka ewaluacyjna), w akcie desperacji przelutowałem DS'a. Bezskutecznie. Jedyne co zmieniłem to procesor z Atmega8 na Atmega8L, ale w nocie katalogowej nie znalazłem nic co by wskazywało na jakieś problemy z TWI. Postanowiłem iść dalej i sprawdzić która instrukcja zwraca błąd. Napisałem prosty programik:
    
    $regfile = "m8def.dat"   'Atmega8
    $crystal = 8000000  'kwarc 8MHz
    $lib "i2c_twi.lbx"  'sprzetowy I2C
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config Twi = 100000 'predkosc 100kHz
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.0 , Rs = Portd.7
    Cursor Off
    
    Const Adres_w = &B11010000
    Const Adres_r = &B11010001
    Cls
    
    I2cstart
    Gosub Blad
    I2cwbyte Adres_w
    I2cwbyte &H0        'adres rejestru
    I2cwbyte &H0        ' zeruje bit CH
    I2cstop
    
    I2cstart
    I2cwbyte Adres_w
    I2cwbyte &H07       'rejestr kontrolny
    I2cwbyte &B00010000 'ustawiam 1Hz na wyjsciu DS1307
    I2cstop
    
    End
    
    Blad:
    If Err = 1 Then
    Lcd "Blad"
    Else
    Lcd "OK"
    End If
    Return
    


    Okazało się, że już pierwsza instrukcja I2Cstart zwraca błąd. Gdzie szukać usterki ?
  • REKLAMA
  • #2 7811984
    ElektroTME
    Poziom 14  
    Posty: 159
    Pomógł: 14
    Ocena: 72
    U mnie w zegarze z pcf'em działa to w takiej konfiguracji, lecz nie korzystam z zewnętrznej biblioteki:

    $regfile = "m8def.DAT"
    $crystal = 8000000
    
    Config Pinc.4 = Input
    Config Pinc.5 = Input
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config I2cdelay = 5
    
    Const Pcf_o = 163                                           'adres zegara RTC odzczytu
    Const Pcf_z = 162                                           'adres zegara RTC zapisu
    Const Control = 8
    
    I2cinit
    I2cstart
    I2cwbyte Pcf_z
    I2cwbyte 8
    I2cwbyte Control
    I2cstop

    Edit: na atmedze8 i 8L działa tak samo :P
  • REKLAMA
  • #3 7812009
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Ale to nie ma nic do rzeczy, próbowałem nawet sampli z Bascoma, które wcześniej działały bez problemu.
  • #4 7812128
    ElektroTME
    Poziom 14  
    Posty: 159
    Pomógł: 14
    Ocena: 72
    Nie widzę w Twoim kodzie instrukcji I2cinit, może dlatego wywala błąd?
    Jeżeli wywala Ci błędy to przyczyna leży raczej po stronie programu.
    Prześledź jeszcze raz wszystko krok po kroku, może o czymś zapominasz, spróbuj ustawić piny jako wejścia, dodać kilka wydawałoby się zbędnych instrukcji, może zaskoczy.
  • #5 7812165
    Konto nie istnieje
    Poziom 1  
  • #6 7812237
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    A co to za płytka?
  • #7 7812430
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    ElektroTME napisał:
    Nie widzę w Twoim kodzie instrukcji I2cinit, może dlatego wywala błąd?
    Jeżeli wywala Ci błędy to przyczyna leży raczej po stronie programu.
    Prześledź jeszcze raz wszystko krok po kroku, może o czymś zapominasz, spróbuj ustawić piny jako wejścia, dodać kilka wydawałoby się zbędnych instrukcji, może zaskoczy.


    Zobacz w helpie kiedy się używa I2Cinit. Zwróć też uwagę, że wcześniej wszystko działało na tym samym wsadzie, wątpię, żeby stał się cud i zniknęły, bądź pojawiły się nowe instrukcje w pliku .bas.

    :arrow: atom1477 Na programowym nigdy nie ma błędu (zmienna Err zawsze 0), nawet jak odłączę układ...

    :arrow: janbernat Płytka to EVBavr04 z Propoxu.
  • REKLAMA
  • #8 7812478
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    A czy już wylutowałeś akumulator i wstawiłeś normalne ogniwo CR2032 zamiast ich wynalazku?
    I ustaw zworki żeby się nie ładowało.
    Bo przekracza dopuszczalne napięcie na DS i nic nie chodzi.
  • #9 7812527
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    janbernat napisał:
    A czy już wylutowałeś akumulator i wstawiłeś normalne ogniwo CR2032 zamiast ich wynalazku?
    I ustaw zworki żeby się nie ładowało.
    Bo przekracza dopuszczalne napięcie na DS i nic nie chodzi.


    Tak, przerabiałem to na samym początku, po wlutowaniu nowego DS uruchomiłem wszystko (kiedyś).
  • #10 7812587
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    To może CR2032 jest już słabe- jak to było dawno?
    Ja używałem do tego
    $lib "ds1307clock.lib"
  • REKLAMA
  • #11 7812637
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    janbernat napisał:
    To może CR2032 jest już słabe- jak to było dawno?
    Ja używałem do tego
    $lib "ds1307clock.lib"


    Faktycznie trochę słabe już to ogniwo - 2,7V, wg noty Vbat_min to 2V. Na wszelki wypadek wsadziłem nowa, ale dalej nie działa.
    Tej biblioteki "ds1307clock.lib" w Bascomie 1.11.9.8 już nie ma, w starszej wersji jest, ale mimo to, programowy I2C i tak nie działa (próbowałem Sampla ds1307.bas).
  • #12 7812687
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    No, ale się kompiluje bez błędów w 1.11.9.8.
    Zarówno z jak i bez $lib "ds1307clock.lib".
  • #13 7834748
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Dostaje błąd "Library file not found". Używam dema 1.11.9.8, w starszej wersji, z tą biblioteką, program się kompiluje, ale nie działa. Kiedyś działał.
  • #14 7835062
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Uzywam pełnej wersji- normalnie się kompiluje.
    Wyjście po I2Cinit do gosub Blad- gdzie masz dwukrotne ustawianie LCD-dużo czasu to pochłania- to nie jest pomysł na debugowanie.
    Spróbuj zrobić to na jakiejś diodzie z toggle albo coś równie szybkiego.
  • #15 7835130
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Słuszna uwaga, zmieniłem kod:
    $regfile = "m8def.dat"       'Atmega8
    $crystal = 8000000  'kwarc 8MHz
    $lib "i2c_twi.lbx"  'sprzetowy I2C
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config Twi = 100000 'predkosc 100kHz
    Const Adres_w = &B11010000
    Const Adres_r = &B11010001
    
    Config Portd.0 = Output
    Led Alias Portd.0
    Set Led
    
    I2cstart
    Gosub Blad
    I2cwbyte Adres_w
    I2cwbyte &H0        'adres rejestru
    I2cwbyte &H0        ' zeruje bit CH
    I2cstop
    
    I2cstart
    I2cwbyte Adres_w
    I2cwbyte &H07       'rejestr kontrolny
    I2cwbyte &B00010000 'ustawiam 1Hz na wyjsciu DS1307
    I2cstop
    
    End
    
    Blad:
    If Err = 1 Then
    Reset Led
    End If
    Return


    Dalej mam błąd.
  • #16 7835213
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Ab ovo- zacznijmy od początku.
    "Jedyne co zmieniłem to procesor z Atmega8 na Atmega8L".
    Nowy- ustawiony fabrycznie na 1MHz z wewnętrznego oscylatora.
  • #17 7835243
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Nie no, aż tak źle ze mną nie jest ;)
    Atmega8L, DS1307, Bascom – brak komunikacji przez sprzętowy I2C/TWI po zmianie MCU
  • #18 7835370
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    No ja kiedyś też w akcie desperacji wstawiłem nowego DS i kwarc.
    Na takiej samej płytce.
    Co okazało się bez sensu- błąd był w programie.
    A masz ten procesor który z tym chodził- nie przeprogramowany?
  • #19 7849112
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Znalazłem przyczynę - uszkodzony portc.4, nie wiem tylko jak go uszkodziłem... Na porcie cały czas jest logiczne 0, nie działa nawet Set Portc.4.
  • #20 7849314
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    To zamiast Set Porc.4. wpisz lepiej set portc.4
  • #21 7849396
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Literówka mi się wkradła, w sofcie mam set portc.4
  • #22 7849836
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    To jest sprzętowy SDA- jak ustawiłeś w programie TWEN w rejestrze TWCR to na nic nie reaguje.
    Zrób nowy program do migania diodą na tym pinie.
  • #23 7850017
    Logan
    Poziom 30  
    Posty: 2198
    Pomógł: 126
    Ocena: 121
    Cały czas mówię o nowym :)
    $regfile = "m8def.dat"       'Atmega8
    $crystal = 8000000  'kwarc 8MHz
    
    Config Portc.4 = Output
    Set Portc.4
    
    Do
    Toggle Portc.4
    Wait 1
    Loop
    

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zgłasza problem z komunikacją z układem DS1307 przy użyciu mikrokontrolera Atmega8L poprzez sprzętowy interfejs I2C. Po zmianie procesora z Atmega8 na Atmega8L, komunikacja przestała działać, mimo że wcześniej wszystko funkcjonowało poprawnie. Użytkownik sprawdził połączenia, przelutował układ DS1307 oraz próbował różnych konfiguracji kodu w Bascomie, jednak napotkał błędy. W trakcie dyskusji zasugerowano sprawdzenie ustawień pinów, użycie programowego I2C oraz wymianę akumulatora. Ostatecznie zidentyfikowano uszkodzenie portu C.4, co uniemożliwiało prawidłowe działanie interfejsu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA