Forum: Mikrocontroller und Digitale Elektronik TWI funktioniert nur teilweise (C Code)


von Rene H. (ballibou77)


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
}

von OldMan (Gast)


Lesenswert?

Rene H. schrieb:
> ........

Was steht da?
Wenn schon, dann bitte den kompletten Code.

von Rene H. (ballibou77)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Und wenn man jetzt noch die TWI Funktionen sehen könnte, dann wär das 
ganz lieb.

von Rene H. (ballibou77)


Angehängte Dateien:

Lesenswert?

Ok, ich hänge dann mal die Dateien sind. Sind aber die von Peter Flur...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.