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

[bascom/atmega1280/i2c] I2C nie działa - brak komunikacji

piotrva 25 Lut 2010 16:54 3360 2
REKLAMA
  • #1 7749250
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Witam serdecznie!
    Mam wielki problem z bascomem i magistralą i²c.
    Otóż kiedyś, gdy miałem bascoma 1.11.7.7 magistrala i²c działała bez problemów, teraz mam Bascoma 1.11.9.5 i nie mogę się skomunikować z żadnym układem i²c. Zegar i pamięć eeprom w ogóle nie odpowiadają, testowałem na 2 płytkach (jednej własnej konstrukcji, druga BASCOM KIT AVT2500) i 2 procesorach (90S2313 i Mega1280) i efekt ten sam - brak komunikacji, zawsze otrzymuję wartość 0 na wyjściu. Układy są na pewno sprawne, gdyż z tą starszą wersją bascoma bez problemu działał mi zegar, dokładnie ten sam, który teraz nie odpowiada...
    Zamieszczam poniżej kod którego aktualnie używam:
    
    'Program przygotowany dla zestawu EvB 4.3 firmy And-Tech.pl
    
    'Definicja procesora dla:
    ' Mega16 wpisać m16def.dat
    ' Mega32 wpisać m32def.dat
    ' Mega644p wpisać m644pdef.dat
    '$regfile = "m32def.dat"
    
    'Częstotliwość kwarcu domyślnie 16MHz
    '$crystal = 16000000
    $regfile = "m1280def.dat"
    '$regfile = "2313def.dat"
    $crystal = 11059200
    $lib "glcd.lib"
    Config Graphlcd = 240 * 64 , Dataport = Porte , Controlport = Porth , Ce = 0 , Cd = 1 , Wr = 2 , Rd = 3 , Reset = 4 , Fs = 5 , Mode = 6
    'Config Lcd = 16 * 2
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               'default use 10 for the SW stack
    $framesize = 40                                             'default use 40 for the frame space
                                              ' use the alternative library
    
    'Podłączenie pinów LCD do mikroprocesora
    'BL  = PortC.1
    'Rs  = PortC.2
    'E   = PortC.3
    'Db4 = PortC.4
    'Db5 = PortC.5
    'Db6 = PortC.6
    'Db7 = PortC.7
    'Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
    'Config Lcd = 16 * 2
    
    
    Dim A As Byte
    
    
    Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
    Declare Sub Gettime()
    
    
    'Declare variables
    Dim Tm(5) As Byte                                           'At &H60 Overlay
    Dim I As Byte , Temp As Byte
    
    'These are pointers to tm() for simple handling.
    Dim S As Byte                                               ' At &H60 Overlay
    Dim M As Byte                                               'At &H61 Overlay
    Dim H As Byte                                               ' At &H62 Overlay
    Dim D As Byte                                               'At &H63 Overlay
    Dim Month As Byte                                           ' At &H64 Overlay
    
    
    'konfiguracja pinów magistrali I2C - nie zmieniamy tego
    $lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
    'Config I2cdelay = 5
    Config Sda = Portd.1
    Config Scl = Portd.0
    
    'Aktywacja maistrali I2C
    I2cinit
    Twbr = 12
    Twsr = 0
    
    'Ustaw datę ic zas
    'Call Settime(56 , 1 , 1 , 29 , 11)
    
    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "PCF8583 Sample"
    Wait 2
    Cls
    
    'Pętla nieskończona
    Do
       Call Gettime
       Locate 1 , 1
       Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)
       Locate 2 , 1
       Lcd Hex(d) ; "-" ; Hex(month)
       Wait 1
    Loop
    End
    
    
    
    'Funkcja odczytująca zegar PCF8583
    Sub Gettime()
    
        Tm(1) = 2
    
        I2creceive 162 , Tm(1) , 1 , 5
    
     End Sub
    
    
    'Funkcja ustawiająca zegar PCF8583
    Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
    
        Tm(1) = Makebcd(s1)                                     'seconds
        Tm(2) = Makebcd(m1)                                     'minutes
        Tm(3) = Makebcd(h1)                                     'hours
        Tm(4) = Makebcd(d1)                                     'days
        Tm(5) = Makebcd(month1)                                 'months
    
    
        I2cstart                                                'generate start
        I2cwbyte 162                                            'write address
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstart                                                'repeated start
        I2cwbyte 162                                            'write mode
        I2cwbyte 2                                              'select seconds Register
        For I = 1 To 5
          I2cwbyte Tm(i)
        Next                                                    'write seconds
        I2cstop
    End Sub
    

    Program wyświetla potem:
    00:00:00
    00-00
    Z góry dzięki za pomoc
  • REKLAMA
  • Pomocny post
    #2 7753238
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    Nie wiem skad masz kod, ale chcieli w nim wykorzystac hardwerowe i2c ktore jest na pinie c.1/ c.0
    Narazie nie widze innego bledu wprowadz moze opoznienia.
    Dobrze by bylo jeszcze raz zainstalowac bascoma. Jak ten sam kod dziala na starszym kompilatorze
  • #3 7753892
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    czy jesteś pewny co do tego c.1/c.0 ??
    Bo sprawdzałem w dokumentacji i tam jest hardwerowe I2C na d.0 i d.1...
    zobaczę rzeczywiście potem na starym kompilatorze czy chodzi

    Dodano po 1 [godziny] 25 [minuty]:

    zmiana pinów nie pomaga, także opóźnienie nic nie daje, teraz sprawdzę na starszym bascomie

    Dodano po 10 [minuty]:

    i to także nie wina bascoma - na starszej wersji efekt ten sam...
    Co może być powodem błędu?
    Z góry dziękuję za pomoc

    Dodano po 29 [sekundy]:

    czy problem może stanowić to, że nie mam rezystorów podciągających linie sca i sdl do vcc??

    Dodano po 8 [minuty]:

    problem rozwiązany - miałem źle nazwane zmienne, i dlatego wyświetlało cały czas 00...
    temat zamykam
REKLAMA