Test4.c


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
}