Witam.
Mam duże problemy z uruchomieniem i2c (programowo) na procesorze at1280.
Otóż po wgraniu takiego programu:
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:
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
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