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

Atmega8L i sprzętowy I2C [Bascom]

Logan 10 Mar 2010 20:44 3515 22
  • #1 7811512
    Logan
    Poziom 30  
    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 ?
  • #2 7811984
    ElektroTME
    Poziom 14  
    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
  • #3 7812009
    Logan
    Poziom 30  
    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  
    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  
    A co to za płytka?
  • #7 7812430
    Logan
    Poziom 30  
    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.
  • #8 7812478
    janbernat
    Poziom 38  
    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  
    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  
    To może CR2032 jest już słabe- jak to było dawno?
    Ja używałem do tego
    $lib "ds1307clock.lib"
  • #11 7812637
    Logan
    Poziom 30  
    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  
    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  
    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  
    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  
    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  
    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  
    Nie no, aż tak źle ze mną nie jest ;)
    Atmega8L i sprzętowy I2C [Bascom]
  • #18 7835370
    janbernat
    Poziom 38  
    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  
    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  
    To zamiast Set Porc.4. wpisz lepiej set portc.4
  • #21 7849396
    Logan
    Poziom 30  
    Literówka mi się wkradła, w sofcie mam set portc.4
  • #22 7849836
    janbernat
    Poziom 38  
    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  
    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
    
REKLAMA