Forum: Mikrocontroller und Digitale Elektronik ISR 08 Modul mit TWI und ISR, problem beim auslesen


von jdmm (Gast)


Lesenswert?

Hi,

ich habe ein ISR-08 ultraschall Modul, dass ich über TWI steuere.
das klappt alles soweit ganz gut.
Allerdings sendet mir der Sensor beim auslesen immer Daten bginnend mit 
Adresse 0x00, obwohl ich vorher eine Startadresse angebe.

Wäre schön wenn mir jemand helfen könnte.
ist ein ATMEGA 1284 P
programmiert wird mit AVR-Studio 5, geschrieben mit einem AVR-Dragon

Hier mal der Code

Das Senden der Startbedingung erfolgt auserhalb der ISR. die letzten 
cases stehen nur da, weil ich weitere Daten empfangen habe um an die 
Daten zu kommen die mich interessieren.

das Auslesen sollte bei Adresse 0x02 starten, fängt aber immer bei 0x00 
an.
Beim schreiben des Befehls zum Messen wird das ausgewählte Register 
beschrieben. Wenn ich einen Wert != 0x00 angebe wird keine Messung 
gestartet

Die ISR
(das man das mit einer Sprungtabelle schöner machen könnte ist mir klar,
geht erstmal darum dass es funktioniert)
1
ISR (TWI_vect)
2
{
3
  switch (TWI_Statuszahler)
4
  {
5
    //Bestätigung Startbedingung erwartet/schreiben der Adresse schreibend
6
    case 1:
7
      if (TWICheckTWSR(0x08))
8
      {
9
        TWIProblem();
10
      }
11
      else
12
      {
13
        TWISendByte(TWIAdresse_1);//Adresse schreibend
14
      }
15
      break;
16
      
17
    //prüfen ob Adresse/W übertragen und ACK empfangen/senden des Registers  
18
    case 2:
19
      if (TWICheckTWSR(0x18))
20
      {
21
        TWIProblem();
22
      }  
23
      else
24
      {
25
        TWISendByte(0x00);
26
      }
27
      break;  
28
    
29
    //Prüfen ob Daten übertragen und ACK empfangen/Sende des Startbefehls, Messung in cm
30
    case 3:
31
      if (TWICheckTWSR(0x28))
32
      {
33
        TWIProblem();
34
      }
35
      else
36
      {
37
        TWISendByte(0x51);
38
      }  
39
      break;
40
      
41
    //Senden des Stoppbefehls        
42
    case 4:
43
      TWISendStopp();
44
      US_Messunggestartet = 1;
45
      break;
46
  
47
    //Prüfen ob start gesendet /übertragen der Adresse/W um das High-Register aus zu wählen
48
    case 5:
49
      if (TWICheckTWSR(0x08))
50
      {
51
        TWIProblem();
52
      }
53
      else
54
      {
55
        TWISendByte(TWIAdresse_1);//Adresse schreibend  
56
      }
57
      break;
58
      
59
    //Prüfen ob Adresse/W gesendet und ACK empfangen / auswählen des Registers    
60
    case 6:
61
      if (TWICheckTWSR(0x18))
62
      {
63
        TWIProblem();
64
      }
65
      else
66
      {
67
        TWISendByte(0x02);
68
      }  
69
      break;
70
      
71
    //Prüfen ob Daten gesendet ACK empfangen / Neustart senden  
72
    case 7:
73
      if (TWICheckTWSR(0x28))
74
      {
75
        TWIProblem();
76
      }
77
      else  
78
      {
79
        TWISendStart();
80
      }
81
      break;
82
      
83
    //Prüfen ob Neustart übertragen / Adresse_R senden  
84
    case 8:
85
      if (TWICheckTWSR(0x10))
86
      {
87
        TWIProblem();
88
      }  
89
      else
90
      {
91
        TWISendByte((TWIAdresse_1 + 1));
92
      }
93
      break;
94
      
95
    //Prüfen ob Adresse_R übertragen / Empfang starten   
96
    case 9:
97
      if (TWICheckTWSR(0x40))
98
      {
99
        TWIProblem();
100
      }  
101
      else
102
      {
103
        US_Messung[1] = TWIReadByte();
104
        TWISendACK();
105
      }
106
      break;
107
      
108
    //Prüfen ob Daten Empfangen && ACK gesendet // Daten auslesen und ACK senden  
109
    
110
    case 10:
111
      if (TWICheckTWSR(0x50))
112
      {
113
        TWIProblem();
114
      }      
115
      else
116
      {  
117
        //US_Messung[1] = TWIReadByte();
118
        TWISendACK();
119
120
      }                
121
      break;
122
    case 11:
123
      if (TWICheckTWSR(0x50))
124
      {
125
        TWIProblem();
126
      }      
127
      else
128
      {  
129
        //US_Messung[1] = TWIReadByte();
130
        TWISendACK();
131
132
      }
133
      break;
134
      
135
    case 12:
136
      if (TWICheckTWSR(0x50))
137
      {
138
        TWIProblem();
139
      }      
140
      else
141
      {  
142
        //US_Messung[1] = TWIReadByte();
143
        TWISendNack();
144
145
      }
146
      break;  
147
    
148
    break;
149
    case 13:
150
      TWISendStopp();
151
      TWI_Statuszahler = 0;
152
      FlagUsMessungLauft = 0;
153
  }  
154
  
155
}

die Funktionen
1
void TWISendByte(uint8_t Byte)
2
{
3
  TWDR = Byte; 
4
  TWCR = (1<<TWINT) | (1<<TWEN)|(1 << TWIE);
5
  TWI_Statuszahler++;
6
}
7
8
void TWISendStopp(void)
9
{
10
  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
11
}
12
13
void TWIProblem(void)
14
{
15
  TWISendStopp();
16
  TWI_Statuszahler = 0;
17
  FlagUsMessungLauft = 0;
18
  UsZeitZahler = 0;
19
  
20
}
21
22
void TWISendStart(void)
23
{
24
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1 << TWIE);//Start auf TWI
25
  TWI_Statuszahler++;
26
}
27
28
uint8_t TWIReadByte(void)
29
{
30
  return TWDR;
31
}
32
33
uint8_t TWICheckTWSR(uint8_t BitSoll)
34
{
35
  if((TWSR & 0xF8) != BitSoll){return 1;}
36
    else {return 0;}
37
}
38
39
void TWISendACK (void)
40
{
41
  TWCR = (1 << TWINT)|(1 << TWEA)|(1 << TWEN)|(1 << TWIE);
42
  TWI_Statuszahler++;
43
}
44
45
void TWISendNack (void)
46
{
47
  TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWIE);
48
  TWI_Statuszahler++;
49
}

von jdmm (Gast)


Lesenswert?

Gemeint war das SRF08 Ultraschallmodul

Grüße

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.