Forum: Mikrocontroller und Digitale Elektronik AVR Simulator Data or unknown opcode


von Dom (Gast)


Lesenswert?

Hallo,

Habe ein Programm (geschrieben in Assembler für AT90CAN32) im AVR Studio 
4, im AVR Simulator laufen lassen. Habe dann im Laufe irgendwann mehrere 
Fehlermeldungen bekommen:
AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1
AVR Simulator: Invalid opcode 0x006e at address 0x0001eb
.
.
.


Möchte jetzt herausfinden wo er denn ein Problem hat im Programm. Dazu 
habe ich das Disassembler Fenster geöffnet.

Definiere mehrere Daten im Rom mit .db ..... siehe unten.
Ich verwende es um Strings an einem LCD auszugeben.

Service_not_active1:

    .db  "Service inaktiv",0

Im Dissasembler steht am Schluss dann folgendes:  ??? Data or unknown 
opcode. Warum macht er das, bzw. was soll ich tun damit es weggeht oder 
kann ich es ignorieren?
Weiß es nicht besser ;).

Disassembler:

@00000276: Service_not_active1
1103:         .db  "Service inaktiv",0
+00000276:   6553        ORI       R21,0x53       Logical OR with 
immediate
+00000277:   7672        ANDI      R23,0x62       Logical AND with 
immediate
1103:         .db  "Service inaktiv",0
+00000278:   6369        ORI       R22,0x39       Logical OR with 
immediate
+00000279:   2065        AND       R6,R5          Logical AND
1103:         .db  "Service inaktiv",0
+0000027A:   6E69        ORI       R22,0xE9       Logical OR with 
immediate
+0000027B:   6B61        ORI       R22,0xB1       Logical OR with 
immediate
1103:         .db  "Service inaktiv",0
+0000027C:   6974        ORI       R23,0x94       Logical OR with 
immediate
+0000027D:   0076        ???                      Data or unknown opcode


Danke für eure Hilfe.

LG


PS: Mein Programm läuft ohne Probleme, außer im Debug Mode bekomme ich 
oft nach unbestimmter Zeit IDR Event 0xFF.

von Karl H. (kbuchegg)


Lesenswert?

Dom schrieb:

> Im Dissasembler steht am Schluss dann folgendes:  ??? Data or unknown
> opcode. Warum macht er das, bzw. was soll ich tun damit es weggeht oder
> kann ich es ignorieren?

Die kannst du ignorieren, die sind nicht dein Problem.
Der Disassembler weiß ja nicht, wo du im Flash Texte angeordnet hat. Er 
versucht aus den dort abgelegten ASCII Codes irgendwas zu machen und da 
kommt dann Blödsinn raus.


> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1

richte dich nach der angegegenen Adresse. Im Disassembler Listing ist 
die Stelle interessant, die an der Adresse 0x0001E1 liegt. Dort liegt in 
erster Linie mal eines deiner Problem.

von Dom (Gast)


Lesenswert?

Karl Heinz schrieb:
>> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1

Die ganzen Invalid Opcodes sind nach den .db direktiven.

@000001DC: ladezustand
995:          .db "Ladezustand",0
+000001DC:   614C        ORI       R20,0x1C       Logical OR with 
immediate
+000001DD:   6564        ORI       R22,0x54       Logical OR with 
immediate
995:          .db "Ladezustand",0
+000001DE:   757A        ANDI      R23,0x5A       Logical AND with 
immediate
+000001DF:   7473        ANDI      R23,0x43       Logical AND with 
immediate
995:          .db "Ladezustand",0
+000001E0:   6E61        ORI       R22,0xE1       Logical OR with 
immediate
+000001E1:   0064        ???                      Data or unknown opcode

Sonst gibt es keine Invalid Opcodes im Programm.
Danke für deine Antwort!

von Karl H. (kbuchegg)


Lesenswert?

Dom schrieb:
> Karl Heinz schrieb:
>>> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1
>
> Die ganzen Invalid Opcodes sind nach den .db direktiven.

ok. jetzt musst du noch rausfinden, warum deine Programmausführung an 
diesen Punkt kommt.
Ich schätze mal, das wird ein RET sein, der irgendwie letzten Endes dort 
landet. Jetzt ist es natürlich schwierig, mit einem Breakpoint zu 
verfolgen, wie der Prozessor an diese Stelle kam.

Prphyliaktisch kann man jetzt erst mal alle PUSH/POP Pärchen durchsehen, 
ob da irgendwo einer vergessen wurde. Mit viel Glück findest du einen. 
Wenn nicht, dann wirds aufwändig.

von Dom (Gast)


Lesenswert?

Karl Heinz schrieb:
> ok. jetzt musst du noch rausfinden, warum deine Programmausführung an
> diesen Punkt kommt.
> Ich schätze mal, das wird ein RET sein, der irgendwie letzten Endes dort
> landet. Jetzt ist es natürlich schwierig, mit einem Breakpoint zu
> verfolgen, wie der Prozessor an diese Stelle kam.
>
> Prphyliaktisch kann man jetzt erst mal alle PUSH/POP Pärchen durchsehen,
> ob da irgendwo einer vergessen wurde. Mit viel Glück findest du einen.
> Wenn nicht, dann wirds aufwändig.


Du meinst weil meine Programmausführung im  Debug Mode an den Punkt IDR 
event 0xFF gelangt?

Ja das mit den ret und push/pop durchschauen müsste ich machen, was 
leider bei der Programmgröße länger dauert. Aber im normalen 
Programmablauf wenn kein JTAG im Debug modus dran hängt merke ich 
überhaupt nichts --> heißt es hängt sich nicht auf restartet sich nicht 
und dergleichen.

Die .db direktiven rufe ich im Programm auf lade es in den Z Pointer und 
gebe es dann über eine Routine an das LCD aus.

von Georg G. (df2au)


Lesenswert?

Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten 
(99%) Fällen dein Stack korrupt. Also ein Push ohne Pop oder umgekehrt, 
eine Subroutine ohne Return oder ähnliches. Dass es im "Normalbetrieb" 
nicht auffällt, kann schon sein.

Das fällt dann unter "Schlauheit des Materials" oder "Murphy". Schon 
dein gelegentlicher ungültiger Interrupt sollte dir zu denken geben.

Suchen ist angesagt. Das ist langwierig und langweilig. Aber es muss 
sein.

von Karl H. (kbuchegg)


Lesenswert?

Dom schrieb:

> Die .db direktiven rufe ich im Programm auf lade es in den Z Pointer und
> gebe es dann über eine Routine an das LCD aus.

Vergiss bitte die .db
Die sind NICHT das Problem. Die sind das Symptom.

Dein Programm macht irgendwo das Äquivalent zu
1
   rjmp Service_not_active1 + 5

Natürlich hast du das so nicht hingeschrieben, das ist schon klar. Das 
entsteht auf Umwegen, zb durch einen RET der auf eine falsche Adresse 
zurückspringt, weil du dir den Stack zerschossen hast.
Aber genau darauf läuft es hinaus.

Wenn du nicht weiter kommst, dann poste mal das komplette Programm.

: Bearbeitet durch User
von Dom (Gast)


Lesenswert?

Georg G. schrieb:
> Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten
> (99%) Fällen dein Stack korrupt.

Ich lande ja nicht im Programmlauf auf Daten. Ich verstehe jetzt nicht 
ganz warum die .db ein Symptom sein sollen. Der Code vom Disassembler 
oben ist ja nur ein Ausschnitt vom Anfang des Programmes, da ich wissen 
wollte warum Invalid Opcode steht und ob ich das beachten muss.

Karl Heinz schrieb:
> Dein Programm macht irgendwo das Äquivalent zu
>    rjmp Service_not_active1 + 5

Warum?  Woher ist das bekannt?


Ich habe euch den Afangscode vom Disassembler mitgeschickt.
Nach der Interruptstruktur speicher ich dann mit .db die Daten ins Rom.
Habe ich grad einen Denkfehler oder hab ich es euch falsch übermittelt?



1
---- AT90CAN.asm ----------------------------------------------------------------------------------
2
418:        rjmp  init
3
+00000000:   C10C        RJMP      PC+0x010D      Relative jump
4
---- No Source ------------------------------------------------------------------------------------
5
+00000001:   FFFF        ???                      Data or unknown opcode
6
---- AT90CAN.asm ----------------------------------------------------------------------------------
7
429:        jmp    int0_interrupt
8
+00000002:   940C2CEC    JMP       0x00002CEC     Jump
9
432:        jmp    int1_interrupt
10
+00000004:   940C2CED    JMP       0x00002CED     Jump
11
435:        jmp    int2_interrupt
12
+00000006:   940C2CEE    JMP       0x00002CEE     Jump
13
438:        jmp    int3_interrupt
14
+00000008:   940C2CEF    JMP       0x00002CEF     Jump
15
441:        jmp    int4_interrupt
16
+0000000A:   940C2CF0    JMP       0x00002CF0     Jump
17
444:        jmp    int5_interrupt
18
+0000000C:   940C2CF1    JMP       0x00002CF1     Jump
19
447:        jmp    int6_interrupt
20
+0000000E:   940C2CF2    JMP       0x00002CF2     Jump
21
450:        jmp    int7_interrupt
22
+00000010:   940C2CF3    JMP       0x00002CF3     Jump
23
453:        jmp    timer2_compare
24
+00000012:   940C2CF4    JMP       0x00002CF4     Jump
25
456:        jmp    timer2_overflow
26
+00000014:   940C2CF5    JMP       0x00002CF5     Jump
27
459:        jmp    timer1_capture
28
+00000016:   940C2CF6    JMP       0x00002CF6     Jump
29
462:        jmp    timer1_compareA
30
+00000018:   940C2CF7    JMP       0x00002CF7     Jump
31
465:        jmp    timer1_compareB
32
+0000001A:   940C2CF8    JMP       0x00002CF8     Jump
33
468:        jmp    timer1_compareC
34
+0000001C:   940C2CF9    JMP       0x00002CF9     Jump
35
471:        jmp timer1_overflow      ;INTERRUPT
36
+0000001E:   940C1A0B    JMP       0x00001A0B     Jump
37
474:        jmp  timer0_compare
38
+00000020:   940C2CFA    JMP       0x00002CFA     Jump
39
477:        jmp timer0_overflow
40
+00000022:   940C1B1D    JMP       0x00001B1D     Jump
41
480:        jmp CAN_TCOE  ; CAN Transfer Complete or Error
42
+00000024:   940C29E2    JMP       0x000029E2     Jump
43
483:        jmp CAN_TIMOVR  ; CAN Timer Overrun
44
+00000026:   940C2A72    JMP       0x00002A72     Jump
45
486:        jmp  SPI_STC
46
+00000028:   940C2CFB    JMP       0x00002CFB     Jump
47
489:        jmp  USART0_RX0
48
+0000002A:   940C2CFC    JMP       0x00002CFC     Jump
49
492:        jmp  USART0_UDRE
50
+0000002C:   940C2CFD    JMP       0x00002CFD     Jump
51
495:        jmp USART0_TX
52
+0000002E:   940C2CFE    JMP       0x00002CFE     Jump
53
498:        jmp  ANALOG_COMP
54
+00000030:   940C2CFF    JMP       0x00002CFF     Jump
55
501:        jmp  ADC_Interrupt
56
+00000032:   940C2D00    JMP       0x00002D00     Jump
57
504:        jmp  EE_READY_Interrupt
58
+00000034:   940C2D01    JMP       0x00002D01     Jump
59
507:        jmp  TIMER3_CAPTURE
60
+00000036:   940C2D02    JMP       0x00002D02     Jump
61
510:        jmp  TIMER3_COMPARE_A
62
+00000038:   940C2D03    JMP       0x00002D03     Jump
63
513:        jmp  TIMER3_COMPARE_B
64
+0000003A:   940C2D04    JMP       0x00002D04     Jump
65
516:        jmp  TIMER3_COMPARE_C
66
+0000003C:   940C2D05    JMP       0x00002D05     Jump
67
519:        jmp  TIMER3_OVERFLOW
68
+0000003E:   940C2D06    JMP       0x00002D06     Jump
69
522:        jmp  USART1_RX
70
+00000040:   940C2D07    JMP       0x00002D07     Jump
71
525:        jmp  USART1_UDRE
72
+00000042:   940C2D08    JMP       0x00002D08     Jump
73
528:        jmp  USART1_TX
74
+00000044:   940C2D09    JMP       0x00002D09     Jump
75
531:        jmp TWI_Interrupt
76
+00000046:   940C2D0A    JMP       0x00002D0A     Jump
77
534:        jmp  SPM_READY
78
+00000048:   940C2D0B    JMP       0x00002D0B     Jump
79
@0000004A: akkutron
80
541:          .db "Akkutron",0
81
+0000004A:   6B41        ORI       R20,0xB1       Logical OR with immediate
82
+0000004B:   756B        ANDI      R22,0x5B       Logical AND with immediate
83
541:          .db "Akkutron",0
84
+0000004C:   7274        ANDI      R23,0x24       Logical AND with immediate
85
+0000004D:   6E6F        ORI       R22,0xEF       Logical OR with immediate
86
541:          .db "Akkutron",0
87
+0000004E:   0000        NOP                      No operation
88
@0000004F: text
89
544:          .db "U:",0     ; Stringkonstante, durch eine 0
90
+0000004F:   3A55        CPI       R21,0xA5       Compare with immediate
91
+00000050:   0000        NOP                      No operation
92
@00000051: text2
93
548:          .db "I:",0
94
+00000051:   3A49        CPI       R20,0xA9       Compare with immediate
95
+00000052:   0000        NOP                      No operation
96
@00000053: rsoc
97
552:          .db "RSOC",0
98
+00000053:   5352        SUBI      R21,0x32       Subtract immediate
99
+00000054:   434F        SBCI      R20,0x3F       Subtract immediate with carry
100
552:          .db "RSOC",0
101
+00000055:   0000        NOP                      No operation
102
@00000056: ladezustand
103
556:          .db "Ladezustand",0
104
+00000056:   614C        ORI       R20,0x1C       Logical OR with immediate
105
+00000057:   6564        ORI       R22,0x54       Logical OR with immediate
106
556:          .db "Ladezustand",0
107
+00000058:   757A        ANDI      R23,0x5A       Logical AND with immediate
108
+00000059:   7473        ANDI      R23,0x43       Logical AND with immediate
109
556:          .db "Ladezustand",0
110
+0000005A:   6E61        ORI       R22,0xE1       Logical OR with immediate
111
+0000005B:   0064        ???                      Data or unknown opcode
112
@0000005C: solar
113
560:          .db  "HOME",0
114
+0000005C:   4F48        SBCI      R20,0xF8       Subtract immediate with carry
115
+0000005D:   454D        SBCI      R20,0x5D       Subtract immediate with carry
116
560:          .db  "HOME",0
117
+0000005E:   0000        NOP                      No operation
118
@0000005F: einstellung
119
564:          .db  "Einstellungen",0
120
+0000005F:   6945        ORI       R20,0x95       Logical OR with immediate
121
+00000060:   736E        ANDI      R22,0x3E       Logical AND with immediate
122
564:          .db  "Einstellungen",0
123
+00000061:   6574        ORI       R23,0x54       Logical OR with immediate
124
+00000062:   6C6C        ORI       R22,0xCC       Logical OR with immediate
125
564:          .db  "Einstellungen",0
126
+00000063:   6E75        ORI       R23,0xE5       Logical OR with immediate
127
+00000064:   6567        ORI       R22,0x57       Logical OR with immediate
128
564:          .db  "Einstellungen",0
129
+00000065:   006E        ???                      Data or unknown opcode
130
@00000066: exit
131
568:          .db  "Exit",0
132
+00000066:   7845        ANDI      R20,0x85       Logical AND with immediate
133
+00000067:   7469        ANDI      R22,0x49       Logical AND with immediate
134
568:          .db  "Exit",0
135
+00000068:   0000        NOP                      No operation
136
@00000069: blei
137
571:          .db "Pb-Akku",0
138
+00000069:   6250        ORI       R21,0x20       Logical OR with immediate
139
+0000006A:   412D        SBCI      R18,0x1D       Subtract immediate with carry
140
571:          .db "Pb-Akku",0
141
+0000006B:   6B6B        ORI       R22,0xBB       Logical OR with immediate
142
+0000006C:   0075        ???                      Data or unknown opcode
143
@0000006D: LiFePo4
144
575:          .db  "LiFePo4",0
145
+0000006D:   694C        ORI       R20,0x9C       Logical OR with immediate
146
+0000006E:   6546        ORI       R20,0x56       Logical OR with immediate
147
575:          .db  "LiFePo4",0
148
+0000006F:   6F50        ORI       R21,0xF0       Logical OR with immediate
149
+00000070:   0034        ???                      Data or unknown opcode
150
@00000071: System_Ok
151
579:          .db  "System:OK",0
152
+00000071:   7953        ANDI      R21,0x93       Logical AND with immediate
153
+00000072:   7473        ANDI      R23,0x43       Logical AND with immediate
154
579:          .db  "System:OK",0
155
+00000073:   6D65        ORI       R22,0xD5       Logical OR with immediate
156
+00000074:   4F3A        SBCI      R19,0xFA       Subtract immediate with carry
157
579:          .db  "System:OK",0
158
+00000075:   004B        ???                      Data or unknown opcode
159
@00000076: System_Fail
160
583:          .db "System:Fail",0
161
+00000076:   7953        ANDI      R21,0x93       Logical AND with immediate
162
+00000077:   7473        ANDI      R23,0x43       Logical AND with immediate
163
583:          .db "System:Fail",0
164
+00000078:   6D65        ORI       R22,0xD5       Logical OR with immediate
165
+00000079:   463A        SBCI      R19,0x6A       Subtract immediate with carry
166
583:          .db "System:Fail",0
167
+0000007A:   6961        ORI       R22,0x91       Logical OR with immediate
168
+0000007B:   006C        ???                      Data or unknown opcode
169
@0000007C: measure_data
170
587:          .db  "Messdaten",0
171
+0000007C:   654D        ORI       R20,0x5D       Logical OR with immediate
172
+0000007D:   7373        ANDI      R23,0x33       Logical AND with immediate
173
587:          .db  "Messdaten",0
174
+0000007E:   6164        ORI       R22,0x14       Logical OR with immediate
175
+0000007F:   6574        ORI       R23,0x54       Logical OR with immediate
176
587:          .db  "Messdaten",0
177
+00000080:   006E        ???                      Data or unknown opcode
178
@00000081: Status
179
591:          .db "Status",0
180
+00000081:   7453        ANDI      R21,0x43       Logical AND with immediate
181
+00000082:   7461        ANDI      R22,0x41       Logical AND with immediate
182
591:          .db "Status",0
183
+00000083:   7375        ANDI      R23,0x35       Logical AND with immediate
184
+00000084:   0000        NOP                      No operation
185
@00000085: Adjustment
186
595:          .db "Einstellungen",0
187
+00000085:   6945        ORI       R20,0x95       Logical OR with immediate
188
+00000086:   736E        ANDI      R22,0x3E       Logical AND with immediate
189
595:          .db "Einstellungen",0
190
+00000087:   6574        ORI       R23,0x54       Logical OR with immediate
191
+00000088:   6C6C        ORI       R22,0xCC       Logical OR with immediate
192
595:          .db "Einstellungen",0
193
+00000089:   6E75        ORI       R23,0xE5       Logical OR with immediate
194
+0000008A:   6567        ORI       R22,0x57       Logical OR with immediate
195
595:          .db "Einstellungen",0
196
+0000008B:   006E        ???                      Data or unknown opcode
197
@0000008C: submenudesign
198
599:          .db "Untermen",0
199
+0000008C:   6E55        ORI       R21,0xE5       Logical OR with immediate
200
+0000008D:   6574        ORI       R23,0x54       Logical OR with immediate
201
599:          .db "Untermen",0
202
+0000008E:   6D72        ORI       R23,0xD2       Logical OR with immediate
203
+0000008F:   6E65        ORI       R22,0xE5       Logical OR with immediate
204
599:          .db "Untermen",0
205
+00000090:   0000        NOP                      No operation
206
@00000091: General
207
603:          .db "Allgemein",0
208
+00000091:   6C41        ORI       R20,0xC1       Logical OR with immediate
209
+00000092:   676C        ORI       R22,0x7C       Logical OR with immediate
210
603:          .db "Allgemein",0
211
+00000093:   6D65        ORI       R22,0xD5       Logical OR with immediate
212
+00000094:   6965        ORI       R22,0x95       Logical OR with immediate
213
603:          .db "Allgemein",0
214
+00000095:   006E        ???                      Data or unknown opcode
215
@00000096: Modul_LFP1
216
607:          .db  "Modul LFP1",0
217
+00000096:   6F4D        ORI       R20,0xFD       Logical OR with immediate
218
+00000097:   7564        ANDI      R22,0x54       Logical AND with immediate
219
607:          .db  "Modul LFP1",0
220
+00000098:   206C        AND       R6,R12         Logical AND
221
+00000099:   464C        SBCI      R20,0x6C       Subtract immediate with carry
222
607:          .db  "Modul LFP1",0
223
+0000009A:   3150        CPI       R21,0x10       Compare with immediate
224
+0000009B:   0000        NOP                      No operation
225
@0000009C: Bleibattery
226
611:          .db "Bleibatterie Pb",0
227
+0000009C:   6C42        ORI       R20,0xC2       Logical OR with immediate
228
+0000009D:   6965        ORI       R22,0x95       Logical OR with immediate
229
611:          .db "Bleibatterie Pb",0
230
+0000009E:   6162        ORI       R22,0x12       Logical OR with immediate
231
+0000009F:   7474        ANDI      R23,0x44       Logical AND with immediate
232
611:          .db "Bleibatterie Pb",0
233
+000000A0:   7265        ANDI      R22,0x25       Logical AND with immediate
234
+000000A1:   6569        ORI       R22,0x59       Logical OR with immediate
235
611:          .db "Bleibatterie Pb",0
236
+000000A2:   5020        SUBI      R18,0x00       Subtract immediate
237
+000000A3:   0062        ???                      Data or unknown opcode
238
@000000A4: temperature
239
615:          .db "T:",0
240
+000000A4:   3A54        CPI       R21,0xA4       Compare with immediate
241
+000000A5:   0000        NOP                      No operation
242
@000000A6: modulrequest
243
619:          .db "Modulabfrage",0
244
+000000A6:   6F4D        ORI       R20,0xFD       Logical OR with immediate
245
+000000A7:   7564        ANDI      R22,0x54       Logical AND with immediate
246
619:          .db "Modulabfrage",0
247
+000000A8:   616C        ORI       R22,0x1C       Logical OR with immediate
248
+000000A9:   6662        ORI       R22,0x62       Logical OR with immediate
249
619:          .db "Modulabfrage",0
250
+000000AA:   6172        ORI       R23,0x12       Logical OR with immediate
251
+000000AB:   6567        ORI       R22,0x57       Logical OR with immediate
252
619:          .db "Modulabfrage",0
253
+000000AC:   0000        NOP                      No operation
254
@000000AD: modulfound
255
623:          .db  "Module gefunden",0
256
+000000AD:   6F4D        ORI       R20,0xFD       Logical OR with immediate
257
+000000AE:   7564        ANDI      R22,0x54       Logical AND with immediate
258
623:          .db  "Module gefunden",0
259
+000000AF:   656C        ORI       R22,0x5C       Logical OR with immediate
260
+000000B0:   6720        ORI       R18,0x70       Logical OR with immediate
261
623:          .db  "Module gefunden",0
262
+000000B1:   6665        ORI       R22,0x65       Logical OR with immediate
263
+000000B2:   6E75        ORI       R23,0xE5       Logical OR with immediate
264
623:          .db  "Module gefunden",0
265
+000000B3:   6564        ORI       R22,0x54       Logical OR with immediate
266
+000000B4:   006E        ???                      Data or unknown opcode
267
@000000B5: module_0
268
627:          .db "Module",0
269
+000000B5:   6F4D        ORI       R20,0xFD       Logical OR with immediate
270
+000000B6:   7564        ANDI      R22,0x54       Logical AND with immediate
271
627:          .db "Module",0
272
+000000B7:   656C        ORI       R22,0x5C       Logical OR with immediate
273
+000000B8:   0000        NOP                      No operation
274
@000000B9: Dat_Uhr
275
630:          .db "Datum",0
276
+000000B9:   6144        ORI       R20,0x14       Logical OR with immediate
277
+000000BA:   7574        ANDI      R23,0x54       Logical AND with immediate
278
630:          .db "Datum",0
279
+000000BB:   006D        ???                      Data or unknown opcode
280
@000000BC: Uhrzeit
281
633:          .db "Aktuell",0
282
+000000BC:   6B41        ORI       R20,0xB1       Logical OR with immediate
283
+000000BD:   7574        ANDI      R23,0x54       Logical AND with immediate
284
633:          .db "Aktuell",0
285
+000000BE:   6C65        ORI       R22,0xC5       Logical OR with immediate
286
+000000BF:   006C        ???                      Data or unknown opcode
287
@000000C0: Kapanzeige
288
636:          .db "C:",0
289
+000000C0:   3A43        CPI       R20,0xA3       Compare with immediate
290
+000000C1:   0000        NOP                      No operation
291
@000000C2: Kapazitaet
292
639:          .db "Kapazität:",0
293
+000000C2:   614B        ORI       R20,0x1B       Logical OR with immediate
294
+000000C3:   6170        ORI       R23,0x10       Logical OR with immediate
295
639:          .db "Kapazität:",0
296
+000000C4:   697A        ORI       R23,0x9A       Logical OR with immediate
297
+000000C5:   E474        LDI       R23,0x44       Load immediate
298
639:          .db "Kapazität:",0
299
+000000C6:   3A74        CPI       R23,0xA4       Compare with immediate
300
+000000C7:   0000        NOP                      No operation
301
@000000C8: SOC_Entladetiefe
302
643:          .db "SOC Sommer Winter",0
303
+000000C8:   4F53        SBCI      R21,0xF3       Subtract immediate with carry
304
+000000C9:   2043        AND       R4,R3          Logical AND
305
643:          .db "SOC Sommer Winter",0
306
+000000CA:   6F53        ORI       R21,0xF3       Logical OR with immediate
307
+000000CB:   6D6D        ORI       R22,0xDD       Logical OR with immediate
308
643:          .db "SOC Sommer Winter",0
309
+000000CC:   7265        ANDI      R22,0x25       Logical AND with immediate
310
+000000CD:   5720        SUBI      R18,0x70       Subtract immediate
311
643:          .db "SOC Sommer Winter",0
312
+000000CE:   6E69        ORI       R22,0xE9       Logical OR with immediate
313
+000000CF:   6574        ORI       R23,0x54       Logical OR with immediate
314
643:          .db "SOC Sommer Winter",0
315
+000000D0:   0072        ???                      Data or unknown opcode
316
@000000D1: Winter_SOC
317
647:          .db "Winter    SOC:",0
318
+000000D1:   6957        ORI       R21,0x97       Logical OR with immediate
319
+000000D2:   746E        ANDI      R22,0x4E       Logical AND with immediate
320
647:          .db "Winter    SOC:",0
321
+000000D3:   7265        ANDI      R22,0x25       Logical AND with immediate
322
+000000D4:   2020        AND       R2,R0          Logical AND
323
647:          .db "Winter    SOC:",0
324
+000000D5:   2020        AND       R2,R0          Logical AND
325
+000000D6:   4F53        SBCI      R21,0xF3       Subtract immediate with carry
326
647:          .db "Winter    SOC:",0
327
+000000D7:   3A43        CPI       R20,0xA3       Compare with immediate
328
+000000D8:   0000        NOP                      No operation
329
@000000D9: Sommer_SOC
330
651:          .db "Sommer    SOC:",0
331
+000000D9:   6F53        ORI       R21,0xF3       Logical OR with immediate
332
+000000DA:   6D6D        ORI       R22,0xDD       Logical OR with immediate
333
651:          .db "Sommer    SOC:",0
334
+000000DB:   7265        ANDI      R22,0x25       Logical AND with immediate
335
+000000DC:   2020        AND       R2,R0          Logical AND
336
651:          .db "Sommer    SOC:",0
337
+000000DD:   2020        AND       R2,R0          Logical AND
338
+000000DE:   4F53        SBCI      R21,0xF3       Subtract immediate with carry
339
651:          .db "Sommer    SOC:",0
340
+000000DF:   3A43        CPI       R20,0xA3       Compare with immediate
341
+000000E0:   0000        NOP                      No operation
342
@000000E1: Uebergang_SOC
343
655:          .db "Uebergang SOC:",0
344
+000000E1:   6555        ORI       R21,0x55       Logical OR with immediate
345
+000000E2:   6562        ORI       R22,0x52       Logical OR with immediate
346
655:          .db "Uebergang SOC:",0
347
+000000E3:   6772        ORI       R23,0x72       Logical OR with immediate
348
+000000E4:   6E61        ORI       R22,0xE1       Logical OR with immediate
349
655:          .db "Uebergang SOC:",0
350
+000000E5:   2067        AND       R6,R7          Logical AND
351
+000000E6:   4F53        SBCI      R21,0xF3       Subtract immediate with carry
352
655:          .db "Uebergang SOC:",0
353
+000000E7:   3A43        CPI       R20,0xA3       Compare with immediate
354
+000000E8:   0000        NOP                      No operation
355
@000000E9: Service_active1
356
660:          .db "Service aktiv",0
357
+000000E9:   6553        ORI       R21,0x53       Logical OR with immediate
358
+000000EA:   7672        ANDI      R23,0x62       Logical AND with immediate
359
660:          .db "Service aktiv",0
360
+000000EB:   6369        ORI       R22,0x39       Logical OR with immediate
361
+000000EC:   2065        AND       R6,R5          Logical AND
362
660:          .db "Service aktiv",0
363
+000000ED:   6B61        ORI       R22,0xB1       Logical OR with immediate
364
+000000EE:   6974        ORI       R23,0x94       Logical OR with immediate
365
660:          .db "Service aktiv",0
366
+000000EF:   0076        ???                      Data or unknown opcode
367
@000000F0: Service_not_active1
368
664:          .db  "Service inaktiv",0
369
+000000F0:   6553        ORI       R21,0x53       Logical OR with immediate
370
+000000F1:   7672        ANDI      R23,0x62       Logical AND with immediate
371
664:          .db  "Service inaktiv",0
372
+000000F2:   6369        ORI       R22,0x39       Logical OR with immediate
373
+000000F3:   2065        AND       R6,R5          Logical AND
374
664:          .db  "Service inaktiv",0
375
+000000F4:   6E69        ORI       R22,0xE9       Logical OR with immediate
376
+000000F5:   6B61        ORI       R22,0xB1       Logical OR with immediate
377
664:          .db  "Service inaktiv",0
378
+000000F6:   6974        ORI       R23,0x94       Logical OR with immediate
379
+000000F7:   0076        ???                      Data or unknown opcode
380
@000000F8: LOGS
381
668:          .db "LOGS",0
382
+000000F8:   4F4C        SBCI      R20,0xFC       Subtract immediate with carry
383
+000000F9:   5347        SUBI      R20,0x37       Subtract immediate
384
668:          .db "LOGS",0
385
+000000FA:   0000        NOP                      No operation
386
@000000FB: SOC_BSS
387
671:          .db "BSS-SOC:",0
388
+000000FB:   5342        SUBI      R20,0x32       Subtract immediate
389
+000000FC:   2D53        MOV       R21,R3         Copy register
390
671:          .db "BSS-SOC:",0
391
+000000FD:   4F53        SBCI      R21,0xF3       Subtract immediate with carry
392
+000000FE:   3A43        CPI       R20,0xA3       Compare with immediate
393
671:          .db "BSS-SOC:",0
394
+000000FF:   0000        NOP                      No operation
395
@00000100: LFP_Failure
396
674:          .db "LFP Failure",0
397
+00000100:   464C        SBCI      R20,0x6C       Subtract immediate with carry
398
+00000101:   2050        AND       R5,R0          Logical AND
399
674:          .db "LFP Failure",0
400
+00000102:   6146        ORI       R20,0x16       Logical OR with immediate
401
+00000103:   6C69        ORI       R22,0xC9       Logical OR with immediate
402
674:          .db "LFP Failure",0
403
+00000104:   7275        ANDI      R23,0x25       Logical AND with immediate
404
+00000105:   0065        ???                      Data or unknown opcode
405
@00000106: LFP_Failure_COM
406
677:          .db "LFP COM. Fail",0
407
+00000106:   464C        SBCI      R20,0x6C       Subtract immediate with carry
408
+00000107:   2050        AND       R5,R0          Logical AND
409
677:          .db "LFP COM. Fail",0
410
+00000108:   4F43        SBCI      R20,0xF3       Subtract immediate with carry
411
+00000109:   2E4D        MOV       R4,R29         Copy register
412
677:          .db "LFP COM. Fail",0
413
+0000010A:   4620        SBCI      R18,0x60       Subtract immediate with carry
414
+0000010B:   6961        ORI       R22,0x91       Logical OR with immediate
415
677:          .db "LFP COM. Fail",0
416
+0000010C:   006C        ???                      Data or unknown opcode
417
418
419
420
421
422
@0000010D: init
423
684:        ldi   temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
424
+0000010D:   E058        LDI       R21,0x08       Load immediate
425
685:        out   SPH, temp
426
+0000010E:   BF5E        OUT       0x3E,R21       Out to I/O location
427
686:        ldi   temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
428
+0000010F:   EF5F        SER       R21            Set Register
429
687:        out   SPL, temp
430
+00000110:   BF5D        OUT       0x3D,R21       Out to I/O location
431
.
432
.
433
.
434
.
435
.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Dom schrieb:
> Georg G. schrieb:
>> Wenn du im Programmlauf auf Daten als Code landest, ist in den meisten
>> (99%) Fällen dein Stack korrupt.
>
> Ich lande ja nicht im Programmlauf auf Daten.

Der Simulator sagt aber etwas anderes.

Den interessiert doch nicht, was da alles im Flash steht.
Der SImulator geht einfach her und simuliert die CPU: Befehl aus der 
Stelle im Speicher holen, dessen Adresse im Programm Counter steht. 
Programm Counter erhöhen und Befehl dekodieren.
Und im letzten Schritt ist er auf einen Befehl gestossen, den es im AVR 
nicht gibt und den er von der Adresse 0x0001e1 geladen hat um ihn 
auszuführen.

Das ist die Bedeutung von
> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1

Das es andere Stellen in deinem Flash gibt, welche keine gültigen 
Befehle kodieren, das ist dem Simulator solange völlig wurscht, solange 
er sie nicht dekodieren braucht, was im Normalfall nur dann der Fall 
ist, wenn der Simulator aufgrund des Programmablaufs genau diese Bytes 
aus dem Flash laden muss um sie als Befehl auszuführen.

> Ich verstehe jetzt nicht
> ganz warum die .db ein Symptom sein sollen.

Weil, wenn alles in deinem Programm glatt geht, der Simulator in erster 
Linie überhaupt nicht in die Verlegenheit kommt, diese Bytes als Befehl 
auffassen zu müssen. Das er es tut zeigt, dass dein Programmlauf ihn auf 
diese Stelle geführt hat.

> Der Code vom Disassembler

Der Dissassembler interessiert eigentlich nicht. Das der nicht alles 
korrekt disassemblieren kann, ist nichts neues.
Was interessiert ist, warum der Programmlauf genau an diese Bytes 
gelangt und diese Bytes als nächsten Befehl interpretieren muss.
Eben der RJMP mitten in die Text-Bytes hinein. Das ist die entscheidende 
Fragestellung, wie es dazu kommt, dass der Programm-Counter die Adresse 
dieser Bytes bekommt.


> Warum?  Woher ist das bekannt?

Ich denke, so recht hast du nicht wirklich verstanden was da los ist.

Anderes Beispiel:
1
func:
2
  LDI    R16, 0x05
3
  PUSH   R16
4
  LDI    R16, 0x01
5
  PUSH   R16
6
  RET

Was macht die Sequenz?
Sie legt nacheinander die Bytes 0x05 und 0x01 auf den Stack. Was macht 
daher der RET? Er holt sich genau diese beiden Bytes vom Stack und macht 
den Sprung zur Adresse 0x0501. Und zwar ohne dass es im ganzen Programm 
einen dezidierten RJMP zu dieser Adresse gäbe. Man kann das auch noch 
verkomplizieren. Lass einen PUSH weg (oder mach 1 POP dazu) und die 
Rücksprung Adresse des RET besteht aus einem Byte, das du selber auf den 
Stack gelegt hast und einem Byte, welches schon am Stack war. Wo dieser 
Spring hingeht, das alles ist nicht mehr wirklich vorherbestimmbar. In 
deinem Fall landest du (wie auch immer das tatsächlich passiert  bzw. 
entsteht) dann eben mitten in den Text-Byte. Bytes die nie dazu gedacht 
waren, jemals als Befehl ausgeführt zu werden. Das ist aber relativ 
wurscht, denn das Problem sind nicht die Text-Bytes an einem .DB. Das 
Problem besteht darin, dass der Sprung an die völlig falsche Stelle 
geht.

Du bellst zur Zeit den falschen Baum an indem du dich auf die Meldung 
mit dem invalid opcode versteifst. Diese Meldung ist nur das Symptom. 
Die eigentliche Frage lautet: wie kommt es dazu, dass diese Bytes 
überhaupt als Befehl ausgeführt werden wollen? Auf welch dubiosen Wegen 
ist der Programmcounter überhaupt an diese Stelle gekommen.

> Ich habe euch den Afangscode vom Disassembler mitgeschickt.

Interessiert keinen.
Poste deinen Original-Code oder lass es.
Das eigentliche Problem zu finden ist schon schwer genug. Da brauchen 
wir nicht auch noch Prügel zwischen die Beine in Form von Dissassembler 
Output, der logischerweise nicht vollständig korrekt sein kann, weil der 
Disassembler nun mal keine Ahnung davon hat, welche Bytes jetzt 
eigentlich wirklich Code sind und welche Daten. Entscheidend ist, dass 
der Simulator zur Laufzeit in die Verlegenheit kommt, diese Bytes als 
Befehl auffasen zu müssen, weil er den Befehl abarbeiten soll. Die 
spannende Frage lautet: warum ist das so? Die Antwort darauf findest du 
aber nicht im Disassembler.

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Hi,
Versuche es doch bitte mal mit den Direktiven .dseg und .cseg um 
zwischen Daten und Code zu unterscheiden.

viel Erfolg,Uwe

von Karl H. (kbuchegg)


Lesenswert?

Uwe schrieb:
> Hi,
> Versuche es doch bitte mal mit den Direktiven .dseg und .cseg um
> zwischen Daten und Code zu unterscheiden.

Ist auch kein Allheilmittel, weil die Zugriffe anders sind.
Er hat offenbar fixe Texte im Flash, die dann mit entsprechenden 
Ausgabefunktionen ausgegeben werden. Das alles ist schon in Ordnung.

Aber er hat noch ein Problem im Code, das erst mal gefunden werden will. 
Und dieses Problem hat ganz sicher nichts mit den Texten an sich zu tun. 
Hilft nichts. Da muss man Codestudium betreiben und rausfinden, auf 
welchem Weg er sich (möglicherweise) seinen Stack zerschiesst. Meistens 
ist es ein Stack-Problem, wenn man so ein Symptom hat.

@Dom
Kennst du den Hallervorden Sketch von der 'Kuh Elsa'?
Genau in der Situation bist du. Der Simulator sagt dir, dass die Kuh 
Elsa gestorben ist. Das eigentliche Problem ist aber, dass die Frau des 
Grafen verstorben ist. Du versuchst gerade panisch heraus zu finden, ob 
die Kuh Elsa krank war, weil sie doch gestorben ist.
http://de.wikipedia.org/wiki/Die_Kuh_Elsa
http://www.didipage.de/service/sketche/diekuhelsa/index.html

: Bearbeitet durch User
von Dom (Gast)


Lesenswert?

Karl Heinz schrieb:
> Und im letzten Schritt ist er auf einen Befehl gestossen, den es im AVR
> nicht gibt und den er von der Adresse 0x0001e1 geladen hat um ihn
> auszuführen.

Das heißt aber nur dass er einen falschen Befehl bzw. einen Befehl den 
es nicht gibt ausführt der an der Adresse 0x0001e1 steht, macht aber 
dann normal im Programm weiter wo er den Befehl geladen hat?
Das heißt dass er zb. statt einem normalen ret was er machen und aus der 
Routine zurück springen sollte, den Sprung auf die Adresse 0x0001e1 
macht und dort versucht das als Befehl abzuwicklen was aber eben ein 
INVALID OPCODE IST.

Und wo macht das Programm dann weiter nachdem er den Befehl 0x0001e1 
geladen hat? Unter dem Befehl ret, den es normal hätte ausführen sollen?


Stimmt das so?

von Uwe (Gast)


Lesenswert?

Hi,
>+000001DC:   614C        ORI       R20,0x1C       Logical OR with
>immediate
>+000001DD:   6564        ORI       R22,0x54       Logical OR with
>immediate
>995:          .db "Ladezustand",0
>+000001DE:   757A        ANDI      R23,0x5A       Logical AND with
>immediate
>+000001DF:   7473        ANDI      R23,0x43       Logical AND with
>immediate
>995:          .db "Ladezustand",0
>+000001E0:   6E61        ORI       R22,0xE1       Logical OR with
>immediate
>+000001E1:   0064        ???                      Data or unknown opcode

Wenn ich mal übersetzen darf:
L=$4C
a=$61
d=$64
e=$65
z=$7A
u=$75
s=$73
t=$74
a=$61
n=$6E
d=$64
0=$00
Der Disassembler weiss nur leider nichts von Text(.dseg) und versucht 
den Text als Code zu deuten, Das muss schiefgehen.
Die Frage ist eigentlich:
>Habe dann im Laufe irgendwann mehrere
>Fehlermeldungen bekommen:
>AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1
Wann, bei welcher Gelegenheit ist denn der Fehler aufgetreten?
Beim Assemblieren? Da hilft .dseg Beim Stepbetrieb? Dann hast du einen 
Programmfehler oder nicht alle Daten(zb.EEProm)geladen.

Viel Erfolg, Uwe

von Svenska (Gast)


Lesenswert?

> Und wo macht das Programm dann weiter nachdem er den Befehl 0x0001e1
> geladen hat? Unter dem Befehl ret, den es normal hätte ausführen sollen?

Nein. Was danach passiert, hängt von diesem falschen Befehl ab...

von Dom (Gast)


Lesenswert?

Svenska schrieb:
> Nein. Was danach passiert, hängt von diesem falschen Befehl ab...


Das ist klar nur, wenn er den Befehl nicht versteht, also Invalid opcode 
schreibt, was macht er dann.

von Karl H. (kbuchegg)


Lesenswert?

Dom schrieb:
> Svenska schrieb:
>> Nein. Was danach passiert, hängt von diesem falschen Befehl ab...
>
>
> Das ist klar nur, wenn er den Befehl nicht versteht, also Invalid opcode
> schreibt, was macht er dann.

Das wissen nur die Entwickler bei Atmel, was die CPU dann macht.
Da kann alles mögliche passieren, je nachdem was die Befehlsdekodierung 
im Chip tatsächlich mit dieser Bitkombination anstellt.

Aber: DIe Frage ist irrelevant. Das ist kein definierter offizieller 
Befehl. Du darfst es nie dazu kommen lassen, dass die CPU diesen 
'Befehl' (der keiner ist) ausführt. Egal wie oft du noch mit dem Fuss 
aufstampfst und 'Ich will aber nicht den Fehler suchen' rufst.

Wenn du dich mit solchen Problemen nicht rumschlagen willst, dann 
programmier in einer Hochsprache oder leg dir mehr Sorgfalt in der 
Assemblerprogrammierung zu. Jetzt aber hast du ein Problem in deinem 
Code, das behoben werden muss. Da führt kein Weg drann vorbei.

> wenn er den Befehl nicht versteht, also Invalid opcode schreibt,
> was macht er dann.
Das ist ein Service des Simulators, dass er dieses mitteilt. Was die 
echte CPU damit macht .... irgendwo in der Instruction Set Doku könnte 
darüber etwas stehen. Ich würde davon ausgehen, dass es undefiniert ist, 
was dann tatsächlich passiert. Es spielt auch keine wirkliche Rolle.


Du versuchst gerade (bildlich gesprochen) eine Division durch 0 zu 
legitimieren, indem du dich davor drückst rauszufinden, wie es dazu 
kommen konnte, dass der Divisor 0 ist. Wie können stundenlang darüber 
diskutieren, ob das Ergebnis der Division 5 oder 12 sein sollte. Fakt 
ist, dass du nicht durch 0 dividieren darfst und daher rückverfolgen 
musst, wie es zu dieser 0 gekommen ist.

: Bearbeitet durch User
von Dom (Gast)


Lesenswert?

Karl Heinz schrieb:
> Aber: DIe Frage ist irrelevant. Das ist kein definierter offizieller
> Befehl. Du darfst es nie dazu kommen lassen, dass die CPU diesen
> 'Befehl' (der keiner ist) ausführt. Egal wie oft du noch mit dem Fuss
> aufstampfst und 'Ich will aber nicht den Fehler suchen' rufst.
>
> Wenn du dich mit solchen Problemen nicht rumschlagen willst, dann
> programmier in einer Hochsprache oder leg dir mehr Sorgfalt in der
> Assemblerprogrammierung zu. Jetzt aber hast du ein Problem in deinem
> Code, das behoben werden muss. Da führt kein Weg drann vorbei.


Ja es ist klar dass ich es nie dazu kommen lassen darf. Es war jetzt nur 
zum Verständnis. Ich hoffe ich finden den Übeltäter.

Danke für eure Antworten vor allem an kbuchegg!

von Oliver S. (oliverso)


Lesenswert?

> AVR Simulator: Invalid opcode 0x0064 at address 0x0001e1

Für genau solche (und ein paar andere) Problemchen wurden doch nun 
Debugger erfunden.
Setzt halt eine Breakpoint auf die fragliche Adresse, schau dir den call 
stack an, schau dir an, was da noch so auf dem Stack steht, und arbeite 
dich dann rückwärts zum Problem durch.

So schwierig ist das doch nun wirklich nicht.

Falls das 4er Studio keine breakpoints auf beliebige Adressen setzen 
kann (ich hab damit lange nichts mehr gemacht), nimm halt das aktuelle 
6.1

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver S. schrieb:

> Setzt halt eine Breakpoint auf die fragliche Adresse, schau dir den call
> stack an, schau dir an, was da noch so auf dem Stack steht, und arbeite
> dich dann rückwärts zum Problem durch.

Für solche Fälle hätte ich mir schon oft gewünscht, dass die Simulatoren 
einen Trace der letzten 50 (oder so) ausgeführten Befehle samt ihren 
Adressen hätten, so dass man wenigstens rückverfolgen kann, wie und von 
wo man zur fraglichen Stelle gekommen ist.

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.