ic2.c


1
#include <mega64.h>
2
#include <delay.h>
3
#include <stdio.h>                 
4
5
#define RXB8 1
6
#define TXB8 0
7
#define UPE 2
8
#define OVR 3
9
#define FE 4
10
#define UDRE 5
11
#define RXC 7
12
13
#define FRAMING_ERROR (1<<FE)
14
#define PARITY_ERROR (1<<UPE)
15
#define DATA_OVERRUN (1<<OVR)
16
#define DATA_REGISTER_EMPTY (1<<UDRE)
17
#define RX_COMPLETE (1<<RXC)
18
19
// USART0 Receiver buffer
20
#define RX_BUFFER_SIZE0 8
21
char rx_buffer0[RX_BUFFER_SIZE0];
22
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
23
// This flag is set on USART0 Receiver buffer overflow
24
bit rx_buffer_overflow0;
25
26
// USART0 Receiver interrupt service routine
27
#pragma savereg-
28
interrupt [USART0_RXC] void uart0_rx_isr(void)
29
{
30
char status,data;
31
#asm
32
    push r26
33
    push r27
34
    push r30
35
    push r31
36
    in   r26,sreg
37
    push r26
38
#endasm
39
status=UCSR0A;
40
data=UDR0;
41
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
42
   {
43
   rx_buffer0[rx_wr_index0]=data;
44
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
45
   if (++rx_counter0 == RX_BUFFER_SIZE0)
46
      {
47
      rx_counter0=0;
48
      rx_buffer_overflow0=1;
49
      };
50
   };
51
#asm
52
    pop  r26
53
    out  sreg,r26
54
    pop  r31
55
    pop  r30
56
    pop  r27
57
    pop  r26
58
#endasm
59
}
60
#pragma savereg+
61
62
#ifndef _DEBUG_TERMINAL_IO_
63
// Get a character from the USART0 Receiver buffer
64
#define _ALTERNATE_GETCHAR_
65
#pragma used+
66
char getchar(void)
67
{
68
char data;
69
while (rx_counter0==0);
70
data=rx_buffer0[rx_rd_index0];
71
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
72
#asm("cli")
73
--rx_counter0;
74
#asm("sei")
75
return data;
76
}
77
#pragma used-
78
#endif
79
80
// USART0 Transmitter buffer
81
#define TX_BUFFER_SIZE0 8
82
char tx_buffer0[TX_BUFFER_SIZE0];
83
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
84
85
// USART0 Transmitter interrupt service routine
86
#pragma savereg-
87
interrupt [USART0_TXC] void uart0_tx_isr(void)
88
{
89
#asm
90
    push r26
91
    push r27
92
    push r30
93
    push r31
94
    in   r26,sreg
95
    push r26
96
#endasm
97
if (tx_counter0)
98
   {
99
   --tx_counter0;
100
   UDR0=tx_buffer0[tx_rd_index0];
101
   if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
102
   };
103
#asm
104
    pop  r26
105
    out  sreg,r26
106
    pop  r31
107
    pop  r30
108
    pop  r27
109
    pop  r26
110
#endasm
111
}
112
#pragma savereg+
113
114
#ifndef _DEBUG_TERMINAL_IO_
115
// Write a character to the USART0 Transmitter buffer
116
#define _ALTERNATE_PUTCHAR_
117
#pragma used+
118
void putchar(char c)
119
{
120
while (tx_counter0 == TX_BUFFER_SIZE0);
121
#asm("cli")
122
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
123
   {
124
   tx_buffer0[tx_wr_index0]=c;
125
   if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
126
   ++tx_counter0;
127
   }
128
else UDR0=c;
129
#asm("sei")
130
}
131
#pragma used-
132
#endif
133
134
// USART1 Receiver buffer
135
#define RX_BUFFER_SIZE1 8
136
char rx_buffer1[RX_BUFFER_SIZE1];
137
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
138
// This flag is set on USART1 Receiver buffer overflow
139
bit rx_buffer_overflow1;
140
141
// USART1 Receiver interrupt service routine
142
#pragma savereg-
143
interrupt [USART1_RXC] void uart1_rx_isr(void)
144
{
145
char status,data;
146
#asm
147
    push r26
148
    push r27
149
    push r30
150
    push r31
151
    in   r26,sreg
152
    push r26
153
#endasm
154
status=UCSR1A;
155
data=UDR1;
156
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
157
   {
158
   rx_buffer1[rx_wr_index1]=data;
159
   if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
160
   if (++rx_counter1 == RX_BUFFER_SIZE1)
161
      {
162
      rx_counter1=0;
163
      rx_buffer_overflow1=1;
164
      };
165
   };
166
#asm
167
    pop  r26
168
    out  sreg,r26
169
    pop  r31
170
    pop  r30
171
    pop  r27
172
    pop  r26
173
#endasm
174
}
175
#pragma savereg+
176
177
// Get a character from the USART1 Receiver buffer
178
#pragma used+
179
char getchar1(void)
180
{
181
char data;
182
while (rx_counter1==0);
183
data=rx_buffer1[rx_rd_index1];
184
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
185
#asm("cli")
186
--rx_counter1;
187
#asm("sei")
188
return data;
189
}
190
#pragma used-
191
// USART1 Transmitter buffer
192
#define TX_BUFFER_SIZE1 8
193
char tx_buffer1[TX_BUFFER_SIZE1];
194
unsigned char tx_wr_index1,tx_rd_index1,tx_counter1;
195
196
// USART1 Transmitter interrupt service routine
197
#pragma savereg-
198
interrupt [USART1_TXC] void uart1_tx_isr(void)
199
{
200
#asm
201
    push r26
202
    push r27
203
    push r30
204
    push r31
205
    in   r26,sreg
206
    push r26
207
#endasm
208
if (tx_counter1)
209
   {
210
   --tx_counter1;
211
   UDR1=tx_buffer1[tx_rd_index1];
212
   if (++tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0;
213
   };
214
#asm
215
    pop  r26
216
    out  sreg,r26
217
    pop  r31
218
    pop  r30
219
    pop  r27
220
    pop  r26
221
#endasm
222
}
223
#pragma savereg+
224
225
// Write a character to the USART1 Transmitter buffer
226
#pragma used+
227
void putchar1(char c)
228
{
229
while (tx_counter1 == TX_BUFFER_SIZE1);
230
#asm("cli")
231
if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
232
   {
233
   tx_buffer1[tx_wr_index1]=c;
234
   if (++tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0;
235
   ++tx_counter1;
236
   }
237
else UDR1=c;
238
#asm("sei")
239
}
240
#pragma used-
241
242
// Standard Input/Output functions
243
#include <stdio.h>
244
245
// 2 Wire bus interrupt service routine
246
interrupt [TWI] void twi_isr(void)
247
{
248
// Place your code here
249
      
250
PORTC=~PORTC;
251
          
252
253
}
254
255
256
// Declare your global variables here
257
void main(void)
258
{
259
// Declare your local variables here
260
261
// Input/Output Ports initialization
262
// Port A initialization
263
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
264
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
265
PORTA=0x00;
266
DDRA=0x00;
267
268
// Port B initialization
269
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
270
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
271
272
//PORTB=0xFF;
273
//DDRB=0xFF;
274
275
PORTB=0xFF;
276
DDRB=0x00;
277
278
// Port C initialization
279
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
280
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
281
PORTC=0x00;
282
DDRC=0xFF;
283
284
// Port D initialization
285
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
286
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
287
PORTD=0x00;
288
DDRD=0x00;
289
290
// Port E initialization
291
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
292
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
293
PORTE=0x00;
294
DDRE=0x00;
295
296
// Port F initialization
297
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In 
298
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T 
299
PORTF=0x00;
300
DDRF=0x00;
301
302
// Port G initialization
303
// Func0=In Func1=In Func2=In Func3=In Func4=In 
304
// State0=T State1=T State2=T State3=T State4=T 
305
PORTG=0x00;
306
DDRG=0x00;
307
308
// Timer/Counter 0 initialization
309
// Clock source: System Clock
310
// Clock value: Timer 0 Stopped
311
// Mode: Normal top=FFh
312
// OC0 output: Disconnected
313
ASSR=0x00;
314
TCCR0=0x00;
315
TCNT0=0x00;
316
OCR0=0x00;
317
318
// Timer/Counter 1 initialization
319
// Clock source: System Clock
320
// Clock value: Timer 1 Stopped
321
// Mode: Normal top=FFFFh
322
// OC1A output: Discon.
323
// OC1B output: Discon.
324
// OC1C output: Discon.
325
// Noise Canceler: Off
326
// Input Capture on Falling Edge
327
TCCR1A=0x00;
328
TCCR1B=0x00;
329
TCNT1H=0x00;
330
TCNT1L=0x00;
331
OCR1AH=0x00;
332
OCR1AL=0x00;
333
OCR1BH=0x00;
334
OCR1BL=0x00;
335
OCR1CH=0x00;
336
OCR1CL=0x00;
337
338
// Timer/Counter 2 initialization
339
// Clock source: System Clock
340
// Clock value: Timer 2 Stopped
341
// Mode: Normal top=FFh
342
// OC2 output: Disconnected
343
TCCR2=0x00;
344
TCNT2=0x00;
345
OCR2=0x00;
346
347
// Timer/Counter 3 initialization
348
// Clock source: System Clock
349
// Clock value: Timer 3 Stopped
350
// Mode: Normal top=FFFFh
351
// OC3A output: Discon.
352
// OC3B output: Discon.
353
// OC3C output: Discon.
354
TCCR3A=0x00;
355
TCCR3B=0x00;
356
TCNT3H=0x00;
357
TCNT3L=0x00;
358
OCR3AH=0x00;
359
OCR3AL=0x00;
360
OCR3BH=0x00;
361
OCR3BL=0x00;
362
OCR3CH=0x00;
363
OCR3CL=0x00;
364
365
// External Interrupt(s) initialization
366
// INT0: Off
367
// INT1: Off
368
// INT2: Off
369
// INT3: Off
370
// INT4: Off
371
// INT5: Off
372
// INT6: Off
373
// INT7: Off
374
EICRA=0x00;
375
EICRB=0x00;
376
EIMSK=0x00;
377
378
// Timer(s)/Counter(s) Interrupt(s) initialization
379
TIMSK=0x00;
380
ETIMSK=0x00;
381
382
// USART0 initialization
383
// Communication Parameters: 8 Data, 1 Stop, No Parity
384
// USART0 Receiver: On
385
// USART0 Transmitter: On
386
// USART0 Mode: Asynchronous
387
// USART0 Baud rate: 9600
388
UCSR0A=0x00;
389
UCSR0B=0xD8;
390
UCSR0C=0x06;
391
UBRR0H=0x00;
392
UBRR0L=0x19;
393
394
// USART1 initialization
395
// Communication Parameters: 8 Data, 1 Stop, No Parity
396
// USART1 Receiver: On
397
// USART1 Transmitter: On
398
// USART1 Mode: Asynchronous
399
// USART1 Baud rate: 9600
400
UCSR1A=0x00;
401
UCSR1B=0xD8;
402
UCSR1C=0x06;
403
UBRR1H=0x00;
404
UBRR1L=0x19;
405
406
// Analog Comparator initialization
407
// Analog Comparator: Off
408
// Analog Comparator Input Capture by Timer/Counter 1: Off
409
// Analog Comparator Output: Off
410
ACSR=0x80;
411
SFIOR=0x00;
412
413
// 2 Wire Bus initialization
414
// Generate Acknowledge Pulse: On
415
// 2 Wire Bus Slave Address: 1h
416
// General Call Recognition: On
417
// Bit Rate: 230,400 kHz
418
419
TWBR=0x00;
420
TWAR=0x03;
421
TWCR=0x45;
422
//TWCR=0x44; //interrupt aus
423
424
425
426
// Global enable interrupts
427
#asm("sei")
428
             
429
delay_ms(5);
430
printf("Start:\r\n");     
431
432
433
while (1)
434
      {      
435
436
unsigned char adress=0x02;
437
unsigned char data=0;
438
      
439
      // Place your code here   
440
#define TWINT 7
441
#define TWSTA 5
442
#define TWEN  2
443
#define TWSTO 4  
444
#define TWEA  6
445
                     
446
#define START       0x08
447
#define MT_SLA_ACK  0x18
448
#define MT_DATA_ACK 0x28
449
450
              
451
     
452
printf("Master\r\n");    
453
PORTC=0x00;
454
455
printf("TWSR=%X \r\n",TWSR);
456
457
//Start Bedinnung            
458
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
459
460
//warte auf Twint flag, Start wurde gesendt
461
printf("Wait TWINT Flag Set\r\n");
462
while (!(TWCR&(1<<TWINT))) {
463
printf("TWSR=%X \r\n",TWSR);
464
delay_ms(100);
465
} 
466
467
468
469
  
470
      };
471
}