Hallo! Es geht um den MCP2515. Der Empfang funktioniert. Wenn die Daten im Buffer ankommen wird ein Interrupt ausgelöst. Leider bleibt er auch erhalten. Wie muss ich den Löschen? Laut Datenblatt, wenn ich das richtig verstanden habe, passt alles. Caninte , &B00000011 (interrupt für Buffer 0/1 beim Empfang) Canintf , &B00000000 (interrupt "nicht anhaltend") dazu Datenblatt: http://ww1.microchip.com/downloads/en/DeviceDoc/21801d.pdf Seite 50, 51. Was mache ich falsch? Danke Grüsse Alex
Ist die Frage unverständlich formuliert, oder ist der "kenner" noch nicht da gewesen? ;)
// Interrupt Flag löschen if (status & 0b01000000){ //Bit 6 set? mcp2515_bit_modify(CANINTF, (1<<RX0IF), 0); } else { mcp2515_bit_modify(CANINTF, (1<<RX1IF), 0); }
Kann das jemand "übersetzen"? Schreibe in Basic. So wie ich das verstehe heisst das Wenn der bit 6 von CANINTF gesetzt ist, dass schreibe ind register CANINTF, maske 1<<RX0IF (keine Ahnung was das heisst), 00000000 oder so. Also, BITTE, etwas verständlicher, wenn es geht. Danke schön Gruüsse Alex
Es war mit Absicht etwas unvollständig :-) Ungefähr so, wie deine Frage. Was hast DU programmiert? Zeig deine Software.
Nur so als Hinweis, dieser Controler setzt des Interruptflag selbstständig zurück, wenn er mit den Read RX Buffer Instruction ausgelesen wird. SPI-Commando 0x61,0x66,0x71,0x76. Wenn nach dem Auslesen immer noch der Interruptpin gesetzt ist, dann liegt ein anderer Interrupt vor. Man kommt dann um das Herausfinden der Interruptquelle nicht herum.
wie kann man das erfahren, was das für ein interrupt ist? Danke Grüsse Alex
Also, das CANINTF sagt Dir mit den Bits B0 und B1 welches Message Object gefüllt ist. Wenn Du im CANINTE nur Bit 0 und Bit 1 gesetzt hast, frage ich mich, wie Du die CAN-Daten liest. Liest Du der Reihe nach über 0x03 -> Register lesen 0x36 -> RX0 Data 0 0x37 -> RX0 Data 1 0x38 -> RX0 Data 2 . . . aus? Dann mußt Du das CANINTF-Register mit 0x03 separat löschen. Wenn Du mit dem 1-Byte-Lesekommando 0x90 und dann anschließend 13 X eine Null sendest, dann erhält Du die CAN-ID, DLC und die 8 Datenbyte, ohne jedes mal die Registeradresse explizit angeben zu müssen. Und weil über die 0x90 klar ist, das die RXB0 gemeint ist, löscht der MCP automatisch die INT-Leitung. Man kann auch separat für RXB0 und RXB1 eine Interuptleitung benutzen. BFPCTRL - RXnBF PIN CONTROL AND STATUS (ADDRESS: 0Ch) -> Hierüber werden die Messagebox-selektierenden Leitungen aktiviert. Ich hoffe, dass Dir das weiter hilft Viel Erfolg
>Liest Du der Reihe nach über >0x03 -> Register lesen >0x36 -> RX0 Data 0 >0x37 -> RX0 Data 1 >0x38 -> RX0 Data 2 >. . . >aus? ja, so lese ich dann die Register aus >Dann mußt Du das CANINTF-Register mit 0x03 separat löschen. die Frage ist wo und wie? Das ist mein Programm:
1 | $regfile = "m8def.dat" |
2 | $crystal = 8000000 |
3 | $hwstack = 40 |
4 | $swstack = 80 |
5 | $framesize = 90 |
6 | $baud = 9600 |
7 | |
8 | |
9 | |
10 | Config Portd.0 = Output |
11 | Config Portd.1 = Output |
12 | Config Portd.3 = Output |
13 | Config Portd.5 = Output |
14 | Config Portd.6 = Output |
15 | Config Portd.7 = Output |
16 | Config Portb.0 = Output |
17 | Config Portb.1 = Output |
18 | Config Portb.2 = Output |
19 | Config Portc.0 = Output |
20 | Config Portc.1 = Output |
21 | Config Portc.2 = Output |
22 | Config Portc.3 = Output |
23 | Config Portc.4 = Output |
24 | Config Portc.5 = Output |
25 | |
26 | |
27 | Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16 |
28 | Spiinit
|
29 | |
30 | |
31 | |
32 | |
33 | Config Pind.2 = Input 'MCP Interrupt MCP2515 /INT |
34 | Css Alias Portd.4 |
35 | Config Css = Output |
36 | Set Css |
37 | Wait 1 |
38 | |
39 | |
40 | Config Int0 = Falling 'INT MCP ist low aktiv |
41 | On Int0 Int_mcp 'Wenn INT, dann Routine INT_mcp aufrufen |
42 | Enable Int0 'INT0 einschalten |
43 | Enable Interrupts |
44 | |
45 | |
46 | Declare Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte) |
47 | Declare Sub Mcp2515_read_register(byval Adress As Byte ) |
48 | Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte) |
49 | |
50 | |
51 | Dim Mcphilf As Byte |
52 | Dim Canin As Byte |
53 | |
54 | |
55 | |
56 | Const Spi_reset = &HC0 |
57 | Const Spi_write = &H02 |
58 | Const Spi_read = &H03 |
59 | Const Spi_rts0 = &H81 |
60 | Const Spi_rts1 = &H82 |
61 | Const Spi_rts2 = &H84 |
62 | Const Spi_read_status = &HA0 |
63 | Const Spi_bit_modify = &H05 |
64 | |
65 | Const Rxb0ctrl = &H60 |
66 | Const Rxb1ctrl = &H70 |
67 | |
68 | Const Rxm0sidh = &H20 |
69 | Const Rxm0sidl = &H21 |
70 | Const Rxm1sidh = &H24 |
71 | Const Rxm1sidl = &H25 |
72 | |
73 | Const Rxf0sidh = &H00 |
74 | Const Rxf0sidl = &H01 |
75 | Const Rxf1sidh = &H04 |
76 | Const Rxf1sidl = &H05 |
77 | |
78 | Const Rxb0d0 = &H66 'Receive Buffer 0 Data Byte 0 |
79 | Const Rxb0d1 = &H67 'Receive Buffer 0 Data Byte 1 |
80 | Const Rxb0d2 = &H68 'Receive Buffer 0 Data Byte 2 |
81 | Const Rxb0d3 = &H69 'Receive Buffer 0 Data Byte 3 |
82 | Const Rxb0d4 = &H6A 'Receive Buffer 0 Data Byte 4 |
83 | Const Rxb0d5 = &H6B 'Receive Buffer 0 Data Byte 5 |
84 | Const Rxb0d6 = &H6C 'Receive Buffer 0 Data Byte 6 |
85 | Const Rxb0d7 = &H6D 'Receive Buffer 0 Data Byte 7 |
86 | |
87 | |
88 | Const Bfpctrl = &H0C |
89 | Const Txrtsctrl = &H0D |
90 | Const Canctrl = &H0F |
91 | |
92 | Const Txb0ctrl = &H30 ' Transmit Buffer 0 Control Register |
93 | Const Txb0sidh = &H31 ' Transmit Buffer 0 Std Identifier High |
94 | Const Txb0sidl = &H32 ' Transmit Buffer 0 Std Identifier Low |
95 | Const Txb0dlc = &H35 ' Transmit Buffer 0 Data Length Code |
96 | Const Txb0d0 = &H36 ' Transmit Buffer 0 Data Byte 0 |
97 | Const Txb0d1 = &H37 ' Transmit Buffer 0 Data Byte 1 |
98 | Const Txb0d2 = &H38 ' Transmit Buffer 0 Data Byte 2 |
99 | Const Txb0d3 = &H39 ' Transmit Buffer 0 Data Byte 3 |
100 | Const Txb0d4 = &H3A ' Transmit Buffer 0 Data Byte 4 |
101 | Const Txb0d5 = &H3B ' Transmit Buffer 0 Data Byte 5 |
102 | Const Txb0d6 = &H3C ' Transmit Buffer 0 Data Byte 6 |
103 | Const Txb0d7 = &H3D ' Transmit Buffer 0 Data Byte 7 |
104 | |
105 | Const Txb1ctrl = &H40 ' Transmit Buffer 1 Control Register |
106 | Const Txb1sidh = &H41 ' Transmit Buffer 1 Std Identifier High |
107 | Const Txb1sidl = &H42 ' Transmit Buffer 1 Std Identifier Low |
108 | Const Txb1dlc = &H45 ' Transmit Buffer 1 Data Length Code |
109 | Const Txb1d0 = &H46 ' Transmit Buffer 1 Data Byte 0 |
110 | Const Txb1d1 = &H47 ' Transmit Buffer 1 Data Byte 1 |
111 | Const Txb1d2 = &H48 ' Transmit Buffer 1 Data Byte 2 |
112 | Const Txb1d3 = &H49 ' Transmit Buffer 1 Data Byte 3 |
113 | Const Txb1d4 = &H4A ' Transmit Buffer 1 Data Byte 4 |
114 | Const Txb1d5 = &H4B ' Transmit Buffer 1 Data Byte 5 |
115 | Const Txb1d6 = &H4C ' Transmit Buffer 1 Data Byte 6 |
116 | Const Txb1d7 = &H4D ' Transmit Buffer 1 Data Byte 7 |
117 | |
118 | Const Txb2ctrl = &H50 ' Transmit Buffer 2 Control Register |
119 | Const Txb2sidh = &H51 ' Transmit Buffer 2 Std Identifier High |
120 | Const Txb2sidl = &H52 ' Transmit Buffer 2 Std Identifier Low |
121 | Const Txb2dlc = &H55 ' Transmit Buffer 2 Data Length Code |
122 | Const Txb2d0 = &H56 ' Transmit Buffer 2 Data Byte 0 |
123 | Const Txb2d1 = &H57 ' Transmit Buffer 2 Data Byte 1 |
124 | Const Txb2d2 = &H58 ' Transmit Buffer 2 Data Byte 2 |
125 | Const Txb2d3 = &H59 ' Transmit Buffer 2 Data Byte 3 |
126 | Const Txb2d4 = &H5A ' Transmit Buffer 2 Data Byte 4 |
127 | Const Txb2d5 = &H5B ' Transmit Buffer 2 Data Byte 5 |
128 | Const Txb2d6 = &H5C ' Transmit Buffer 2 Data Byte 6 |
129 | Const Txb2d7 = &H5D ' Transmit Buffer 2 Data Byte 7 |
130 | |
131 | Const Rxb0sidh = &H61 |
132 | Const Rxb0sidl = &H62 |
133 | Const Rxb0dlc = &H65 |
134 | Const Rxb1sidh = &H71 |
135 | Const Rxb1sidl = &H72 |
136 | Const Rxb1dlc = &H75 |
137 | |
138 | Const Cnf1 = &H2A |
139 | Const Cnf2 = &H29 |
140 | Const Cnf3 = &H28 |
141 | Const Caninte = &H2B |
142 | Const Canintf = &H2C |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | Mcp2515_init: |
151 | |
152 | Mcphilf = Spi_reset |
153 | Reset Css |
154 | Waitus 10 |
155 | Spdr = Mcphilf |
156 | Do
|
157 | Loop Until Spsr.spif = 1 |
158 | Waitus 10 |
159 | Set Css |
160 | |
161 | Mcp2515_write_register Cnf1 , &H03 |
162 | Mcp2515_write_register Cnf2 , &HBA |
163 | Mcp2515_write_register Cnf3 , &H07 |
164 | |
165 | |
166 | 'Interrupt einstellen |
167 | Mcp2515_write_register Caninte , &B00000011 |
168 | Mcp2515_write_register Canintf , &B00000000 |
169 | Mcp2515_write_register Rxb0ctrl , &B01100000 |
170 | Mcp2515_write_register Rxb1ctrl , &B01100000 |
171 | |
172 | |
173 | Mcp2515_write_register Rxm0sidh , &B00000000 |
174 | Mcp2515_write_register Rxm0sidl , &B00000000 |
175 | Mcp2515_write_register Rxm1sidh , &B00000000 |
176 | Mcp2515_write_register Rxm1sidl , &B00000000 |
177 | |
178 | 'Filter |
179 | |
180 | Mcp2515_write_register Rxf0sidh , &B00000000 |
181 | Mcp2515_write_register Rxf0sidl , &B00000000 |
182 | Mcp2515_write_register Rxf1sidh , &B00000000 |
183 | Mcp2515_write_register Rxf1sidl , &B00000000 |
184 | |
185 | |
186 | Mcp2515_bitmodify Canctrl , &B11101000 , &B00001000 '??? |
187 | |
188 | Do
|
189 | Waitms 10 |
190 | Loop
|
191 | |
192 | End
|
193 | |
194 | |
195 | |
196 | Int_mcp: |
197 | Gosub Lesen |
198 | Return
|
199 | |
200 | |
201 | Lesen: |
202 | Mcp2515_read_register Rxb0d0 |
203 | Print "Daten Eingang:" ; Canin |
204 | Mcp2515_read_register Rxb0d1 |
205 | Print "Daten Eingang:" ; Canin |
206 | |
207 | 'hier muss jetzt was hin, damit der Int. vom MCP geloescht wird!!! |
208 | Return
|
209 | |
210 | |
211 | |
212 | |
213 | |
214 | |
215 | 'schreiben |
216 | |
217 | Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte) |
218 | Mcphilf = Spi_write |
219 | Reset Css |
220 | Spdr = Mcphilf |
221 | Do
|
222 | Loop Until Spsr.spif = 1 |
223 | Waitms 2 |
224 | Spdr = Adress |
225 | Do
|
226 | Loop Until Spsr.spif = 1 |
227 | Spdr = Daten |
228 | Do
|
229 | Loop Until Spsr.spif = 1 |
230 | Set Css |
231 | End Sub |
232 | |
233 | |
234 | |
235 | 'lesen |
236 | |
237 | Sub Mcp2515_read_register(byval Adress As Byte ) |
238 | Mcphilf = Spi_read |
239 | Reset Css |
240 | Spdr = Mcphilf |
241 | Do
|
242 | Loop Until Spsr.spif = 1 |
243 | Waitms 2 |
244 | Spdr = Adress |
245 | Do
|
246 | Loop Until Spsr.spif = 1 |
247 | Spdr = 0 |
248 | Do
|
249 | Loop Until Spsr.spif = 1 |
250 | Canin = Spdr |
251 | Set Css |
252 | End Sub |
253 | |
254 | |
255 | 'bitmodify |
256 | |
257 | Sub Mcp2515_bitmodify(reg_add , Reg_mask , Reg_val) |
258 | |
259 | Reset Css |
260 | Mcphilf = Spi_bit_modify |
261 | Spdr = Mcphilf |
262 | Do
|
263 | Loop Until Spsr.spif = 1 |
264 | Waitms 2 |
265 | Spdr = Reg_add |
266 | Do
|
267 | Loop Until Spsr.spif = 1 |
268 | Spdr = Reg_mask |
269 | Do
|
270 | Loop Until Spsr.spif = 1 |
271 | Spdr = Reg_val |
272 | Do
|
273 | Loop Until Spsr.spif = 1 |
274 | Set Css |
275 | |
276 | End Sub |
danke Gruss Alex
So, nachdem ich das Problem mit dem Filter geklärt habe, ist mir nur noch der Interrupt im Weg zum Ziel. Warum bleibt er erhalten? Hier der Aktuelle code:
1 | $regfile = "m8def.dat" |
2 | $crystal = 8000000 |
3 | $hwstack = 40 |
4 | $swstack = 80 |
5 | $framesize = 90 |
6 | $baud = 9600 |
7 | |
8 | |
9 | Config Portd.0 = Output |
10 | Config Portd.1 = Output |
11 | Config Portd.3 = Output |
12 | Config Portd.5 = Output |
13 | Config Portd.6 = Output |
14 | Config Portd.7 = Output |
15 | Config Portb.0 = Output |
16 | Config Portb.1 = Output |
17 | Config Portb.2 = Output |
18 | Config Portc.0 = Output |
19 | Config Portc.1 = Output |
20 | Config Portc.2 = Output |
21 | Config Portc.3 = Output |
22 | Config Portc.4 = Output |
23 | Config Portc.5 = Output |
24 | |
25 | |
26 | Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16 |
27 | Spiinit
|
28 | |
29 | |
30 | Config Pind.2 = Input 'MCP Interrupt MCP2515 /INT |
31 | Css Alias Portd.4 |
32 | Config Css = Output |
33 | Set Css |
34 | Wait 1 |
35 | |
36 | |
37 | Config Int0 = Falling 'INT MCP ist low aktiv |
38 | On Int0 Int_mcp 'Wenn INT, dann Routine INT_mcp aufrufen |
39 | Enable Int0 'INT0 einschalten |
40 | Enable Interrupts |
41 | |
42 | |
43 | Declare Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte) |
44 | Declare Sub Mcp2515_read_register(byval Adress As Byte ) |
45 | Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte) |
46 | |
47 | |
48 | Dim Mcphilf As Byte |
49 | Dim Canin As Byte |
50 | |
51 | |
52 | |
53 | Const Spi_reset = &HC0 |
54 | Const Spi_write = &H02 |
55 | Const Spi_read = &H03 |
56 | Const Spi_rts0 = &H81 |
57 | Const Spi_rts1 = &H82 |
58 | Const Spi_rts2 = &H84 |
59 | Const Spi_read_status = &HA0 |
60 | Const Spi_bit_modify = &H05 |
61 | |
62 | Const Rxb0ctrl = &H60 |
63 | Const Rxb1ctrl = &H70 |
64 | |
65 | Const Rxm0sidh = &H20 |
66 | Const Rxm0sidl = &H21 |
67 | Const Rxm1sidh = &H24 |
68 | Const Rxm1sidl = &H25 |
69 | |
70 | Const Rxf0sidh = &H00 |
71 | Const Rxf0sidl = &H01 |
72 | Const Rxf1sidh = &H04 |
73 | Const Rxf1sidl = &H05 |
74 | |
75 | Const Rxb0d0 = &H66 'Receive Buffer 0 Data Byte 0 |
76 | Const Rxb0d1 = &H67 'Receive Buffer 0 Data Byte 1 |
77 | Const Rxb0d2 = &H68 'Receive Buffer 0 Data Byte 2 |
78 | Const Rxb0d3 = &H69 'Receive Buffer 0 Data Byte 3 |
79 | Const Rxb0d4 = &H6A 'Receive Buffer 0 Data Byte 4 |
80 | Const Rxb0d5 = &H6B 'Receive Buffer 0 Data Byte 5 |
81 | Const Rxb0d6 = &H6C 'Receive Buffer 0 Data Byte 6 |
82 | Const Rxb0d7 = &H6D 'Receive Buffer 0 Data Byte 7 |
83 | |
84 | |
85 | Const Bfpctrl = &H0C |
86 | Const Txrtsctrl = &H0D |
87 | Const Canctrl = &H0F |
88 | |
89 | Const Txb0ctrl = &H30 ' Transmit Buffer 0 Control Register |
90 | Const Txb0sidh = &H31 ' Transmit Buffer 0 Std Identifier High |
91 | Const Txb0sidl = &H32 ' Transmit Buffer 0 Std Identifier Low |
92 | Const Txb0dlc = &H35 ' Transmit Buffer 0 Data Length Code |
93 | Const Txb0d0 = &H36 ' Transmit Buffer 0 Data Byte 0 |
94 | Const Txb0d1 = &H37 ' Transmit Buffer 0 Data Byte 1 |
95 | Const Txb0d2 = &H38 ' Transmit Buffer 0 Data Byte 2 |
96 | Const Txb0d3 = &H39 ' Transmit Buffer 0 Data Byte 3 |
97 | Const Txb0d4 = &H3A ' Transmit Buffer 0 Data Byte 4 |
98 | Const Txb0d5 = &H3B ' Transmit Buffer 0 Data Byte 5 |
99 | Const Txb0d6 = &H3C ' Transmit Buffer 0 Data Byte 6 |
100 | Const Txb0d7 = &H3D ' Transmit Buffer 0 Data Byte 7 |
101 | |
102 | Const Txb1ctrl = &H40 ' Transmit Buffer 1 Control Register |
103 | Const Txb1sidh = &H41 ' Transmit Buffer 1 Std Identifier High |
104 | Const Txb1sidl = &H42 ' Transmit Buffer 1 Std Identifier Low |
105 | Const Txb1dlc = &H45 ' Transmit Buffer 1 Data Length Code |
106 | Const Txb1d0 = &H46 ' Transmit Buffer 1 Data Byte 0 |
107 | Const Txb1d1 = &H47 ' Transmit Buffer 1 Data Byte 1 |
108 | Const Txb1d2 = &H48 ' Transmit Buffer 1 Data Byte 2 |
109 | Const Txb1d3 = &H49 ' Transmit Buffer 1 Data Byte 3 |
110 | Const Txb1d4 = &H4A ' Transmit Buffer 1 Data Byte 4 |
111 | Const Txb1d5 = &H4B ' Transmit Buffer 1 Data Byte 5 |
112 | Const Txb1d6 = &H4C ' Transmit Buffer 1 Data Byte 6 |
113 | Const Txb1d7 = &H4D ' Transmit Buffer 1 Data Byte 7 |
114 | |
115 | Const Txb2ctrl = &H50 ' Transmit Buffer 2 Control Register |
116 | Const Txb2sidh = &H51 ' Transmit Buffer 2 Std Identifier High |
117 | Const Txb2sidl = &H52 ' Transmit Buffer 2 Std Identifier Low |
118 | Const Txb2dlc = &H55 ' Transmit Buffer 2 Data Length Code |
119 | Const Txb2d0 = &H56 ' Transmit Buffer 2 Data Byte 0 |
120 | Const Txb2d1 = &H57 ' Transmit Buffer 2 Data Byte 1 |
121 | Const Txb2d2 = &H58 ' Transmit Buffer 2 Data Byte 2 |
122 | Const Txb2d3 = &H59 ' Transmit Buffer 2 Data Byte 3 |
123 | Const Txb2d4 = &H5A ' Transmit Buffer 2 Data Byte 4 |
124 | Const Txb2d5 = &H5B ' Transmit Buffer 2 Data Byte 5 |
125 | Const Txb2d6 = &H5C ' Transmit Buffer 2 Data Byte 6 |
126 | Const Txb2d7 = &H5D ' Transmit Buffer 2 Data Byte 7 |
127 | |
128 | Const Rxb0sidh = &H61 |
129 | Const Rxb0sidl = &H62 |
130 | Const Rxb0dlc = &H65 |
131 | Const Rxb1sidh = &H71 |
132 | Const Rxb1sidl = &H72 |
133 | Const Rxb1dlc = &H75 |
134 | |
135 | Const Cnf1 = &H2A |
136 | Const Cnf2 = &H29 |
137 | Const Cnf3 = &H28 |
138 | Const Caninte = &H2B |
139 | Const Canintf = &H2C |
140 | |
141 | |
142 | |
143 | Mcp2515_init: |
144 | |
145 | 'mcp2515 reset |
146 | Mcphilf = Spi_reset |
147 | Reset Css |
148 | Waitus 10 |
149 | Spdr = Mcphilf |
150 | Do
|
151 | Loop Until Spsr.spif = 1 |
152 | Waitus 10 |
153 | Set Css |
154 | |
155 | Mcp2515_write_register Cnf1 , &H03 |
156 | Mcp2515_write_register Cnf2 , &HBA |
157 | Mcp2515_write_register Cnf3 , &H07 |
158 | |
159 | |
160 | 'Interrupt einstellen |
161 | Mcp2515_write_register Caninte , &B00000001 'Interrupt auslosen, wenn Nachricht in buffer 0 liegt |
162 | Mcp2515_write_register Canintf , &B00000000 'No interrupt pending |
163 | Mcp2515_write_register Rxb0ctrl , &B00100000 'Empfange nur durch filter eingestelle Standart ID, Acceptance Filter 0 (RXB0) |
164 | |
165 | |
166 | 'Maske |
167 | Mcp2515_write_register Rxm0sidh , &B11111111 'Maske High |
168 | Mcp2515_write_register Rxm0sidl , &B11100000 'Maske Low |
169 | |
170 | |
171 | 'Filter |
172 | |
173 | Mcp2515_write_register Rxf0sidh , &B10111000 'Filter High |
174 | Mcp2515_write_register Rxf0sidl , &B01100000 'Filter Low , bit 3 EXIDE Filter fuer Standert Frame |
175 | |
176 | |
177 | |
178 | Mcp2515_bitmodify Canctrl , &B11101000 , &B00001000 '??? |
179 | |
180 | Do
|
181 | Waitms 10 |
182 | Loop
|
183 | |
184 | End
|
185 | |
186 | |
187 | |
188 | Int_mcp: |
189 | Gosub Lesen |
190 | Return
|
191 | |
192 | |
193 | Lesen: |
194 | Mcp2515_read_register Rxb0d0 |
195 | Print "Daten Eingang:" ; Canin |
196 | Mcp2515_read_register Rxb0d1 |
197 | Print "Daten Eingang:" ; Canin |
198 | |
199 | 'hier muss jetzt was hin, damit der Int. vom MCP geloescht wird!!! |
200 | Return
|
201 | |
202 | |
203 | |
204 | |
205 | 'schreiben |
206 | |
207 | Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte) |
208 | Mcphilf = Spi_write |
209 | Reset Css |
210 | Spdr = Mcphilf |
211 | Do
|
212 | Loop Until Spsr.spif = 1 |
213 | Waitms 2 |
214 | Spdr = Adress |
215 | Do
|
216 | Loop Until Spsr.spif = 1 |
217 | Spdr = Daten |
218 | Do
|
219 | Loop Until Spsr.spif = 1 |
220 | Set Css |
221 | End Sub |
222 | |
223 | |
224 | |
225 | 'lesen |
226 | |
227 | Sub Mcp2515_read_register(byval Adress As Byte ) |
228 | Mcphilf = Spi_read |
229 | Reset Css |
230 | Spdr = Mcphilf |
231 | Do
|
232 | Loop Until Spsr.spif = 1 |
233 | Waitms 2 |
234 | Spdr = Adress |
235 | Do
|
236 | Loop Until Spsr.spif = 1 |
237 | Spdr = 0 |
238 | Do
|
239 | Loop Until Spsr.spif = 1 |
240 | Canin = Spdr |
241 | Set Css |
242 | End Sub |
243 | |
244 | |
245 | 'bitmodify |
246 | |
247 | Sub Mcp2515_bitmodify(reg_add , Reg_mask , Reg_val) |
248 | |
249 | Reset Css |
250 | Mcphilf = Spi_bit_modify |
251 | Spdr = Mcphilf |
252 | Do
|
253 | Loop Until Spsr.spif = 1 |
254 | Waitms 2 |
255 | Spdr = Reg_add |
256 | Do
|
257 | Loop Until Spsr.spif = 1 |
258 | Spdr = Reg_mask |
259 | Do
|
260 | Loop Until Spsr.spif = 1 |
261 | Spdr = Reg_val |
262 | Do
|
263 | Loop Until Spsr.spif = 1 |
264 | Set Css |
265 | |
266 | End Sub |
Hat Jemand eine Idee? Gruss Alex
So, auch das hat geklappt. Die Zeile: Mcp2515_write_register Canintf , &B00000000 'No interrupt pending muss nach dem Auslesen des Buffers stehen, und nicht bei der Initializierung. Es sind aber noch einige Frage dazu gekommen. 1. In ein Buffer z.B. RXB0 passen ja 8 bytes an Daten. 2 Bytes schicke ich nur. Die Empfange ich auch an Rxb0d0 und Rxb0d1. Das ist alles richtig. Wenn ich aber noch Rxb0d3 auslesen, wo ich eigentlich nichts hin schicke, bekomme ich da nur Müll aus gelesen. Warum ist das so? Müssen da nicht Nullen rauskommen? Ich meine der Buffer ist ja dann leer. 2. Ich habe die Can-Geschwindigkeit über CNF1-3 auf 1000kbps eingestellt. Aber ich kann AUCH die Nachrichten mit 100kbps empfangen. Warum? Danke Gruss Alex
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.