000004D3 ST X+,R1 Store indirect and postincrement
12
000004D4 DEC R25 Decrement
13
000004D5 BRNE PC-0x02 Branch if not equal
14
can_init(bitrate); // Initialize MCP2515
15
000004D6 CALL 0x000001BD Call subroutine
16
can_static_filter(filter); // Load filters and masks
17
000004D8 MOVW R24,R28 Copy register pair
18
000004D9 CALL 0x00000334 Call subroutine
19
}
20
000004DB POP R29 Pop register from stack
21
000004DC POP R28 Pop register from stack
22
000004DD RET Subroutine return
Nach 0x4DD wenn ich mit F10 ein Step Over mache springt der AVR auf
0x00:
1
--- No source file -------------------------------------------------------------
2
00000000 JMP 0x0000003A Jump
Somit gibt das eine Endlosschleife. Wie komme ich nun dem Problem auf
die Spur? In welchen Register steht die Adresse wo der "RET" hinspringen
soll?
Ich habe ein uart Init vor dem CAN Init und wenn ich da das CALL & RET
durchsteppe komme ich schön wieder mit dem RET nach dem CALL raus.
Nur beim CAN Init gibt es ein Problem was ich nicht finde.
Hugo P. schrieb:> In welchen Register steht die Adresse wo der "RET" hinspringen soll?
In keinem. Das steht auf dem Stack.
> memset(&can_buffer, 0x00, sizeof(CAN_BUFFER));
Wo ist diese Variable definiert? Vielleicht hast Du nicht mehr
ausreichend Platz im RAM, so daß der Stack in diese Variable hineinläuft
und durch Dein memset dann hübsch "genullt" wird.
Ich habe jetzt noch folgendes entdeckt.
Es gab Probleme von AVR Studio 5 zu 7 mit der Program Memory.
1
prog_uint8_tcan_filter[]={
2
// Group 0
3
MCP2515_FILTER(0x000),// Filter 0
4
MCP2515_FILTER(0x000),// Filter 1
5
6
// Group 1
7
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 2
8
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 3
9
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 4
10
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 5
11
12
MCP2515_FILTER(0x0FF),// Mask 0 (for group 0)
13
MCP2515_FILTER(0x7FF),// Mask 1 (for group 1)
14
};
Das habe ich nun so umgearbeitet:
1
staticconstuint8_tcan_filter[]PROGMEM={
2
// Group 0
3
MCP2515_FILTER(0x000),// Filter 0
4
MCP2515_FILTER(0x000),// Filter 1
5
6
// Group 1
7
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 2
8
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 3
9
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 4
10
MCP2515_FILTER(CAN_WHO_IS_ONLINE),// Filter 5
11
12
MCP2515_FILTER(0x0FF),// Mask 0 (for group 0)
13
MCP2515_FILTER(0x7FF),// Mask 1 (for group 1)
14
};
Nun ist der Pointer von can_filter im Program Memory und das Init des
CAN Busses läuft nun durch.
Aber die Watchlist zeigt mir, dass die Werte nicht drinnen sind. Wie
bekomme ich diese in die ProgMem?
Das sind noch die Macros:
Hugo P. schrieb:> Jedoch löst das nicht das Problem wie ich das mit den Macros definieren> kann!
Wieso? Da funktioniert halt das Watch-Fenster auch nicht, aber im
Speicher wird's schon gelandet sein, wie bei Deinem macrolosen Beispiel
auch.
Rufus Τ. F. schrieb:> Hugo P. schrieb:>> Jedoch löst das nicht das Problem wie ich das mit den Macros definieren>> kann!>> Wieso? Da funktioniert halt das Watch-Fenster auch nicht, aber im> Speicher wird's schon gelandet sein, wie bei Deinem macrolosen Beispiel> auch.
Ja, beim durchlesen bin gerade selber darauf gekommen. Werde es morgen
mal überprüfen!
Jim M. schrieb:> Hugo P. schrieb:>> memset(&can_buffer, 0x00, sizeof(CAN_BUFFER));>> Das ist fast sicher falsch (Pointer auf Pointer statt Pointer auf> Array). Entweder
Merkwürdig, warum man einen Buffer nullen muss. Da man in jedem Fall
wissen muss, wo im Buffer das erste und letzte Element ist, reicht es,
diese beiden Variablen entsprechen zu setzen. Der Inhalt des ungenutzten
Buffers wird einfach ignoriert.