Hallo, ich versuche von Arduino wegzukommen und von Grund aus die Programme selber zu programmieren. Jetzt möchte ich gerne zwischen zwei ATmega via I2C kommunizieren. Auf dem Slave läuft dazu noch das Arduino Programm welches via I2C empfangene Daten auf dem Serialport ausgibt. Auf dem Master habe ich das Programm laufen welches ich aus dem Datenblatt vom Atmega erlesen habe. Nur leider gibt das Programm sofort beim ersten Statuscheck eine Fehlerroutine aus (blinkende LED). könntet ihr bitte das Programm prüfen und mir sagen wo der Fehler liegt? Danke!
1 | #define START 0x08
|
2 | #define Slave 1
|
3 | #define MT_SLA_ACK 0x18
|
4 | #define MT_DATA_ACK 0x28
|
5 | #define F_CPU 16000000
|
6 | |
7 | #include <avr/io.h> |
8 | #include <util/delay.h> |
9 | |
10 | uint8_t Zahl = 0; |
11 | |
12 | void Error(void) |
13 | {
|
14 | while (1) |
15 | {
|
16 | PORTB &= ~(1<<PB5); |
17 | _delay_ms(100); |
18 | PORTB |= (1<<PB5); |
19 | _delay_ms(100); |
20 | }
|
21 | }
|
22 | |
23 | void TWIStart(void) |
24 | {
|
25 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); |
26 | while (!(TWCR & (1<<TWINT))); |
27 | }
|
28 | |
29 | void TWIStop(void) |
30 | {
|
31 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); |
32 | }
|
33 | |
34 | int main(void) |
35 | {
|
36 | DDRB |= (1<<DDB5); |
37 | PORTB &= ~(1<<PB5); |
38 | _delay_ms(1000); |
39 | |
40 | while(1) |
41 | {
|
42 | PORTB |= (1<<PB5); |
43 | TWIStart(); |
44 | if ((TWSR & 0xF8) != START) Error(); |
45 | TWDR = (Slave<<1); |
46 | TWCR = (1<<TWINT) | (1<<TWEN); |
47 | while (!(TWCR & (1<<TWINT))); |
48 | if ((TWSR & 0xF8) != MT_SLA_ACK) Error(); |
49 | TWDR = Zahl; |
50 | TWCR = (1<<TWINT) | (1<<TWEN); |
51 | while (!(TWCR & (1<<TWINT))); |
52 | if ((TWSR & 0xF8) != MT_DATA_ACK) Error(); |
53 | TWIStop(); |
54 | Zahl++; |
55 | _delay_ms(1000); |
56 | PORTB &= ~(1<<PB5); |
57 | _delay_ms(1000); |
58 | }
|
59 | }
|