Hallo,
ich habe nach der Umstellung vom Mega324P, mit dem alles lief, auf einen
Mega64 das Problem dass er anscheinend nach einem rcall nicht richtig
zurück springt. In der Simulation in AVR Studio funktioniert es zwar,
aber auf dem Controller scheint er nicht zurück zu srpingen sondern
weiter zu laufen. Nach ca 250µs (etwa 4000 cycles bei 16 MHz) kommt dann
wieder mein Reset-Debug-Flag.
Hier mal der Code den ich zum testen und der Übersichtlichkeit halber in
eine eigenes Programm gepackt hab. Wenn ich rcall/ret durch rjmp (die
auskommentierten) ersetzte funktioniert es ohne Porbleme. Im komplexeren
Orginalprogramm kann ich das aber so nicht lösen.
1
.include "m64def.inc"
2
3
.def temp = r16
4
.def data = r17
5
6
reset:
7
sbi porte, 7 ; Reset-Debug-Flag
8
cbi porte, 7
9
sbi porte, 7
10
cbi porte, 7
11
12
ldi temp, LOW(RAMEND) ; Init stack pointer
13
out SPL, temp
14
ldi temp, HIGH(RAMEND)
15
out SPH, temp
16
; USB status flags
17
cbi DDRB, 6 ; PORTB 6 = RXF = input
18
sbi PORTB, 6 ; pull-up active
19
cbi DDRB, 7 ; PORTB 7 = TXE = input
20
sbi PORTB, 7 ; pull-up active
21
22
; USB control pins
23
sbi DDRB, 4 ; PORTB 4 = RD = output
24
sbi PORTB, 4 ; set it high
25
sbi DDRB, 5 ; PORTB 5 = WR = output
26
cbi PORTB, 5 ; set it low
27
28
29
main:
30
rcall read_byte_usb
31
; rjmp read_byte_usb
32
33
write_byte_usb:
34
ldi temp, 0xFF
35
out DDRE, temp ; PORTD is output
36
37
out PORTE, data
38
cbi PORTB, 5
39
sbi PORTB, 5
40
41
rjmp main
42
43
read_byte_usb:
44
ldi temp, 0x00
45
out DDRE, temp ; PORTE is input
46
ldi temp, 0xFF
47
out PORTE, temp ; pull-ups active
48
49
wait_for_RXF:
50
sbis PINB, 6 ; exit wait loop if RXF (read ready) is low
51
rjmp read_byte
52
rjmp wait_for_RXF
53
54
read_byte:
55
cbi PORTB, 4 ; pull RD low to read from usb chip
56
nop ; !!! KEEP THIS FOR TIMING !!!
57
in data, PINE ; read
58
sbi PORTB, 4 ; set RD to high again
59
ret
60
; rjmp write_byte_usb
Schonmal vielen Danke für etwaige Tips
grüße
christian
Hat sich erledigt.
Bei ATmega64 und ATmega128 muß unbedingt das MC103C-Fusebit (CompMode im
AVRStudio) gelöscht werden. Bei mir war es bei frisch ausgeliefertem µC
gesetzt.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.