1 | /*****************************************************
|
2 | This program was produced by the
|
3 | CodeWizardAVR V2.03.9 Standard
|
4 | Automatic Program Generator
|
5 | © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
|
6 | http://www.hpinfotech.com
|
7 |
|
8 | Project :
|
9 | Version :
|
10 | Date : 05.03.2011
|
11 | Author : -
|
12 | Company : -
|
13 | Comments:
|
14 |
|
15 |
|
16 | Chip type : ATmega8
|
17 | Program type : Application
|
18 | AVR Core Clock frequency: 4,000000 MHz
|
19 | Memory model : Small
|
20 | External RAM size : 0
|
21 | Data Stack size : 256
|
22 | *****************************************************/
|
23 |
|
24 | #include <mega8.h>
|
25 |
|
26 | // SPI functions
|
27 | #include <spi.h>
|
28 | #include <mcp2515_defs.h>
|
29 | #include <delay.h>
|
30 | #include <stdio.h>
|
31 |
|
32 |
|
33 | int timer1 = 0;
|
34 | bit CAN_message_received_CAN1 = 0;
|
35 | bit CAN_message_received_CAN2 = 0;
|
36 |
|
37 | // Timer 1 output compare A interrupt service routine
|
38 | interrupt [TIM1_COMPA] void timer1_compa_isr(void)
|
39 | {
|
40 | // timer1++;
|
41 |
|
42 | }
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | // Declare your global variables here
|
50 |
|
51 | #define PORT_CS PORTB
|
52 | #define P_CS_CAN1 2
|
53 | #define P_CS_CAN2 1
|
54 |
|
55 | typedef struct
|
56 | {
|
57 | unsigned int id;
|
58 | unsigned char rtr;
|
59 | unsigned char length;
|
60 | unsigned char data[8];
|
61 | } CANMessage;
|
62 |
|
63 |
|
64 | // Neue Nachricht erzeugen
|
65 | CANMessage message, Receive_msg_CAN1, Receive_msg_CAN2, Transmit_msg_CAN1, Transmit_msg_CAN2;
|
66 |
|
67 |
|
68 | // CS des entsprechenden MCP2515 auf Low ziehen
|
69 | void mcp2515_CS_LOW (unsigned char channel)
|
70 | {
|
71 | // CS des entsprechenden MCP2515 auf Low ziehen
|
72 | switch (channel)
|
73 | {
|
74 | case 1:
|
75 | PORT_CS &= ~(1<<P_CS_CAN1); //CS = 2
|
76 | break;
|
77 | case 2:
|
78 | PORT_CS &= ~(1<<P_CS_CAN2); //CS = 1
|
79 | break;
|
80 | default:
|
81 | PORT_CS &= ~(1<<P_CS_CAN1); //CS = 2 // default Channel1
|
82 | break;
|
83 | }
|
84 | }
|
85 |
|
86 | // CS des entsprechenden MCP2515 auf High ziehen, wieder freigeben
|
87 | void mcp2515_CS_HIGH (unsigned char channel)
|
88 | {
|
89 | // /CS Leitung wieder freigeben
|
90 | switch (channel)
|
91 | {
|
92 | case 1:
|
93 | PORT_CS |= (1<<P_CS_CAN1); //CS = 2
|
94 | break;
|
95 | case 2:
|
96 | PORT_CS |= (1<<P_CS_CAN2); //CS = 1
|
97 | break;
|
98 | default:
|
99 | PORT_CS |= (1<<P_CS_CAN1); // default Channel1
|
100 | break;
|
101 | }
|
102 | }
|
103 |
|
104 |
|
105 |
|
106 |
|
107 | // Bytes über den SPI Bus schieben
|
108 | int spi_putc( int data )
|
109 | {
|
110 | // Sendet ein Byte
|
111 | SPDR = data;
|
112 |
|
113 | // Wartet bis Byte gesendet wurde
|
114 | while( !( SPSR & (1<<7) ) ) // SPIF = 7
|
115 | ;
|
116 |
|
117 | return SPDR;
|
118 | }
|
119 |
|
120 | // mcp2515 Registerwerte schreiben
|
121 | void mcp2515_write_register( int adress, int data, unsigned char channel )
|
122 | {
|
123 | // CS des entsprechenden MCP2515 auf Low ziehen
|
124 | mcp2515_CS_LOW(channel);
|
125 |
|
126 | spi_putc(SPI_WRITE); // SPI_WRITE = 0x02h (mcp2515_defs.h)
|
127 | spi_putc(adress);
|
128 | spi_putc(data);
|
129 |
|
130 | // /CS Leitung wieder freigeben
|
131 | mcp2515_CS_HIGH(channel);
|
132 | }
|
133 |
|
134 |
|
135 |
|
136 | // mcp2515 Registerwerte lesen
|
137 | int mcp2515_read_register(int adress, unsigned char channel )
|
138 | {
|
139 | int data;
|
140 |
|
141 | // /CS des MCP2515 auf Low ziehen
|
142 | mcp2515_CS_LOW(channel);
|
143 |
|
144 | spi_putc(SPI_READ); // SPI_READ = 0x03h (mcp2515_defs.h)
|
145 | spi_putc(adress);
|
146 |
|
147 | data = spi_putc(0xff);
|
148 |
|
149 | // /CS Leitung wieder freigeben
|
150 | mcp2515_CS_HIGH(channel);
|
151 |
|
152 | return data;
|
153 | }
|
154 |
|
155 | // mcp2515 Einzelne Bits setzen/löschen
|
156 | void mcp2515_bit_modify(int adress, int mask, int data, unsigned char channel)
|
157 | {
|
158 | // /CS des MCP2515 auf Low ziehen
|
159 | mcp2515_CS_LOW(channel);
|
160 |
|
161 | spi_putc(SPI_BIT_MODIFY); // SPI_BIT_MODIFY = 0x05 (mcp2515_defs.h)
|
162 | spi_putc(adress);
|
163 | spi_putc(mask);
|
164 | spi_putc(data);
|
165 |
|
166 | // /CS Leitung wieder freigeben
|
167 | mcp2515_CS_HIGH(channel);
|
168 | }
|
169 |
|
170 | // Senden mit allen drei Puffern
|
171 | unsigned char can_send_message(CANMessage *p_message, unsigned char channel)
|
172 | {
|
173 | unsigned char status, address;
|
174 | unsigned char length = p_message->length;
|
175 | unsigned char i;
|
176 |
|
177 | // Status des MCP2515 auslesen
|
178 | // PORT_CS &= ~(1<<P_CS); löschen
|
179 | // /CS des MCP2515 auf Low ziehen
|
180 | mcp2515_CS_LOW(channel);
|
181 | spi_putc(SPI_READ_STATUS);
|
182 | status = spi_putc(0xff);
|
183 | spi_putc(0xff);
|
184 | // PORT_CS |= (1<<P_CS); löschen
|
185 | // /CS Leitung wieder freigeben
|
186 | mcp2515_CS_HIGH(channel);
|
187 |
|
188 |
|
189 | /* Statusbyte:
|
190 | *
|
191 | * Bit Funktion
|
192 | * 2 TXB0CNTRL.TXREQ
|
193 | * 4 TXB1CNTRL.TXREQ
|
194 | * 6 TXB2CNTRL.TXREQ
|
195 | */
|
196 |
|
197 | /*if (bit_is_clear(status, 2)) {
|
198 | address = 0x00;
|
199 | }
|
200 | else if (bit_is_clear(status, 4)) {
|
201 | address = 0x02;
|
202 | }
|
203 | else if (bit_is_clear(status, 6)) {
|
204 | address = 0x04;
|
205 | }
|
206 | else {
|
207 | Alle Puffer sind belegt,
|
208 | Nachricht kann nicht verschickt werden
|
209 | return 0;
|
210 | }
|
211 | */
|
212 |
|
213 | if (!(status & 0x4))
|
214 | {
|
215 | address = 0x00;
|
216 | }
|
217 | else if (!(status & 0x10))
|
218 | {
|
219 | address = 0x02;
|
220 | }
|
221 | else if (!(status & 0x40))
|
222 | {
|
223 | address = 0x04;
|
224 | }
|
225 | else
|
226 | {
|
227 | /* Alle Puffer sind belegt,
|
228 | Nachricht kann nicht verschickt werden */
|
229 | return 0;
|
230 | }
|
231 |
|
232 |
|
233 |
|
234 | // PORT_CS &= ~(1<<P_CS); // CS Low // löschen
|
235 | // /CS des MCP2515 auf Low ziehen
|
236 | mcp2515_CS_LOW(channel);
|
237 | spi_putc(SPI_WRITE_TX | address);
|
238 |
|
239 | // Standard ID einstellen
|
240 | spi_putc((unsigned char) (p_message->id>>3));
|
241 | spi_putc((unsigned char) (p_message->id<<5));
|
242 |
|
243 | // Extended ID
|
244 | spi_putc(0x00);
|
245 | spi_putc(0x00);
|
246 |
|
247 |
|
248 |
|
249 | if (length > 8) {
|
250 | length = 8;
|
251 | }
|
252 |
|
253 | // Ist die Nachricht ein "Remote Transmit Request" ?
|
254 | if (p_message->rtr)
|
255 | {
|
256 | /* Ein RTR hat zwar eine Laenge,
|
257 | aber enthaelt keine Daten */
|
258 |
|
259 | // Nachrichten Laenge + RTR einstellen
|
260 | spi_putc((1<<RTR) | length);
|
261 | }
|
262 | else
|
263 | {
|
264 | // Nachrichten Laenge einstellen
|
265 | spi_putc(length);
|
266 |
|
267 | // Daten
|
268 | for (i=0;i<length;i++) {
|
269 | spi_putc(p_message->data[i]);
|
270 | }
|
271 | }
|
272 | // PORT_CS |= (1<<P_CS); // CS auf High löschen
|
273 | // /CS Leitung wieder freigeben
|
274 | mcp2515_CS_HIGH(channel);
|
275 |
|
276 | /*asm*/ volatile ("nop"); // asm ???
|
277 |
|
278 | /* CAN Nachricht verschicken
|
279 | die letzten drei Bit im RTS Kommando geben an welcher
|
280 | Puffer gesendet werden soll */
|
281 | // PORT_CS &= ~(1<<P_CS); // CS wieder Low löschen
|
282 | // /CS des MCP2515 auf Low ziehen
|
283 | mcp2515_CS_LOW(channel);
|
284 | if (address == 0x00) {
|
285 | spi_putc(SPI_RTS | 0x01);
|
286 | } else {
|
287 | spi_putc(SPI_RTS | address);
|
288 | }
|
289 | // PORT_CS |= (1<<P_CS); // CS auf High löschen
|
290 | // /CS Leitung wieder freigeben
|
291 | mcp2515_CS_HIGH(channel);
|
292 |
|
293 | return 1;
|
294 | }
|
295 |
|
296 |
|
297 |
|
298 | unsigned char mcp2515_read_rx_status(unsigned char channel)
|
299 | {
|
300 | unsigned char data;
|
301 |
|
302 | // /CS des MCP2515 auf Low ziehen
|
303 | mcp2515_CS_LOW(channel);
|
304 |
|
305 | spi_putc(SPI_RX_STATUS);
|
306 | data = spi_putc(0xff);
|
307 |
|
308 | // Die Daten werden noch einmal wiederholt gesendet,
|
309 | // man braucht also nur eins der beiden Bytes auswerten.
|
310 | spi_putc(0xff);
|
311 |
|
312 | // /CS Leitung wieder freigeben
|
313 | mcp2515_CS_HIGH(channel);
|
314 |
|
315 | return data;
|
316 | }
|
317 |
|
318 |
|
319 | unsigned char can_get_message(CANMessage *p_message, unsigned char channel)
|
320 | {
|
321 | unsigned char i;
|
322 | unsigned char length;
|
323 |
|
324 | // Status auslesen
|
325 | unsigned char status = mcp2515_read_rx_status(channel);
|
326 |
|
327 | //if (bit_is_set(status,6))
|
328 | if ((status & 0x40))
|
329 | {
|
330 | // Nachricht in Puffer 0
|
331 |
|
332 | // PORT_CS &= ~(1<<P_CS); // CS Low löschen
|
333 | // /CS des MCP2515 auf Low ziehen
|
334 | mcp2515_CS_LOW(channel);
|
335 | spi_putc(SPI_READ_RX);
|
336 | }
|
337 | else //if (bit_is_set(status,7))
|
338 | if ((status & 0x80))
|
339 | {
|
340 | // Nachricht in Puffer 1
|
341 |
|
342 | // PORT_CS &= ~(1<<P_CS); // CS Low löschen
|
343 | // /CS des MCP2515 auf Low ziehen
|
344 | mcp2515_CS_LOW(channel);
|
345 | spi_putc(SPI_READ_RX | 0x04);
|
346 | }
|
347 | else {
|
348 | /* Fehler: Keine neue Nachricht vorhanden */
|
349 | return 0xff;
|
350 | }
|
351 |
|
352 | // Standard ID auslesen
|
353 | p_message->id = (unsigned int) spi_putc(0xff) << 3;
|
354 | p_message->id |= (unsigned int) spi_putc(0xff) >> 5;
|
355 |
|
356 | spi_putc(0xff);
|
357 | spi_putc(0xff);
|
358 |
|
359 | // Laenge auslesen
|
360 | length = spi_putc(0xff) & 0x0f;
|
361 | p_message->length = length;
|
362 |
|
363 | // Daten auslesen
|
364 | for (i=0;i<length;i++) {
|
365 | p_message->data[i] = spi_putc(0xff);
|
366 | }
|
367 |
|
368 | // PORT_CS |= (1<<P_CS); löschen
|
369 | // /CS Leitung wieder freigeben
|
370 | mcp2515_CS_HIGH(channel);
|
371 |
|
372 | //if (bit_is_set(status,3))
|
373 | if ((status & 0x8))
|
374 | {
|
375 | p_message->rtr = 1;
|
376 | } else {
|
377 | p_message->rtr = 0;
|
378 | }
|
379 |
|
380 | // Interrupt Flag loeschen
|
381 | // if (bit_is_set(status,6))
|
382 | if ((status & 0x40))
|
383 | {
|
384 | mcp2515_bit_modify(CANINTF, (1<<RX0IF), 0, channel);
|
385 | } else {
|
386 | mcp2515_bit_modify(CANINTF, (1<<RX1IF), 0, channel);
|
387 | }
|
388 |
|
389 | return (status & 0x07);
|
390 | }
|
391 |
|
392 | void mcp2515_reset (unsigned char channel)
|
393 | {
|
394 | // MCP2515 per Software Reset zuruecksetzten,
|
395 | // danach ist der MCP2515 im Configuration Mode
|
396 | // /CS des MCP2515 auf Low ziehen
|
397 | mcp2515_CS_LOW(channel);
|
398 | spi_putc( SPI_RESET );
|
399 | delay_ms(1);
|
400 | // /CS Leitung wieder freigeben
|
401 | mcp2515_CS_HIGH(channel);
|
402 | }
|
403 |
|
404 | // External Interrupt 1 service routine
|
405 | // Interrupt für CAN1
|
406 | interrupt [EXT_INT1] void ext_int1_isr(void)
|
407 | {
|
408 | can_get_message(&Receive_msg_CAN1, P_CS_CAN1);
|
409 | CAN_message_received_CAN1=1;
|
410 | }
|
411 |
|
412 | // External Interrupt 0 service routine
|
413 | // Interrupt für CAN2
|
414 | interrupt [EXT_INT0] void ext_int0_isr(void)
|
415 | {
|
416 | can_get_message(&Receive_msg_CAN2, P_CS_CAN2);
|
417 | CAN_message_received_CAN2=1;
|
418 | }
|
419 |
|
420 | // Zeichen über USART einlesen
|
421 | int uart_getc(void)
|
422 | {
|
423 | while (!(UCSRA & (1<<7))) // warten bis Zeichen verfuegbar 7= RXC
|
424 | ;
|
425 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
426 | }
|
427 |
|
428 |
|
429 |
|
430 | // String über USART einlesen
|
431 | void uart_gets( char* Buffer, int MaxLen )
|
432 | {
|
433 | int NextChar;
|
434 | int StringLen = 0;
|
435 |
|
436 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
|
437 |
|
438 | // Sammle solange Zeichen, bis:
|
439 | // * entweder das String Ende Zeichen kam
|
440 | // * oder das aufnehmende Array voll ist
|
441 | while( NextChar != '\n' && StringLen < MaxLen - 1 )
|
442 | {
|
443 |
|
444 | *Buffer++ = NextChar;
|
445 | StringLen++;
|
446 | NextChar = uart_getc();
|
447 | }
|
448 |
|
449 | // Noch ein '\0' anhängen um einen Standard
|
450 | // C-String daraus zu machen
|
451 | *Buffer = '\0';
|
452 | }
|
453 |
|
454 |
|
455 |
|
456 |
|
457 |
|
458 | void main(void)
|
459 | {
|
460 | // Declare your local variables here
|
461 |
|
462 |
|
463 |
|
464 | // Daten eintragen
|
465 |
|
466 | message.id = 0x0125;
|
467 | message.rtr = 0;
|
468 | message.length = 2;
|
469 | message.data[0] = 0x04;
|
470 | message.data[1] = 0xf3;
|
471 |
|
472 |
|
473 |
|
474 |
|
475 | // Input/Output Ports initialization
|
476 | // Port B initialization
|
477 | // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
|
478 | // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
|
479 | PORTB=0x00;
|
480 | DDRB=0x2F;
|
481 |
|
482 | // Port C initialization
|
483 | // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
|
484 | // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
|
485 | PORTC=0x00;
|
486 | DDRC=0x00;
|
487 |
|
488 | // Port D initialization
|
489 | // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
|
490 | // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
|
491 | PORTD=0x00;
|
492 | DDRD=0x00;
|
493 |
|
494 | // Timer/Counter 0 initialization
|
495 | // Clock source: System Clock
|
496 | // Clock value: Timer 0 Stopped
|
497 | TCCR0=0x00;
|
498 | TCNT0=0x00;
|
499 |
|
500 | // Timer/Counter 1 initialization
|
501 | // Clock source: System Clock
|
502 | // Clock value: 4000,000 kHz
|
503 | // Mode: CTC top=OCR1A
|
504 | // OC1A output: Discon.
|
505 | // OC1B output: Discon.
|
506 | // Noise Canceler: Off
|
507 | // Input Capture on Falling Edge
|
508 | // Timer 1 Overflow Interrupt: Off
|
509 | // Input Capture Interrupt: Off
|
510 | // Compare A Match Interrupt: On
|
511 | // Compare B Match Interrupt: Off
|
512 | TCCR1A=0x00;
|
513 | TCCR1B=0x09;
|
514 | TCNT1H=0x00;
|
515 | TCNT1L=0x00;
|
516 | ICR1H=0x00;
|
517 | ICR1L=0x00;
|
518 | OCR1AH=0x9C;
|
519 | OCR1AL=0x3F;
|
520 | OCR1BH=0x00;
|
521 | OCR1BL=0x00;
|
522 |
|
523 | // Timer/Counter 2 initialization
|
524 | // Clock source: System Clock
|
525 | // Clock value: Timer 2 Stopped
|
526 | // Mode: Normal top=FFh
|
527 | // OC2 output: Disconnected
|
528 | ASSR=0x00;
|
529 | TCCR2=0x00;
|
530 | TCNT2=0x00;
|
531 | OCR2=0x00;
|
532 |
|
533 | // External Interrupt(s) initialization
|
534 | // INT0: On
|
535 | // INT0 Mode: Low level
|
536 | // INT1: On
|
537 | // INT1 Mode: Low level
|
538 | GICR|=0xC0;
|
539 | MCUCR=0x00;
|
540 | GIFR=0xC0;
|
541 |
|
542 |
|
543 | // Timer(s)/Counter(s) Interrupt(s) initialization
|
544 | TIMSK=0x10;
|
545 |
|
546 | // USART initialization
|
547 | // Communication Parameters: 8 Data, 1 Stop, No Parity
|
548 | // USART Receiver: Off
|
549 | // USART Transmitter: On
|
550 | // USART Mode: Asynchronous
|
551 | // USART Baud Rate: 9600
|
552 | UCSRA=0x00;
|
553 | UCSRB=0x18;
|
554 | UCSRC=0x86;
|
555 | UBRRH=0x00;
|
556 | UBRRL=0x19;
|
557 |
|
558 |
|
559 |
|
560 |
|
561 | // Analog Comparator initialization
|
562 | // Analog Comparator: Off
|
563 | // Analog Comparator Input Capture by Timer/Counter 1: Off
|
564 | ACSR=0x80;
|
565 | SFIOR=0x00;
|
566 |
|
567 | // SPI initialization
|
568 | // SPI Type: Master
|
569 | // SPI Clock Rate: 2*1000,000 kHz
|
570 | // SPI Clock Phase: Cycle Half
|
571 | // SPI Clock Polarity: Low
|
572 | // SPI Data Order: MSB First
|
573 | SPCR=0x50; // SPE=1 Beschreibt ob SPI angeschaltet ist oder abgeschaltet
|
574 | // MSTR=1 Beschreibt ob der Mikrocontroller als Master fungiert oder als Slave
|
575 | SPSR=0x01; // CPU Takt durch 2, SPI2X=1
|
576 |
|
577 |
|
578 | // MCP2515 per Software Reset zuruecksetzten,
|
579 | // danach ist der MCP2515 im Configuration Mode
|
580 | //PORT_CS &= ~(1<<P_CS);
|
581 | //spi_putc( SPI_RESET );
|
582 | //delay_ms(1);
|
583 | //PORT_CS |= (1<<P_CS);
|
584 | mcp2515_reset (P_CS_CAN1);
|
585 | mcp2515_reset (P_CS_CAN2);
|
586 |
|
587 |
|
588 | // etwas warten bis sich der MCP2515 zurueckgesetzt hat
|
589 | delay_ms(10);
|
590 |
|
591 |
|
592 |
|
593 | /*
|
594 | * Einstellen des Bit Timings
|
595 | *
|
596 | * Fosc = 16MHz
|
597 | * BRP = 7 (teilen durch 8)
|
598 | * TQ = 2 * (BRP + 1) / Fosc (=> 1 uS)
|
599 | *
|
600 | * Sync Seg = 1TQ
|
601 | * Prop Seg = (PRSEG + 1) * TQ = 1 TQ
|
602 | * Phase Seg1 = (PHSEG1 + 1) * TQ = 3 TQ
|
603 | * Phase Seg2 = (PHSEG2 + 1) * TQ = 3 TQ
|
604 | *
|
605 | * Bus speed = 1 / (Total # of TQ) * TQ
|
606 | * = 1 / 8 * TQ = 125 kHz
|
607 | */
|
608 |
|
609 |
|
610 |
|
611 | // BRP = 7
|
612 | // mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) ); // CAN Bitrate 125 kbps
|
613 | mcp2515_write_register( CNF1, (1<<BRP0) , P_CS_CAN1); // 500 kps
|
614 | mcp2515_write_register( CNF1, (1<<BRP0) , P_CS_CAN2); // 500 kps
|
615 |
|
616 | // Prop Seg und Phase Seg1 einstellen
|
617 | mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) , P_CS_CAN1);
|
618 | mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) , P_CS_CAN2);
|
619 |
|
620 | // Wake-up Filter deaktivieren, Phase Seg2 einstellen
|
621 | mcp2515_write_register( CNF3, (1<<PHSEG21) , P_CS_CAN1);
|
622 | mcp2515_write_register( CNF3, (1<<PHSEG21) , P_CS_CAN2);
|
623 |
|
624 | // Aktivieren der Rx Buffer Interrupts
|
625 | mcp2515_write_register(CANINTE, (1<<RX1IE)|(1<<RX0IE), P_CS_CAN1);
|
626 | mcp2515_write_register(CANINTE, (1<<RX1IE)|(1<<RX0IE), P_CS_CAN2);
|
627 |
|
628 | /*
|
629 | * Einstellen der Filter
|
630 | */
|
631 |
|
632 | // Buffer 0 : Empfangen aller Nachrichten
|
633 | mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0), P_CS_CAN1);
|
634 | mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0), P_CS_CAN2);
|
635 |
|
636 | // Buffer 1 : Empfangen aller Nachrichten
|
637 | mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0), P_CS_CAN1);
|
638 | mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0), P_CS_CAN2);
|
639 |
|
640 | // Alle Bits der Empfangsmaske loeschen,
|
641 | // damit werden alle Nachrichten empfangen
|
642 | mcp2515_write_register( RXM0SIDH, 0, P_CS_CAN1);
|
643 | mcp2515_write_register( RXM0SIDL, 0, P_CS_CAN1);
|
644 | mcp2515_write_register( RXM0EID8, 0, P_CS_CAN1);
|
645 | mcp2515_write_register( RXM0EID0, 0, P_CS_CAN1);
|
646 |
|
647 | mcp2515_write_register( RXM1SIDH, 0, P_CS_CAN1);
|
648 | mcp2515_write_register( RXM1SIDL, 0, P_CS_CAN1);
|
649 | mcp2515_write_register( RXM1EID8, 0, P_CS_CAN1);
|
650 | mcp2515_write_register( RXM1EID0, 0, P_CS_CAN1);
|
651 |
|
652 | mcp2515_write_register( RXM0SIDH, 0, P_CS_CAN2);
|
653 | mcp2515_write_register( RXM0SIDL, 0, P_CS_CAN2);
|
654 | mcp2515_write_register( RXM0EID8, 0, P_CS_CAN2);
|
655 | mcp2515_write_register( RXM0EID0, 0, P_CS_CAN2);
|
656 |
|
657 | mcp2515_write_register( RXM1SIDH, 0, P_CS_CAN2);
|
658 | mcp2515_write_register( RXM1SIDL, 0, P_CS_CAN2);
|
659 | mcp2515_write_register( RXM1EID8, 0, P_CS_CAN2);
|
660 | mcp2515_write_register( RXM1EID0, 0, P_CS_CAN2);
|
661 |
|
662 | /*
|
663 | * Einstellen der Pin Funktionen
|
664 | */
|
665 |
|
666 | // Deaktivieren der Pins RXnBF Pins (High Impedance State)
|
667 | mcp2515_write_register( BFPCTRL, 0, P_CS_CAN1);
|
668 | mcp2515_write_register( BFPCTRL, 0, P_CS_CAN2);
|
669 |
|
670 | // TXnRTS Bits als Inputs schalten
|
671 | mcp2515_write_register( TXRTSCTRL, 0, P_CS_CAN1);
|
672 | mcp2515_write_register( TXRTSCTRL, 0, P_CS_CAN2);
|
673 |
|
674 | // Device zurueck in den normalen Modus versetzten
|
675 | mcp2515_bit_modify( CANCTRL, 0xE0, 0, P_CS_CAN1);
|
676 | mcp2515_bit_modify( CANCTRL, 0xE0, 0, P_CS_CAN2);
|
677 |
|
678 | // Global enable interrupts
|
679 | #asm("sei")
|
680 |
|
681 | // PORTB |= (1<<0); // LED AUS
|
682 |
|
683 | while (1)
|
684 | {
|
685 | // Place your code here
|
686 |
|
687 |
|
688 | /* if (timer1 == 100)
|
689 | {
|
690 | //PORTB |= (1<<0); // LED AUS
|
691 | // Nachricht verschicken
|
692 | can_send_message(&message, P_CS_CAN1);
|
693 | can_send_message(&message, P_CS_CAN2);
|
694 |
|
695 | printf("Sende ID: 123\r");
|
696 | }
|
697 | if (timer1 == 200)
|
698 | {
|
699 | //PORTB &= ~(1<<0); // LED Ein
|
700 | timer1=0;
|
701 | }
|
702 |
|
703 | if (CAN_message_received_CAN1==1)
|
704 | {
|
705 | CAN_message_received_CAN1 = 0;
|
706 |
|
707 | printf("%d\r",Receive_msg_CAN1.id) ;
|
708 | printf("%d\r",Receive_msg_CAN1.data[0]) ;
|
709 | printf("%d\r",Receive_msg_CAN1.data[1]) ;
|
710 |
|
711 | if(Receive_msg_CAN1.id == 0x124)
|
712 | {
|
713 | PORTB &= ~(1<<0); // LED Ein
|
714 | }
|
715 | } */
|
716 | /* if (timer1 == 100)
|
717 | {
|
718 | //PORTB |= (1<<0); // LED AUS
|
719 | // Nachricht verschicken
|
720 | can_send_message(&message, P_CS_CAN1);
|
721 | can_send_message(&message, P_CS_CAN2);
|
722 |
|
723 | // printf("Sende ID: 123\r");
|
724 | }
|
725 | if (timer1 == 200)
|
726 | {
|
727 | //PORTB &= ~(1<<0); // LED Ein
|
728 | timer1=0;
|
729 | }
|
730 |
|
731 | */
|
732 |
|
733 |
|
734 | if (CAN_message_received_CAN1 ==1)
|
735 | {
|
736 | CAN_message_received_CAN1 = 0;
|
737 | //can_send_message(&Receive_msg_CAN1, P_CS_CAN2);
|
738 | //can_send_message(&message, P_CS_CAN1);
|
739 | printf("CAN1\r");
|
740 | printf("%d\r",Receive_msg_CAN1.id) ;
|
741 |
|
742 | }
|
743 |
|
744 | if (CAN_message_received_CAN2 ==1)
|
745 | {
|
746 | CAN_message_received_CAN2 = 0;
|
747 | //can_send_message(&Receive_msg_CAN2, P_CS_CAN1);
|
748 | //can_send_message(&message, P_CS_CAN1);
|
749 | printf("CAN2\r");
|
750 | }
|
751 |
|
752 |
|
753 |
|
754 | };
|
755 | }
|