Hallo,
ich hab folgenden Code:
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | //#include <util/delay.h>
|
5 |
|
6 | //Makros
|
7 |
|
8 | #define EINGANG 0x00
|
9 | #define AUSGANG 0xFF
|
10 |
|
11 |
|
12 | //Funktionsprototypen
|
13 |
|
14 | void ports_init(void);
|
15 | void enable(void);
|
16 |
|
17 | //Variablen
|
18 |
|
19 | int n;
|
20 |
|
21 | //Funktionen
|
22 |
|
23 | void ports_init(void)
|
24 | {
|
25 | DDRA = AUSGANG;
|
26 | DDRD = EINGANG;
|
27 | }
|
28 |
|
29 | void enable(void)
|
30 | {
|
31 | PORTA = 0b00000110;
|
32 | }
|
33 |
|
34 | int main(void)
|
35 | {
|
36 | ports_init();
|
37 | //DDRA = AUSGANG;
|
38 | //DDRD = AUSGANG;
|
39 | enable();
|
40 | PORTD = 0xFF;
|
41 |
|
42 | while(1)
|
43 | {
|
44 | }
|
45 | }
|
Und das Problem dazu: Der Prozessor springt nach Abarbeitung von
ports_init an eine Adresse, in der offenbar kein Coder gespeichert ist.
Ich arbeite mit GCC und Atmel Studio, der Fehler tritt sowohl mit als
auch ohne Debugger auf. Hardware ist ein Atmega64A mit JTAG, der über
einen ICE Mark 2 angespochen wird.
Am Ende von ports_init macht der Debuger den Disassembler auf, und da
steht der PC dann auf irgendeiner Adresse, um die herum es seitenweise
nur NOPs gibt. Das, was der vorher im Assemblercode steht, sieht so aus:
1 | 32: {
|
2 | 33: DDRA = AUSGANG;
|
3 | 0000005A SER R24 Set Register
|
4 | 0000005B OUT 0x1A,R24 Out to I/O location
|
5 | 34: DDRD = EINGANG;
|
6 | 0000005C OUT 0x11,R1 Out to I/O location
|
7 | 0000005D RET Subroutine return
|
8 | 52: {
|
9 | 53: ports_init();
|
10 | 0000005E CALL 0x0000005A Call subroutine
|
11 | 48: PORTA = 0b00000110;
|
12 | 00000060 LDI R24,0x06 Load immediate
|
13 | 00000061 OUT 0x1B,R24 Out to I/O location
|
14 | 57: PORTD = 0xFF;
|
15 | 00000062 SER R24 Set Register
|
16 | --- D:\Entwicklung\source\Brenner\Brenner\Debug/.././main.c
|
17 | 00000063 OUT 0x12,R24 Out to I/O location
|
18 | 00000064 RJMP PC-0x0000 Relative jump
|
19 | --- No source file -------------------------------------------------------------
|
20 | 00000065 CLI Global Interrupt Disable
|
21 | 00000066 RJMP PC-0x0000 Relative jump
|
Und zwar geht der falsche Sprung von 05D RET aus.
Mit dem Simulator funktioniert es, auf der Hardware nicht.
Prozessor kaputt? Comiler kaputt? Oder sitzt das Problem vor dem
Bildschirm?
Gruß,
Harald