Forum: Mikrocontroller und Digitale Elektronik ATxmega128: Unbeschreiblicher Fehler


von Joe (Gast)


Lesenswert?

Hallo zusammen,

habe hier einen ATxmega128 der mir Rätsel aufgibt.
Hab hier eine Baugruppe die zunächst einwandfrei funktioniert.
Irgendwann nicht mehr. - Hier kann ich nicht ausschließen, dass aufgrund 
das Quick&Dirty-Versuchsaufbaus irgend eine blanke Leitung kurzfristig 
wo hinkommen ist, wo sie nicht sollte.
Beim Debuggen mit AVR viel mir auf, dass ich irgendwie immer an ein 
Stelle des Codes springe. Aber mitten drin in der Init. Zunächst dachte 
ich an einen Reset. Aber ein Breakpoint ein paar Zeilen drüber wird 
nicht angesprungen. Auch so springt beim "Schrittweise" debuggen der 
Code Plötzlich wohin, wo er nicht hin sollte.

Was ist da kaputt gegangen?

Gruß
Joe

von Peter II (Gast)


Lesenswert?

Joe schrieb:
> Was ist da kaputt gegangen?

sicher das es kein Software fehler ist, auch ein Stacküberschreiber kann 
sich so auswirken. Gehen doch mal im ASM code schritt für schritt durch, 
dan sieht man doch was genau passiert.

von Joe (Gast)


Lesenswert?

Da steht ein relativer Jump, wo er z.B. in eine falsche Codestelle 
springt:
1
00000928  RJMP PC+0x02AC    Relative jump

So sieht der ganze ASM-Code aus:
1
PK0_LED_GREEN_ON();
2
00000927  BRNE PC+0x02    Branch if not equal 
3
00000928  RJMP PC+0x02AC    Relative jump 
4
00000929  LDS R24,0x2008    Load direct from data space 
5
0000092B  TST R24    Test for Zero or Minus 
6
0000092C  BRLT PC+0x02    Branch if less than, signed 
7
0000092D  RJMP PC+0x004D    Relative jump 
8
0000092E  LDI R24,0x00    Load immediate 
9
0000092F  LDI R25,0x02    Load immediate 
10
00000930  LDI R18,0x00    Load immediate 
11
00000931  LDI R19,0x02    Load immediate

Und so das Makro in der Codestelle:
1
#define PK0_LED_GREEN_ON() \
2
  do { \
3
    PORTK_OUTSET = 0x02; \
4
    PORTK_OUTCLR = 0x01; \
5
    } while(0)

Habe ich irgendwelche falschen Einstellungen im Atmel Studio v6?
Dieses  habe ich gestern erst installiert, weil derjenige der die SW 
geschrieben hat im Urlaub ist...

von Peter II (Gast)


Lesenswert?

und an welche Adresse spring er?

von Joe (Gast)


Lesenswert?

Gibt es irgendwo in den Debug-Einstellungen ein "Program & Verify" Flag?

von Joe (Gast)


Lesenswert?

Peter II schrieb:
> und an welche Adresse spring er?

0x0bd7

von Peter II (Gast)


Lesenswert?

Joe schrieb:
> Peter II schrieb:
>> und an welche Adresse spring er?
> 0x0bd7

dann macht er ja erstmal das was er soll. Hast du den richtigen Prozesor 
ausgwählt?

von Joe (Gast)


Lesenswert?

Peter II schrieb:
> dann macht er ja erstmal das was er soll. H

Vielleicht das was im ASM steht, abe rnicht, dass was im C-Code steht!

Peter II schrieb:
> Hast du den richtigen Prozesor ausgwählt?

Ja. - ATxmega128A1
Mit dem "Device Programming Tool" sogar extra verifiziert und die Device 
Signature ausgelesen: 0x1E974C
Bei einem anderen eingestellten MCU jammert das Tool.

von Peter II (Gast)


Lesenswert?

zeige mal etwas mehr code, irgendwie passt der ASM code nicht zu dem 
Makro. Es sind dort viel zu viele sprünge enthalten.

von Joe (Gast)


Lesenswert?

Joe schrieb:
> Gibt es irgendwo in den Debug-Einstellungen ein "Program & Verify" Flag?

Mit dem "Device Programming Tool" des AtmelStudio's habe ich die 
Verifizierung durchgeführt.
Der Flashinhalt stimmt überein.

von Joe (Gast)


Lesenswert?

1
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
2
3
  // Signal, that the Board is up and running
4
  PK0_LED_GREEN_ON();
5
  
6
  while(TRUE) {
7
  
8
    // read ADC continuously into a ring-buffer (16 bytes)
9
    if(ReadADCContinuously){
10
...

Das Makro für ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT sieht so aus:
1
#define ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT() TCE0.INTCTRLB = 0x03

"TRUE" ist per #define auf 1 gesetzt.

von Joe (Gast)


Lesenswert?

Peter II schrieb:
> zeige mal etwas mehr code, irgendwie passt der ASM code nicht zu dem
> Makro. Es sind dort viel zu viele sprünge enthalten.

Der Meinung bin ich auch...

von Peter II (Gast)


Lesenswert?

sorry aber mit diesen codefetzen kann man kaum weiter helfen. Bitte mal 
einen größere auschnitt aus dem C code und dann auch den passende ASM 
code.

von Joe (Gast)


Lesenswert?

C-Code:
1
  // Initialize send/reveive buffers
2
  initializeBuffer(&Rx_Buffer);
3
  initializeBuffer(&Tx_Buffer);
4
5
  status = readPortConfiguration();
6
7
  while(status == FALSE) { // toggle LED D301, if the channel configuration is not correct
8
    PORTK.OUTTGL = 1 << PIN0;
9
    _delay_ms(1000);
10
  }
11
  
12
  // ********************************************************************
13
  // Application code starts here, after the board has been initialized.
14
  // ********************************************************************
15
  
16
  ENABLE_GLOBAL_INT();
17
  ENABLE_USARTF0_RX_INT();
18
  ENABLE_USARTF0();
19
  ENABLE_GLOBAL_HIGH_LEVEL_INT();
20
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
21
22
  // Signal, that the Board is up and running
23
  PK0_LED_GREEN_ON();
24
  
25
  while(TRUE) {
26
  
27
    // read ADC continuously into a ring-buffer (16 bytes)
28
    if(ReadADCContinuously){
29
      //P1ChA
30
      if ((Analog_In_Configuration_Mask & 0x80) == 0x80)
31
      {
32
        ADCA_CH0_SET_INPUT_PINA0();
33
        START_ADCA_CH0_SINGLE_MEASUREMENT();
34
        while(!(ADCA.CH0.INTFLAGS & 0x01));
35
        CLEAR_ADCA_CH0_INTFLAG();
36
        ADC_PINA0_RingBuffer.pBuffer[ADC_PINA0_RingBuffer.inPos] = ADCA.CH0.RESL;
37
        ADC_PINA0_RingBuffer.inPos++;
38
        ADC_PINA0_RingBuffer.inPos = ADC_PINA0_RingBuffer.inPos & 0x0F;
39
      }
40
      //P1ChB
41
      if ((Analog_In_Configuration_Mask & 0x40) == 0x40)
42
      {
43
        ADCA_CH0_SET_INPUT_PINA1();
44
        START_ADCA_CH0_SINGLE_MEASUREMENT();
45
        while(!(ADCA.CH0.INTFLAGS & 0x01));
46
        CLEAR_ADCA_CH0_INTFLAG();
47
        ADC_PINA1_RingBuffer.pBuffer[ADC_PINA1_RingBuffer.inPos] = ADCA.CH0.RESL;
48
        ADC_PINA1_RingBuffer.inPos++;
49
        ADC_PINA1_RingBuffer.inPos = ADC_PINA1_RingBuffer.inPos & 0x0F;
50
      }
51
      //P2ChA
52
      if ((Analog_In_Configuration_Mask & 0x20) == 0x20)
53
      {
54
        ADCA_CH0_SET_INPUT_PINA2();
55
        START_ADCA_CH0_SINGLE_MEASUREMENT();
56
        while(!(ADCA.CH0.INTFLAGS & 0x01));
57
        CLEAR_ADCA_CH0_INTFLAG();
58
        ADC_PINA2_RingBuffer.pBuffer[ADC_PINA2_RingBuffer.inPos] = ADCA.CH0.RESL;
59
        ADC_PINA2_RingBuffer.inPos++;
60
        ADC_PINA2_RingBuffer.inPos = ADC_PINA2_RingBuffer.inPos & 0x0F;
61
      }
62
      //P2ChB
63
      if ((Analog_In_Configuration_Mask & 0x10) == 0x10)
64
      {
65
        ADCA_CH0_SET_INPUT_PINA3();
66
        START_ADCA_CH0_SINGLE_MEASUREMENT();
67
        while(!(ADCA.CH0.INTFLAGS & 0x01));
68
        CLEAR_ADCA_CH0_INTFLAG();
69
        ADC_PINA3_RingBuffer.pBuffer[ADC_PINA3_RingBuffer.inPos] = ADCA.CH0.RESL;
70
        ADC_PINA3_RingBuffer.inPos++;
71
        ADC_PINA3_RingBuffer.inPos = ADC_PINA3_RingBuffer.inPos & 0x0F;
72
      }

Assembler:
1
  __asm__ volatile (
2
000008F9  LDI R25,0x0B    Load immediate 
3
000008FA  LDI R18,0xA0    Load immediate 
4
000008FB  LDI R19,0x0B    Load immediate 
5
000008FC  MOVW R30,R18    Copy register pair 
6
000008FD  LDD R18,Z+3    Load indirect with displacement 
7
000008FE  ORI R18,0x30    Logical OR with immediate 
8
000008FF  MOVW R30,R24    Copy register pair 
9
00000900  STD Z+3,R18    Store indirect with displacement 
10
00000901  LDI R24,0xA0    Load immediate 
11
--- X:\/src/main.c -------------------
12
  while(status == FALSE) { // toggle LED D301, if the channel configuration is not correct
13
00000902  LDI R25,0x0B    Load immediate 
14
00000903  LDI R18,0xA0    Load immediate 
15
00000904  LDI R19,0x0B    Load immediate 
16
00000905  MOVW R30,R18    Copy register pair 
17
  ENABLE_GLOBAL_INT();
18
00000906  LDD R18,Z+4    Load indirect with displacement 
19
  ENABLE_USARTF0_RX_INT();
20
00000907  ORI R18,0x18    Logical OR with immediate 
21
00000908  MOVW R30,R24    Copy register pair 
22
00000909  STD Z+4,R18    Store indirect with displacement 
23
0000090A  LDI R24,0xA0    Load immediate 
24
0000090B  LDI R25,0x00    Load immediate 
25
0000090C  LDI R18,0xA0    Load immediate 
26
0000090D  LDI R19,0x00    Load immediate 
27
0000090E  MOVW R30,R18    Copy register pair 
28
0000090F  LDD R18,Z+2    Load indirect with displacement 
29
  ENABLE_USARTF0();
30
00000910  ORI R18,0x04    Logical OR with immediate 
31
00000911  MOVW R30,R24    Copy register pair 
32
00000912  STD Z+2,R18    Store indirect with displacement 
33
00000913  LDI R24,0x00    Load immediate 
34
00000914  LDI R25,0x0A    Load immediate 
35
00000915  LDI R18,0x03    Load immediate 
36
00000916  MOVW R30,R24    Copy register pair 
37
00000917  STD Z+7,R18    Store indirect with displacement 
38
00000918  LDI R24,0x25    Load immediate 
39
  ENABLE_GLOBAL_HIGH_LEVEL_INT();
40
00000919  LDI R25,0x07    Load immediate 
41
0000091A  LDI R18,0x02    Load immediate 
42
0000091B  MOVW R30,R24    Copy register pair 
43
0000091C  STD Z+0,R18    Store indirect with displacement 
44
0000091D  LDI R24,0x26    Load immediate 
45
0000091E  LDI R25,0x07    Load immediate 
46
0000091F  LDI R18,0x01    Load immediate 
47
00000920  MOVW R30,R24    Copy register pair 
48
00000921  STD Z+0,R18    Store indirect with displacement 
49
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
50
00000922  RJMP PC+0x0002    Relative jump 
51
00000923  NOP     No operation 
52
00000924  LDS R24,0x200C    Load direct from data space 
53
00000926  TST R24    Test for Zero or Minus 
54
  PK0_LED_GREEN_ON();
55
00000927  BRNE PC+0x02    Branch if not equal 
56
00000928  RJMP PC+0x02AC    Relative jump 
57
00000929  LDS R24,0x2008    Load direct from data space 
58
0000092B  TST R24    Test for Zero or Minus 
59
0000092C  BRLT PC+0x02    Branch if less than, signed 
60
0000092D  RJMP PC+0x004D    Relative jump 
61
0000092E  LDI R24,0x00    Load immediate 
62
0000092F  LDI R25,0x02    Load immediate 
63
00000930  LDI R18,0x00    Load immediate 
64
00000931  LDI R19,0x02    Load immediate 
65
  } // end while(TRUE)
66
00000932  MOVW R30,R18    Copy register pair 
67
    if(ReadADCContinuously){
68
00000933  LDD R18,Z+33    Load indirect with displacement 
69
00000934  ANDI R18,0x03    Logical AND with immediate 
70
00000935  MOVW R30,R24    Copy register pair 
71
00000936  STD Z+33,R18    Store indirect with displacement 
72
00000937  LDI R24,0x00    Load immediate 
73
      if ((Analog_In_Configuration_Mask & 0x80) == 0x80)
74
00000938  LDI R25,0x02    Load immediate 
75
00000939  LDI R18,0x00    Load immediate 
76
0000093A  LDI R19,0x02    Load immediate 
77
0000093B  MOVW R30,R18    Copy register pair 
78
0000093C  LDD R18,Z+32    Load indirect with displacement 
79
        ADCA_CH0_SET_INPUT_PINA0();
80
0000093D  ORI R18,0x80    Logical OR with immediate 
81
0000093E  MOVW R30,R24    Copy register pair 
82
0000093F  STD Z+32,R18    Store indirect with displacement 
83
00000940  NOP     No operation 
84
--- X:\/src/main.c -------------------
85
00000941  LDI R24,0x00    Load immediate 
86
00000942  LDI R25,0x02    Load immediate 
87
00000943  MOVW R30,R24    Copy register pair 
88
00000944  LDD R24,Z+35    Load indirect with displacement 
89
00000945  MOV R24,R24    Copy register 
90
        START_ADCA_CH0_SINGLE_MEASUREMENT();
91
00000946  LDI R25,0x00    Load immediate 
92
00000947  ANDI R24,0x01    Logical AND with immediate 
93
00000948  ANDI R25,0x00    Logical AND with immediate 
94
00000949  SBIW R24,0x00    Subtract immediate from word 
95
0000094A  BREQ PC-0x09    Branch if equal 
96
0000094B  LDI R24,0x00    Load immediate 
97
0000094C  LDI R25,0x02    Load immediate 
98
0000094D  LDI R18,0x01    Load immediate 
99
0000094E  MOVW R30,R24    Copy register pair 
100
        while(!(ADCA.CH0.INTFLAGS & 0x01));
101
0000094F  STD Z+35,R18    Store indirect with displacement 
102
--- No source file -------------------------------------------------------------
103
00000950  MOVW R24,R28    Copy register pair 
104
00000951  SUBI R24,0xC0    Subtract immediate 
105
00000952  SBCI R25,0xFF    Subtract immediate with carry 
106
00000953  MOVW R30,R24    Copy register pair 
107
00000954  LDD R24,Z+0    Load indirect with displacement 
108
00000955  MOV R24,R24    Copy register 
109
00000956  LDI R25,0x00    Load immediate 
110
00000957  LDI R18,0x00    Load immediate 
111
00000958  LDI R19,0x02    Load immediate 
112
00000959  MOVW R30,R18    Copy register pair 
113
0000095A  LDD R20,Z+36    Load indirect with displacement 
114
0000095B  MOVW R18,R28    Copy register pair 
115
0000095C  SUBI R18,0xD0    Subtract immediate 
116
0000095D  SBCI R19,0xFF    Subtract immediate with carry 
117
0000095E  ADD R24,R18    Add without carry 
118
--- X:\/src/main.c -------------------
119
        ADC_PINA0_RingBuffer.pBuffer[ADC_PINA0_RingBuffer.inPos] = ADCA.CH0.RESL;
120
0000095F  ADC R25,R19    Add with carry 
121
00000960  MOVW R30,R24    Copy register pair 
122
00000961  STD Z+0,R20    Store indirect with displacement 
123
00000962  MOVW R24,R28    Copy register pair 
124
00000963  SUBI R24,0xC0    Subtract immediate 
125
00000964  SBCI R25,0xFF    Subtract immediate with carry 
126
00000965  MOVW R30,R24    Copy register pair 
127
00000966  LDD R24,Z+0    Load indirect with displacement 
128
00000967  MOV R18,R24    Copy register 
129
00000968  SUBI R18,0xFF    Subtract immediate 
130
00000969  MOVW R24,R28    Copy register pair 
131
0000096A  SUBI R24,0xC0    Subtract immediate 
132
0000096B  SBCI R25,0xFF    Subtract immediate with carry 
133
0000096C  MOVW R30,R24    Copy register pair 
134
0000096D  STD Z+0,R18    Store indirect with displacement 
135
0000096E  MOVW R24,R28    Copy register pair 
136
0000096F  SUBI R24,0xC0    Subtract immediate 
137
00000970  SBCI R25,0xFF    Subtract immediate with carry 
138
        ADC_PINA0_RingBuffer.inPos++;
139
00000971  MOVW R30,R24    Copy register pair 
140
00000972  LDD R24,Z+0    Load indirect with displacement 
141
00000973  MOV R18,R24    Copy register 
142
00000974  ANDI R18,0x0F    Logical AND with immediate 
143
00000975  MOVW R24,R28    Copy register pair 
144
00000976  SUBI R24,0xC0    Subtract immediate 
145
00000977  SBCI R25,0xFF    Subtract immediate with carry 
146
00000978  MOVW R30,R24    Copy register pair 
147
00000979  STD Z+0,R18    Store indirect with displacement 
148
0000097A  LDS R24,0x2008    Load direct from data space 
149
0000097C  MOV R24,R24    Copy register 
150
        ADC_PINA0_RingBuffer.inPos = ADC_PINA0_RingBuffer.inPos & 0x0F;
151
0000097D  LDI R25,0x00    Load immediate 
152
--- X:\/src/main.c -------------------
153
0000097E  ANDI R24,0x40    Logical AND with immediate 
154
0000097F  ANDI R25,0x00    Logical AND with immediate 
155
00000980  SBIW R24,0x00    Subtract immediate from word 
156
00000981  BRNE PC+0x02    Branch if not equal 
157
00000982  RJMP PC+0x004E    Relative jump 
158
00000983  LDI R24,0x00    Load immediate 
159
00000984  LDI R25,0x02    Load immediate 
160
00000985  LDI R18,0x00    Load immediate 
161
00000986  LDI R19,0x02    Load immediate 
162
00000987  MOVW R30,R18    Copy register pair 
163
00000988  LDD R18,Z+33    Load indirect with displacement 
164
      if ((Analog_In_Configuration_Mask & 0x40) == 0x40)
165
00000989  ANDI R18,0x03    Logical AND with immediate 
166
0000098A  ORI R18,0x08    Logical OR with immediate 
167
0000098B  MOVW R30,R24    Copy register pair 
168
0000098C  STD Z+33,R18    Store indirect with displacement 
169
0000098D  LDI R24,0x00    Load immediate 
170
0000098E  LDI R25,0x02    Load immediate 
171
0000098F  LDI R18,0x00    Load immediate 
172
00000990  LDI R19,0x02    Load immediate 
173
00000991  MOVW R30,R18    Copy register pair 
174
        ADCA_CH0_SET_INPUT_PINA1();
175
00000992  LDD R18,Z+32    Load indirect with displacement 
176
00000993  ORI R18,0x80    Logical OR with immediate 
177
00000994  MOVW R30,R24    Copy register pair 
178
00000995  STD Z+32,R18    Store indirect with displacement 
179
00000996  NOP     No operation 
180
00000997  LDI R24,0x00    Load immediate 
181
00000998  LDI R25,0x02    Load immediate 
182
00000999  MOVW R30,R24    Copy register pair 
183
0000099A  LDD R24,Z+35    Load indirect with displacement 
184
0000099B  MOV R24,R24    Copy register 
185
        START_ADCA_CH0_SINGLE_MEASUREMENT();
186
0000099C  LDI R25,0x00    Load immediate 
187
0000099D  ANDI R24,0x01    Logical AND with immediate 
188
0000099E  ANDI R25,0x00    Logical AND with immediate 
189
0000099F  SBIW R24,0x00    Subtract immediate from word 
190
000009A0  BREQ PC-0x09    Branch if equal 
191
000009A1  LDI R24,0x00    Load immediate 
192
000009A2  LDI R25,0x02    Load immediate 
193
000009A3  LDI R18,0x01    Load immediate 
194
000009A4  MOVW R30,R24    Copy register pair 
195
        while(!(ADCA.CH0.INTFLAGS & 0x01));
196
000009A5  STD Z+35,R18    Store indirect with displacement 
197
--- No source file -------------------------------------------------------------
198
000009A6  MOVW R24,R28    Copy register pair 
199
000009A7  SUBI R24,0xAF    Subtract immediate 
200
000009A8  SBCI R25,0xFF    Subtract immediate with carry 
201
000009A9  MOVW R30,R24    Copy register pair 
202
000009AA  LDD R24,Z+0    Load indirect with displacement 
203
000009AB  MOV R24,R24    Copy register 
204
--- No source file -------------------------------------------------------------
205
000009AC  LDI R25,0x00    Load immediate 
206
000009AD  LDI R18,0x00    Load immediate 
207
000009AE  LDI R19,0x02    Load immediate 
208
000009AF  MOVW R30,R18    Copy register pair 
209
--- X:/src/main.c -------------------
210
        CLEAR_ADCA_CH0_INTFLAG();
211
000009B0  LDD R20,Z+36    Load indirect with displacement 
212
000009B1  MOVW R18,R28    Copy register pair 
213
000009B2  SUBI R18,0xBF    Subtract immediate 
214
000009B3  SBCI R19,0xFF    Subtract immediate with carry 
215
000009B4  ADD R24,R18    Add without carry 
216
        ADC_PINA1_RingBuffer.pBuffer[ADC_PINA1_RingBuffer.inPos] = ADCA.CH0.RESL;
217
000009B5  ADC R25,R19    Add with carry 
218
000009B6  MOVW R30,R24    Copy register pair 
219
000009B7  STD Z+0,R20    Store indirect with displacement 
220
000009B8  MOVW R24,R28    Copy register pair 
221
000009B9  SUBI R24,0xAF    Subtract immediate 
222
000009BA  SBCI R25,0xFF    Subtract immediate with carry 
223
000009BB  MOVW R30,R24    Copy register pair 
224
000009BC  LDD R24,Z+0    Load indirect with displacement 
225
000009BD  MOV R18,R24    Copy register 
226
000009BE  SUBI R18,0xFF    Subtract immediate 
227
000009BF  MOVW R24,R28    Copy register pair 
228
000009C0  SUBI R24,0xAF    Subtract immediate 
229
000009C1  SBCI R25,0xFF    Subtract immediate with carry 
230
000009C2  MOVW R30,R24    Copy register pair 
231
000009C3  STD Z+0,R18    Store indirect with displacement 
232
000009C4  MOVW R24,R28    Copy register pair 
233
000009C5  SUBI R24,0xAF    Subtract immediate 
234
000009C6  SBCI R25,0xFF    Subtract immediate with carry 
235
        ADC_PINA1_RingBuffer.inPos++;
236
000009C7  MOVW R30,R24    Copy register pair 
237
000009C8  LDD R24,Z+0    Load indirect with displacement 
238
000009C9  MOV R18,R24    Copy register 
239
000009CA  ANDI R18,0x0F    Logical AND with immediate 
240
000009CB  MOVW R24,R28    Copy register pair 
241
000009CC  SUBI R24,0xAF    Subtract immediate 
242
000009CD  SBCI R25,0xFF    Subtract immediate with carry 
243
000009CE  MOVW R30,R24    Copy register pair 
244
000009CF  STD Z+0,R18    Store indirect with displacement 
245
000009D0  LDS R24,0x2008    Load direct from data space 
246
000009D2  MOV R24,R24    Copy register 
247
        ADC_PINA1_RingBuffer.inPos = ADC_PINA1_RingBuffer.inPos & 0x0F;
248
000009D3  LDI R25,0x00    Load immediate 
249
000009D4  ANDI R24,0x20    Logical AND with immediate 
250
000009D5  ANDI R25,0x00    Logical AND with immediate 
251
000009D6  SBIW R24,0x00    Subtract immediate from word 
252
000009D7  BRNE PC+0x02    Branch if not equal 
253
000009D8  RJMP PC+0x004E    Relative jump 
254
000009D9  LDI R24,0x00    Load immediate 
255
000009DA  LDI R25,0x02    Load immediate 
256
--- X:\src/main.c -------------------
257
000009DB  LDI R18,0x00    Load immediate 
258
000009DC  LDI R19,0x02    Load immediate 
259
000009DD  MOVW R30,R18    Copy register pair 
260
000009DE  LDD R18,Z+33    Load indirect with displacement )

Lass mich aber teilhaben und erkläre mir mal, wie du bei der Fehlersuche 
vorgehst.
ich meine schon beim Makro entsteht ja Code, der nicht sein kann. Wofür 
dann mehr davon?

von Peter II (Gast)


Lesenswert?

mit ATxMega hatte ich bis jetzt noch nicht zu tun, aber das kommt mir 
merkwürdige vor:
1
00000924  LDS R24,0x200C    Load direct from data space 
2
00000926  TST R24    Test for Zero or Minus 
3
  PK0_LED_GREEN_ON();
4
00000927  BRNE PC+0x02    Branch if not equal 
5
00000928  RJMP PC+0x02AC    Relative jump

hier wird scheinbar ein wert vom FLASH in das Register R24 geladen. 
Diese stelle konnte ich schon mal nicht im code finden, eventuell in 
einem Makro versteckt.

Wenn dieser Wert != 0 ist dann wird der "merkwürdige" spung nicht 
ausgeührt. Scheinbar steht hier aber ein Wert 0 drin, damit sprint er 
dann.

von Joe (Gast)


Lesenswert?

Die Zeilen
1
00000916  LDS R24,0x200B    Load direct from data space 
2
00000918  TST R24    Test for Zero or Minus
stehen da immer, auch wenn ich die im C-Code vorangehenden Makros 
auskommentiere aus:
1
  ENABLE_GLOBAL_INT();
2
  ENABLE_USARTF0_RX_INT();
3
  ENABLE_USARTF0();
4
  ENABLE_GLOBAL_HIGH_LEVEL_INT();
5
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
6
7
  // Signal, that the Board is up and running
8
  PK0_LED_GREEN_ON();

Wurde als
1
  ENABLE_GLOBAL_INT();
2
  ENABLE_USARTF0_RX_INT();
3
  ENABLE_USARTF0();
4
  //ENABLE_GLOBAL_HIGH_LEVEL_INT();
5
  //ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
6
7
  // Signal, that the Board is up and running
8
  PK0_LED_GREEN_ON();

von Joe (Gast)


Lesenswert?

So, jetzt habe ich aus dem Makro PK0_LED_GREEN_ON eine Funktion gemacht.
Die auskommentierten Zeilen habe ich wieder eingefügt und nun schaut 
euch mal den Assemblercode an:
1
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
2
00000933  TST R24    Test for Zero or Minus 
3
00000934  BRLT PC+0x02    Branch if less than, signed 
4
00000935  RJMP PC+0x004D    Relative jump 
5
00000936  LDI R24,0x00    Load immediate 
6
00000937  LDI R25,0x02    Load immediate 
7
  PK0_LED_GREEN_ON();
8
00000938  LDI R18,0x00    Load immediate 
9
00000939  LDI R19,0x02    Load immediate 
10
0000093A  MOVW R30,R18    Copy register pair

Keine Sprünge mehr! - So sieht es besser aus!

Das Problem scheint also im Preprozessor versteckt zu sein...
Oder sehe ich das falsch?

von Anton (Gast)


Lesenswert?

>00000924  LDS R24,0x200C    Load direct from data space
>00000926  TST R24    Test for Zero or Minus
>  PK0_LED_GREEN_ON();
>00000927  BRNE PC+0x02    Branch if not equal
>00000928  RJMP PC+0x02AC    Relative jump

Kenne die ATXMEGAS leider nicht, nur weiß ich daß
bei den ATMEGAS der LDS-Befehl die Zustandsflags
NICHT! beeinflußt, die stehen so wie sie vom letzten
z.B. "and" etc. Befehl, der die Flags beeinflußt,
zurückgelassen wurden.

LDS lädt aus dem Datenbereich. Was steht dort?

von Joe (Gast)


Lesenswert?

Anton schrieb:
> LDS lädt aus dem Datenbereich. Was steht dort?

Was für ein "Datenbereich"!?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mit dem Code kann niemand was anfangen.

Das sind doch nur Makros die keiner kennt.  Das kann alles mögliche 
sein...

von Peter II (Gast)


Lesenswert?

Joe schrieb:
> Was für ein "Datenbereich"!?

Flash - irgendetwas mit Progmem

von Joe (Gast)


Lesenswert?

Johann L. schrieb:
> Das sind doch nur Makros die keiner kennt.

Wieso, zwei Makros bei denen es schief läuft sind angegeben:
1
#define ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT() TCE0.INTCTRLB = 0x03
1
#define PK0_LED_GREEN_ON() \
2
  do { \
3
    PORTK_OUTSET = 0x02; \
4
    PORTK_OUTCLR = 0x01; \
5
    } while(0)

von Joe (Gast)


Lesenswert?

Peter II schrieb:
> Joe schrieb:
>> Was für ein "Datenbereich"!?
>
> Flash - irgendetwas mit Progmem

Achso, du willst wissen, was in Adresse 0x200C steht!?

von Anton (Gast)


Lesenswert?

>00000924  LDS R24,0x200C    Load direct from data space

Der Befehl besagt, daß der Inhalt der Adresse 0x200C
in das Register geladen wird. Ob die Adresse auch wirklich
vorhanden ist, weiß ich nicht.

Bei den ATMEGAS wird als Datenbereich alles bezeichnet
was NICHT Programmspeicher oder EEPROM ist.

von Joe (Gast)


Lesenswert?

1
00000931  LDS R24,0x2008    Load direct from data space 
2
  ENABLE_TIMER_TCE0_COMP_A_HIGH_LEVEL_INT();
3
00000933  TST R24    Test for Zero or Minus

data 0x002008  0c 03 f0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00

von MWS (Gast)


Lesenswert?

Peter II schrieb:
> Joe schrieb:
>> Was für ein "Datenbereich"!?
>
> Flash - irgendetwas mit Progmem

Unsinn, LDS kann kein Flash lesen. Um aus Progmem zu lesen, benötigt man 
LPM.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Joe schrieb:
> Johann L. schrieb:
>> Das sind doch nur Makros die keiner kennt.
>
> Wieso, zwei Makros bei denen es schief läuft sind angegeben:

Was heisst schon "bei denen es schief geht"?

Versuch erst mal, die Stelle im Quellcode zu finden, der zu dem 
Disassenbly passt, annstatt dich von Kommentaren irritieren zu lassen, 
die irgendein Tool nach dem Gießkanneprinzip über das Disassembly 
verteilt hat.

- Das Disassembly enthält bedingte Sprünge, die Makros nicht

- Das Disassembly enthält kein 0x3, das Makro aber wohl

- etc.

von Joe (Gast)


Lesenswert?

Sorry, meine begrenzten geistigen Fähigkeiten lassen es nicht zu, deine 
Antwort zu verstehen.
Ich erwarte, dass wenn ich den Dissambly-Code anschaue und der Code den 
Namen des Makros enthält, dass dann auch der Assemblercode zu diesem 
Makro gehört. Zumal der Breakpoint ebenfalls an dieser stelle sitzt...

von Peter II (Gast)


Lesenswert?

Joe schrieb:
> Ich erwarte, dass wenn ich den Dissambly-Code anschaue und der Code den
> Namen des Makros enthält, dass dann auch der Assemblercode zu diesem
> Makro gehört.

das stimmt leider nicht immer. Der Optimierer kann die Reihenfolge von 
befehlen ändern damit ist eine zuordnung von C zu ASM nicht mehr 
möglich.

schmeiss doch mal alles raus bis auf einen leere Main funktion. Dann der 
reihe nach wieder rein nehmen und schauen ab wann dieser code auftauch.

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.