TWI funktioniert nur teilweise (C Code)

OP #4384176
Lesenswert?
• ▲
▼
Hallo,

ich habe einen ATMega128A als TWI Master konfiguriert.

Der Master sendet Daten zum Slave im 5 sek Takt. eine 1 5sek später eine 
0 usw.

Leider kommt nur die 0 im Slave an. Also die LEDs sind an, dann kommt 
die 0, dann gehen die LEDs aus und dann war es das. Die 1 kommt 
irgendwie nicht im Slave an.

Kann mir da jemand weiter helfen?

Master Code
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
#include "i2cmaster.h"
5

6

7
#define SLAVE_ADRESSE 0x50
8

9
uint8_t byte1 = 1;
10
uint8_t byte2 = 0;
11

12
int main(void)
13
{    
14

15
i2c_init(); 
16

17
DDRC &= ~(1<<PC0);
18

19
  while(1)                            
20
    {  
21

22
      i2c_start(SLAVE_ADRESSE+I2C_WRITE);
23
      i2c_write(0x00);  // Buffer Startadresse setzen   
24
      i2c_write(byte1); // Drei Bytes schreiben...
25
      i2c_write(byte1); // Drei Bytes schreiben...
26
      i2c_write(byte1); // Drei Bytes schreiben...
27
      i2c_write(byte1); // Drei Bytes schreiben...
28
      i2c_write(byte1); // Drei Bytes schreiben...
29
      i2c_write(byte1); // Drei Bytes schreiben...
30
      i2c_write(byte1); // Drei Bytes schreiben...
31
      i2c_write(byte1); // Drei Bytes schreiben...
32
      i2c_stop();
33
      _delay_ms(5000);
34
      i2c_start(SLAVE_ADRESSE+I2C_WRITE);
35
      i2c_write(0x00);  // Buffer Startadresse setzen   
36
      i2c_write(byte2); // Drei Bytes schreiben...
37
      i2c_write(byte2); // Drei Bytes schreiben...
38
      i2c_write(byte2); // Drei Bytes schreiben...
39
      i2c_write(byte2); // Drei Bytes schreiben...
40
      i2c_write(byte2); // Drei Bytes schreiben...
41
      i2c_write(byte2); // Drei Bytes schreiben...
42
      i2c_write(byte2); // Drei Bytes schreiben...
43
      i2c_write(byte2); // Drei Bytes schreiben...
44
      i2c_stop();
45
      _delay_ms(5000);
46
      
47
    }
48
}

ATMega8 Code
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <util/twi.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6

7
#include "twislave.h"
8

9

10
#define SLAVE_ADRESSE 0x50       //Die Slave-Adresse
11

12
........
13

14
int main(void) {
15

16
// Slave I2C Adresse setzen
17
init_twi_slave(SLAVE_ADRESSE);
18

19
for(uint8_t i = 0; i < I2C_BUFFER_SIZE; i++) { i2cdata[i] = 0; }
20

21
........
22

23
if (i2cdata[0] == 0)
24
{
25
  tuerled_an();
26
}
27
else 
28
{
29
  tuerled_aus();
30
}
OP #4384208
Lesenswert?
• ▲
▼
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <util/twi.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6

7
#include "twislave.h"
8

9

10
#define SLAVE_ADRESSE 0x50       //Die Slave-Adresse
11

12
// Variablen
13

14
//Variablen für die Zeit
15
volatile unsigned int millisekunden;
16
volatile unsigned int sekunde;
17
volatile unsigned int minute;
18
volatile unsigned int stunde;
19
volatile unsigned int alarmledinterval = 1500; // Zeit in ms
20
volatile unsigned int alarmledtime = 20; // Zeit in ms
21
volatile unsigned int alarmledtimer;
22

23
// DDRC &= ~( 1 << DDC2 ); // Eingang
24
// DDRC |= ( 1 << DDC2 ); // Ausgang
25

26

27
// ###### ADC ######
28
uint16_t readADC(uint8_t channel) {
29
  uint8_t i;
30
  uint16_t result = 0;
31
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
32
  ADMUX = channel | (0<<REFS1) | (0<<REFS0);
33
  ADCSRA |= (1<<ADSC);
34
  while(ADCSRA & (1<<ADSC));
35
  for(i=0; i<3; i++) {
36
    ADCSRA |= (1<<ADSC);
37
    while(ADCSRA & (1<<ADSC));
38
    result += ADCW;
39
  }
40
  ADCSRA &= ~(1<<ADEN);
41
  result /= 3;
42
  return result;
43
}
44

45
// ###### Heberschalter Strom ######
46

47
void heberschalterstrom_an(void) { PORTC |= (1<<PC2); }
48
void heberschalterstrom_aus(void) { PORTC &= ~(1<<PC2); }
49

50
// ###### Tür LEDs Strom ######
51

52
void tuerled_an(void) { PORTB |= (1<< PB1); }
53
void tuerled_aus(void) { PORTB &= ~(1<<PB1); }
54

55
// ###### Fensterheber Hoch/Runter ######
56

57
void motor_links_aus(void)
58
{
59
  PORTD &= ~(1<<PD0 );
60
  PORTD &= ~(1<<PD1 );
61
}
62

63
void motor_links_runter(void) { PORTD |= (1<<PD0); }
64
void motor_links_hoch(void) { PORTD |= (1<<PD1); }
65
void motor_rechts_aus(void)
66
{
67
  PORTD &= ~(1<<PD2);
68
  PORTD &= ~(1<<PD3);
69
}
70

71
void motor_rechts_runter(void) { PORTD |= (1<<PD2); }
72
void motor_rechts_hoch(void) { PORTD |= (1<<PD2); }
73

74
// ###### ######
75

76
int main(void) {
77

78
// Slave I2C Adresse setzen
79
init_twi_slave(SLAVE_ADRESSE);
80

81
for(uint8_t i = 0; i < I2C_BUFFER_SIZE; i++) { i2cdata[i] = 0; }
82

83
// Ein / Ausgänge setzen
84
DDRB |= (1<<PB1); // Tür LED AUSGANG
85

86
DDRD |= (1<<PD0); // Heber Links Runter AUSGANG
87
DDRD |= (1<<PD1); // Heber Links Hoch AUSGANG
88
DDRD |= (1<<PD2); // Heber Rechts Runter AUSGANG
89
DDRD |= (1<<PD3); // Heber Rechts Hoch AUSGANG
90

91
DDRC |= (1<<PC2); // Heber Schalter Strom AUSGANG
92

93
DDRC &= ~(1<<PC1); // Heberschalter Links Runter EINGANG
94
DDRC &= ~(1<<PC0); // Heberschalter Links Hoch EINGANG
95
DDRB &= ~(1<<PB4); // Heberschalter Rechts Runter EINGANG
96
DDRB &= ~(1<<PB5); // Heberschalter Rechts Hoch EINGANG
97

98
// I2C Data Standartwerte
99

100
  i2cdata[0] = 1; // Zündung
101
  i2cdata[4] = 1000; // Fotowiderstandswert
102

103
// Timer konfigurieren
104
    OCR1A = 125-1;
105
    TCCR1B |= (1 << WGM12);
106
    TIMSK |= (1 << OCIE1A);
107
    TCCR1B |= (1 << CS01);
108
    sei();
109

110
while(1)
111
{
112
  // Zündung prüfen
113
  
114
    if (i2cdata[0] == 0)
115
    { 
116
      // Fotowiderstand einlesen alle 15sek
117
      if (sekunde%15) { i2cdata[4] = readADC(3); }
118
      
119
      // Alarm LEDs aus
120
    
121
      // Fensterheberschalter einschalten
122
      tuerled_an();
123
      heberschalterstrom_an();
124
    }
125
    else 
126
    {
127
      tuerled_aus();
128
      heberschalterstrom_aus();
129
    }
130

131

132
}
133

134
}
135

136
ISR (TIMER1_COMPA_vect)
137
{
138
  millisekunden++;
139
  if(millisekunden == 1000)
140
  {
141
    sekunde++;
142
  i2cdata[0] = 1;
143
    millisekunden = 0;
144
    if(sekunde == 60)
145
    {
146
      minute++;
147
      sekunde = 0;
148
    }
149
    if(minute == 60)
150
    {
151
      stunde++;
152
      minute = 0;
153
    }
154
    if(stunde == 24)
155
    {
156
      stunde = 0;
157
    }
158
  }
159
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren