Forum: Mikrocontroller und Digitale Elektronik BusPirate schießt I2C


von Patrik K. (pakr)


Lesenswert?

Hi,

ich bin gerade dabei mit dem BusPirat eine I2C anwendung zu entwickeln 
auf dem PIC24F128.

Irgendwie habe ich den verdacht das der BusPirate mir meinen zweiten PIC 
gekillt hat. Wie kann man den PIC davor bewaren. Oder schafft es ein 
Ossi (Oszilloskop, kein neudeutscher ;-)), den PIC zu grillen. betroffen 
ist die I2C2 schnittstelle. die tuts nicht mehr.

gruß


pakr

von Lehrmann M. (ubimbo)


Lesenswert?

Das kann ich mir beim besten Willen nicht vorstellen ! Ich sag 
ausgeschlossen.

Es liegt garantiert an der Software bzw. der Beschaltung. Darum das mal 
posten.

von Patrik K. (pakr)


Angehängte Dateien:

Lesenswert?

Lehrmann Michael schrieb:
> Das kann ich mir beim besten Willen nicht vorstellen ! Ich sag
> ausgeschlossen.
>
> Es liegt garantiert an der Software bzw. der Beschaltung. Darum das mal
> posten.

hier auszüge aus dem schaltplan.

von Patrik K. (pakr)


Lesenswert?

Lehrmann Michael schrieb:
> Das kann ich mir beim besten Willen nicht vorstellen ! Ich sag
> ausgeschlossen.
>
> Es liegt garantiert an der Software bzw. der Beschaltung. Darum das mal
> posten.

Und hier der Auszug aus dem Code. Die initialisierung der I2C erfolgt 
woanders.
1
void Server(void)
2
{
3
  
4
  unsigned char   v1,v2,v3,address,adcval;
5
  unsigned int j;
6
  
7
  WORD w, w2;
8
  BYTE i,AppBuffer[32];
9
  char    DataBytes[2] ;
10
    
11
  BYTE Error_Command[16] =  "Error Command!\r\n";
12
  BYTE Error_Command2[16] = "Error Mode\r\n"; 
13
  BYTE Info[15] = "TCP vers 0.1\r\n"; 
14
  WORD wMaxGet, wMaxPut, wCurrentChunk;
15
  static TCP_SOCKET  MySocket;
16
  static enum _TCPServerState
17
  {
18
    SM_HOME = 0,
19
    SM_LISTENING,
20
  } TCPServerState = SM_HOME;
21
22
  switch(TCPServerState)
23
  {
24
    case SM_HOME:
25
      // Allocate a socket for this server to listen and accept connections on
26
      MySocket = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER);
27
      if(MySocket == INVALID_SOCKET)
28
        return;
29
30
      TCPServerState = SM_LISTENING;
31
      break;
32
33
    case SM_LISTENING:
34
      // See if anyone is connected to us
35
      if(!TCPIsConnected(MySocket))
36
        return;
37
38
39
      // Figure out how many bytes have been received and how many we can transmit.
40
      wMaxGet = TCPIsGetReady(MySocket);  // Get TCP RX FIFO byte count
41
      wMaxPut = TCPIsPutReady(MySocket);  // Get TCP TX FIFO free space
42
43
      // Make sure we don't take more bytes out of the RX FIFO than we can put into the TX FIFO
44
      if(wMaxPut < wMaxGet)
45
        wMaxGet = wMaxPut;
46
47
      // Process all bytes that we can
48
      // This is implemented as a loop, processing up to sizeof(AppBuffer) bytes at a time.  
49
      // This limits memory usage while maximizing performance.  Single byte Gets and Puts are a lot slower than multibyte GetArrays and PutArrays.
50
      wCurrentChunk = sizeof(AppBuffer);
51
52
      
53
    
54
      for(w = 0; w < wMaxGet; w += sizeof(AppBuffer))
55
      {
56
        // Make sure the last chunk, which will likely be smaller than sizeof(AppBuffer), is treated correctly.
57
        if(w + sizeof(AppBuffer) > wMaxGet)
58
          wCurrentChunk = wMaxGet - w;
59
60
        // Transfer the data out of the TCP RX FIFO and into our local processing buffer.
61
        TCPGetArray(MySocket, AppBuffer, wCurrentChunk);
62
        
63
        for(w2 = 0; w2 < wCurrentChunk; w2++)
64
        {
65
          i = AppBuffer[w2];
66
          if(i >= 'a' && i <= 'z')
67
          {
68
            i -= ('a' - 'A');
69
            AppBuffer[w2] = i;
70
          }
71
        }
72
        
73
        if (AppBuffer[0]=='S'){
74
          //     0    1          2    3 4        5            6            7           8      9
75
          //    [S] [D]  [A|B|C|D] 0 X  [0..9|A..F] [0..9|A..F] [0..9|A..F][1|2|3|e][P] --> SDA0XFFF1P
76
          //
77
          //     0    1          2    3 4        5            6            7           8      9
78
          //    [S] [E]  [A|B|C|D] 0 X  [0..9|A..F] [0..9|A..F] [0..9|A..F][1|2|3|e][P] --> SDA0XFFF2P
79
          //  
80
81
          switch(AppBuffer[1]) {
82
            case 'D': 
83
            switch(AppBuffer[2]){
84
              case 'A':  address = 0xc0;  break;
85
              case 'B': address = 0xc2;  break;
86
              case 'C': address = 0xc4;  break;
87
              case 'D': address = 0xc6;  break;
88
            }
89
            // Convert Value from Ascii to HEX
90
            v2 =getHex(AppBuffer[6],AppBuffer[7]);
91
            v1 =getHex('0',AppBuffer[5]);
92
            
93
            if(AppBuffer[9]!='P'){
94
              v1=v1|((AppBuffer[8]-0x30)<<4);
95
            }
96
            //Start I2C2
97
            StartI2C2();
98
            IdleI2C2();
99
            
100
            while(I2C2CONbits.SEN );
101
                
102
            MasterWriteI2C2(address);
103
            IdleI2C2();
104
            while(I2C2STATbits.ACKSTAT); 
105
            for(j=0;j<100;j++);  
106
            IdleI2C2();  
107
              
108
            
109
            MasterWriteI2C2(v1);
110
            while(I2C2STATbits.ACKSTAT);  
111
            for(j=0;j<100;j++); 
112
            IdleI2C2();
113
                
114
            MasterWriteI2C2(v2);
115
            for(j=0;j<100;j++); 
116
            IdleI2C2();
117
                
118
                 
119
            StopI2C2();
120
          break;
121
           
122
            case 'A': 
123
                
124
            //ADC - MODE 
125
            if (AppBuffer[2]>=0x30 && AppBuffer[2]<=0x37){
126
              ADC_VAL.sel =  (AppBuffer[2] - 0x30);
127
            }else{
128
              break;
129
            }
130
            //Full-Scale
131
            if (AppBuffer[3]=='F'){
132
              ADC_VAL.rng = 1;
133
            }else{
134
              ADC_VAL.rng = 0;
135
            }
136
            //Bipolar Unipolar
137
            if (AppBuffer[3]=='B'||AppBuffer[4]=='B'){
138
              ADC_VAL.bip =1;
139
            }else{
140
              ADC_VAL.bip =0;
141
            }
142
            //POWER MODE, Standby, FullDown or Working
143
            if (AppBuffer[3]=='S'||AppBuffer[4]=='S'||AppBuffer[5]=='S'){
144
              ADC_VAL.pd1 =0;
145
              ADC_VAL.pd0 =1;
146
            }else if(AppBuffer[3]=='D'||AppBuffer[4]=='D'||AppBuffer[5]=='D'){
147
              ADC_VAL.pd1 =1;
148
              ADC_VAL.pd0 =1;                
149
            }else{
150
              ADC_VAL.pd1 =0;
151
              ADC_VAL.pd0 =0;                
152
            }
153
            ADC_VAL.start=1;
154
            adcval =ADC_VAL.byte;
155
            //WRITE 
156
            StartI2C2();
157
            IdleI2C2();
158
            
159
            while(I2C2CONbits.SEN );
160
            MasterWriteI2C2(0x50);
161
            IdleI2C2();
162
            
163
            while(I2C2STATbits.ACKSTAT); 
164
            for(j=0;j<100;j++);  
165
            IdleI2C2();  
166
            
167
            MasterWriteI2C2(adcval);
168
            while(I2C2STATbits.ACKSTAT);  
169
            for(j=0;j<100;j++); 
170
            IdleI2C2();
171
            StopI2C2();
172
              
173
            for(j=0;j<100;j++);
174
            IdleI2C2();
175
            StartI2C2();
176
            
177
              //READ  
178
            MasterWriteI2C2(0x51);
179
            for(j=0;j<100;j++); 
180
            while(I2C2STATbits.ACKSTAT);
181
            
182
            DataBytes[0] = MasterReadI2C2();    // Read first data byte
183
                
184
            AckI2C2();
185
            DataBytes[1] = MasterReadI2C2();    // Read secound data byte
186
187
                
188
            StopI2C2();
189
          break;
190
                
191
            case 'I':  TCPPutArray(MySocket, Info, 15);break;
192
          default:  TCPPutArray(MySocket, Error_Command2, 11);
193
          }// END SWITCH CASSE
194
        
195
        }else{
196
          AppBuffer[0]== 0x00;
197
          TCPPutArray(MySocket, Error_Command, 16);
198
        }
199
      }
200
201
202
203
      break;
204
  }
205
}



gruß

pakr

von Peter D. (peda)


Lesenswert?

Pa Kr schrieb:
> Oder schafft es ein
> Ossi (Oszilloskop, kein neudeutscher ;-)), den PIC zu grillen.

Durchaus.
Ein Oszi ist in der Regel geerdet.
Wenn dann irgendein Netzteil nicht richtig trennt oder der Schutzleiter 
unterbrochen ist, dann machts kurz mal Britzel, wenn Du das Oszi 
anklemmst.


Peter

von Patrik K. (pakr)


Lesenswert?

Peter Dannegger schrieb:
> Pa Kr schrieb:
>> Oder schafft es ein
>> Ossi (Oszilloskop, kein neudeutscher ;-)), den PIC zu grillen.
>
> Durchaus.
> Ein Oszi ist in der Regel geerdet.
> Wenn dann irgendein Netzteil nicht richtig trennt oder der Schutzleiter
> unterbrochen ist, dann machts kurz mal Britzel, wenn Du das Oszi
> anklemmst.
>
>
> Peter

sowas hatte ich schon in verdacht, aber es hängt alles am selben netz. 
ebend habe ich die schutzleiter gegeneinander durchgemessen, 0V. alles 
i.o.

das ist alles wieder seltsam. ich versuche es erstmal mit 10k pullups. 
im forum von microchip gab es ein paar andeutungen das es mit zu kleinen 
probleme geben kann.


paka

von Patrik K. (pakr)


Lesenswert?

JAP 10k und es läuft wieder deutlich flüssiger. aber in den 
spezifikationen von microhip ist angegeben 400kHz --> 1kOhm. egal es 
funzt soweit.

ABER der max 127 spielt nicht richtg mit. ansprechen und konfigurieren 
läßt er sich, aber wenn ich in auslesen will hängt er nach dem read.

nach dem ich eine pause zwischen dem write und read eingebaut hatte, 
kommt er zwar durch, also er ließt scheinbar 2 werte aus und ich bekomme 
auch daten. aber die clock leitung bleibt am ende down ?  selbst nach 
einem versuchten stop befehl?

hat da jamand eine ahnung, oder vielleicht erfahrungen mit dem max127?

gruß

paKr

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.