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

[at1280/bascom]I2C nie działa-brak jakiejkolwiek komunikacji

piotrva 05 Maj 2010 16:45 1580 3
REKLAMA
  • #1 8038721
    piotrva
    VIP Zasłużony dla elektroda
    Witam.
    Mam duże problemy z uruchomieniem i2c (programowo) na procesorze at1280.
    Otóż po wgraniu takiego programu:
    
    $regfile = "m1280def.dat"
    $crystal = 11059200
    $lib "glcd.lib"
    Config Sda = Portd.1
    Config Scl = Portd.0
    $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
    Config Keyboard = Ping.0 , Data = Ping.1 , Keydata = Keydata
    Config Porta.2 = Input
    
    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
    Dim H As Byte , M As Byte , Sc As Byte , D As Byte , Mo As Byte
    
    Dim Cha As String * 1
    Dim Ch As Byte
    Dim Z As Long
    Dim A As Long
    Dim X As Integer
    Dim Y As Integer
    Dim S As Byte
    Dim Sico As Single
    Declare Sub Wskazowka(kat As Long , Byval Dl As Byte)
    
    Config Graphlcd = 240 * 64 , Dataport = Porte , Controlport = Porth , Ce = 0 , Cd = 1 , Wr = 2 , Rd = 3 , Reset = 4 , Fs = 5 , Mode = 6
    Cursor Off Noblink
    'Aktywacja maistrali I2C
    I2cinit
    Twbr = 12
    Twsr = 0
    
    'Ustaw datę i czas
    'Call Settime(56 , 1 , 1 , 29 , 11)
    
    Do
    If Pina.2 = 1 Then
         Cls
         Locate 1 , 1
         Lcd "  :  :  "
         Locate 2 , 1
         Lcd "  -  "
         Ch = Getatkbd()
         Locate 1 , 1
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         H = Ch * 10
         Waitms 300
         Ch = Getatkbd()
         Locate 1 , 2
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         H = H + Ch
    
         Waitms 300
         Ch = Getatkbd()
         Locate 1 , 4
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         M = Ch * 10
         Waitms 300
         Ch = Getatkbd()
         Locate 1 , 5
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         M = M + Ch
    
         Waitms 300
         Ch = Getatkbd()
         Locate 1 , 7
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         Sc = Ch * 10
         Waitms 300
         Ch = Getatkbd()
         Locate 1 , 8
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         Sc = Sc + Ch
    
    
    
         Waitms 300
         Ch = Getatkbd()
         Locate 2 , 1
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         D = Ch * 10
         Waitms 300
         Ch = Getatkbd()
         Locate 2 , 2
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         D = D + Ch
    
         Waitms 300
         Ch = Getatkbd()
         Locate 2 , 4
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         Mo = Ch * 10
         Waitms 300
         Ch = Getatkbd()
         Locate 2 , 5
         Cha = Chr(ch)
         Ch = Val(cha)
         Lcd Ch
         Mo = Mo + Ch
    
    
         Call Settime(sc , M , H , D , Mo)
         Locate 3 , 1
         Lcd "Zapisano ustawienia"
         Wait 1
    
    End If
    Call Gettime
    If Tm(1) <> S Then
    S = Tm(1)
    Cls
    Circle(120 , 32) , 30 , 255
       A = Makedec(tm(1))
       Z = A * 6
       Call Wskazowka(z , 30)
       Z = Makedec(tm(2))
       Z = Z * 6
       A = A / 10
       A = A + Z
       Call Wskazowka(a , 25)
       Z = Makedec(tm(3))
       Z = Z * 30
       A = Makedec(tm(2))
       A = A / 2
       A = A + Z
       Call Wskazowka(a , 20)
       Locate 1 , 1
       Lcd Hex(tm(3)) ; ":" ; Hex(tm(2)) ; ":" ; Hex(tm(1))
       Locate 2 , 1
       Lcd Hex(tm(4)) ; "-" ; Hex(tm(5))
       End If
    Loop
    End
    Sub Wskazowka(kat As Long , Byval Dl As Byte)
    X = Dl
    Y = -dl
    Sico = Kat
    Sico = Deg2rad(sico)
    Sico = Sin(sico)
    X = Sico * X
    Sico = Kat
    Sico = Deg2rad(sico)
    Sico = Cos(sico)
    Y = Sico * Y
    X = X + 120
    Y = Y + 32
    Line(120 , 32) ,(x , Y) , 255
    End Sub
    
    
    '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
    
    Keydata:
    'klawisze normalnie – małe litery
    Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
    Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
    Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
    Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
    Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
    Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
    Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    'klawisze z Shift – wielkie litery
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
    Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
    Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
    Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
    Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
    Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
    Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
    Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
    

    w ogóle nie następuje transmisja i2c i odczyt danych z układu zegara
    za to po użyciu takiej modyfikacji pierwszych linijek wszystko działa bez zarzutów:
    
    $regfile = "m1280def.dat"
    $crystal = 11059200
    $lib "glcd.lib"
    $lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
    'Config I2cdelay = 10
    Config Sda = Portd.1
    Config Scl = Portd.0
    $hwstack = 32                                               ' default use 32 for the 
    (...)
    

    dodam, że w pierwszym przypadku zachowanie nie jest zależne od tego jakich pinów ani portów użyję.
    Dlaczego więc nie działa mi i2c? ten sam problem mam na mniejszym uP, at90s2313, tyle, że tam w ogóle nie ma sprzętowego i2c-twi i nie ma jakiejkolwiek możliwości uruchomienia tej magistrali...
    Z góry dziękuję za pomoc
  • REKLAMA
  • #2 8080756
    J_Bravo
    Poziom 27  
    Sub Settime
       I2cstart                                                 'rozpoczęcie transmisji
       I2cwbyte &HA0                                            'ustawienie trybu zapisu
       I2cwbyte 0                                               'wybranie zapisu do rejestru kontrolnego
       I2cwbyte &B00001000                                      'ustawienie rejestru kontrolnego - zegar uruchomiony, maskowanie włączone
       I2cwbyte 0                                               'zerowanie setnych sekundy
       I2cwbyte Tm(1)                                           'zapis sekund
       I2cwbyte Tm(2)                                           'zapis minut
       I2cwbyte Tm(3)                                           'zapis godzin
       I2cwbyte Tm(4)                                           'zapis dnia miesiąca
       I2cwbyte Tm(5)                                           'zapis miesiąca
       I2cstop                                                  'koniec transmisji
    End Sub
    
    
    Rem ------------------------------- gettime - pobierz czas
    Sub Gettime
       I2cstart                                                 'inicjalizacja magistrali I2C
       I2cwbyte &HA0                                            'podanie adresu podstawowego PCF8583
       I2cwbyte 2                                               'wybranie drugiego rejestru (sekund)
       I2cstart                                                 'start transmisji
       I2cwbyte &HA1                                            'zgłoszenie zamiaru odczytu informacji
       I2crbyte Tm(1) , Ack                                     'odczyt Rejestru Sekund (z potwierdzeniem - Ack)
       I2crbyte Tm(2) , Ack                                     'odczyt rejestru minut (z potwierdzeniem - Ack)
       I2crbyte Tm(3) , Ack                                     'odczyt rejestru godzin (tryb 24h) (z potwierdzeniem - Ack)
       I2crbyte Tm(4) , Ack                                     'odczyt dnia miesiąca (z potwierdzeniem - Ack)
       I2crbyte Tm(5) , Nack                                    'odczyt miesiąca (bez potwierdzenia - Nack)
       I2cstop                                                  'zatrzymanie transmisji
    End Sub


    U mnie to działa bez TWI
  • REKLAMA
  • #3 8081806
    piotrva
    VIP Zasłużony dla elektroda
    a mógłbyś załączyć cały program, który skompilowałeś?
    jakiej wersji bascoma używasz, może to stwarza jakiś problem...
  • #4 8085740
    piotrva
    VIP Zasłużony dla elektroda
    problem rozwiązany - rozwiązanie najbanalniejsze jakie mogło być - na liniach sda i scl rezystorki 5k podciągające do VCC
    przy TWI to nie było wymagane bo zapewniał to uP ;-)
    Temat zamykam
REKLAMA