von
Christoph (Gast)
18.09.2008 11:01
Hallo.
Ich habe einen Mega162 mit einem 7,37MHz Baudratenquarz am rennen. Dabei
ist mir aufgefallen, dass sporadisch 2-6s nach Power-On die
Befehlsfrequenz plötzlich um den Faktor 8 geteilt wird. Die
Pinwackel-Testroutine erzeugt also plötzlich eine 8x kleinere Frequenz.
Das passiert allerdings nicht, wenn ich die Interrupts abschalte.
In dem "langsamen" Zustand habe ich das CLKPR-Register überprüft, aber
es ist auf keine Taktteilung eingestellt. Teile ich den Takt mittels
CLKPR, teilt dies die Systemfrequenz ordnungsgemäß, die sporadische
/8-Teilung bleibt.
seltsamerweise sendet der USART0 mit 115,2kBaud mit konstanter
Geschwindigkeit - ungeachtet dem kleineren Befehlsdurchsatz.
1 .include "m162def.inc"
2
3 .equ LED_O = PORTE
4 .equ LED1 = 0
5 .equ LED2 = 2
6
7 ; PORTD
8 .equ WR485_1 = 4
9
10 .def ZERO = r2
11 .def ONE = r3
12 .def SREGSAVE = r4
13 .def TEMP1 = r16
14 .def TEMP2 = r17
15 .def LOOP1 = r20
16
17 ;************************************************
18 ; CODE
19
20 .cseg
21
22 .org 0x0000
23 rjmp RESET
24 .org INT0addr
25 rjmp INT_ERRORLINE
26 .org INT1addr
27 rjmp INT_POWERFAIL
28 .org OVF1addr
29 rjmp TIMER1
30 .org URXC0addr
31 rjmp INT_NEUER_WINKEL
32 .org URXC1addr
33 rjmp INT_GET_BYTE
34 .org UTXC1addr
35 rjmp INT_SEND_BYTE
36 TIMER1:
37 in SREGSAVE,SREG
38
39 push TEMP1
40
41 sbic PORTE,2
42 rjmp T1
43 sbi PORTE,2
44 rjmp T2
45 T1:
46 cbi PORTE,2
47 T2:
48
49 ldi TEMP1,0xF1
50 out TCNT1H,TEMP1
51 dec TEMP1
52 out TCNT1L,TEMP1
53
54 inc r25
55 andi r25,0x0f
56 cpi r25,15
57 brlo T3
58 ldi r24,0x80
59 rjmp T4
60 T3: ldi r24,0x40
61 T4: ori r24,0x3F
62 out PORTC,r24
63
64 pop TEMP1
65
66 out SREG,SREGSAVE
67 reti
68
69 ;************************************************
70 ; Reset
71 TABLE_INIT:
72 ; Init Registers
73 .db 0x20+PORTA, 0b11111111 ;= Relay Low-Aktiv
74 .db 0x20+DDRA, 0b00000000
75 .db 0x20+PORTB, 0b11110101 ;= Pull-Up
76 .db 0x20+DDRB, 0b00001010
77 .db 0x20+PORTC, 0b11111111 ;= Pull-Up
78 .db 0x20+DDRC, 0b11000000
79 .db 0x20+PORTD, 0b11001011 ;= ERR_OUT High-Aktiv , ERR_IN Floating
80 .db 0x20+DDRD, 0b00110000
81 .db 0x20+PORTE, 0b00000000
82 .db 0x20+DDRE, 0b00000101
83 ; Init Periphereals
84 ; Winkel - UART
85 ; UART0 : 115,2 kBaud, Even Parity, 1 Start, 1 Stop, 9 bit, RX-INT
86 .db 0x20+UBRR0H, 0
87 .db 0x20+UBRR0L, 3
88 .db 0x20+UCSR0A, 0
89 .db 0x20+UCSR0B, (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)
90 .db 0x20+UCSR0C, (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<URSEL)
91 ; Kommunikation - UART
92 ; UART1 : 115,2 kBaud, Even Parity, 1 Start, 1 Stop, 9 bit, RX und TX-INT
93 .db 0x20+UBRR1H, 0
94 .db 0x20+UBRR1L, 3
95 .db 0x20+UCSR1A, (1<<MPCM1)
96 .db 0x20+UCSR1B, (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)
97 .db 0x20+UCSR1C, (1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<URSEL)
98 ; Analog-Comparator abschalten
99 .db 0x20+ACSR, (1<<ACIC)
100 .db 0x20+TCNT1H, 0xF1
101 .db 0x20+TCNT1L, 0xF0
102 .db 0x20+TCCR1B, (1<<CS12)|(1<<CS10)
103 .db 0x20+TCCR0, (1<<CS02)|(1<<CS00)
104 .db 0x20+TIMSK, (1<<TOIE1)
105
106 ; Interrupt 0 und 1 fallende Flanke
107 ; External Memory Interface, keine Addressbits
108 .db 0x20+MCUCR, (1<<SRE)|(1<<ISC11)|(1<<ISC01)
109 .db 0x20+SFIOR, (1<<XMM0)|(1<<XMM1)|(1<<XMM2)
110 .db 0x20+GICR, (1<<INTF1)|(1<<INTF0)
111
112 ; Init System
113 .db 0x20+SPH, HIGH(RAMEND)
114 .db 0x20+SPL, LOW(RAMEND) ; Stack Pointer
115
116 ; End of Table
117 .db 0,0
118 RESET:
119 clr ZERO
120 clr ONE
121 inc ONE
122 ldi ZL,LOW(TABLE_INIT*2)
123 ldi ZH,HIGH(TABLE_INIT*2)
124 clr YH
125 RESET_PERIPHERY:
126 lpm YL,Z+
127 cpi YL,0
128 breq RESET_PERIPHERY_DONE
129 lpm TEMP1,Z+
130 st Y,TEMP1 ; Register schreiben
131 rjmp RESET_PERIPHERY
132 RESET_PERIPHERY_DONE:
133
134 ; sei
135 rjmp MAIN
136
137 ;************************************************
138 ; INTERRUPT : Errorleitung unterbrochen
139 INT_ERRORLINE:
140
141 reti
142
143 ;************************************************
144 ; INTERRUPT : Stromzufuhr unterbrochen
145 INT_POWERFAIL:
146 cbi PORTE,2
147 sbi PORTE,0
148 sbi PORTC,6
149 sbi PORTC,7
150 reti
151
152 ;************************************************
153 ; INTERRUPT : Neuer Winkel (UART0)
154 INT_NEUER_WINKEL:
155 reti
156
157 ;************************************************
158 ; INTERRPUT : Rec. Byte (UART1)
159 INT_GET_BYTE:
160 reti
161
162 ;************************************************
163 ; INTERRUPT : Send Byte (UART1)
164 INT_SEND_BYTE:
165 reti
166
167
168 MAIN:
169 sbi PORTD,WR485_1
170 nop
171 nop
172 nop
173 nop
174 nop
175 nop
176 cbi PORTD,WR485_1
177 nop
178 nop
179 nop
180 nop
181 rjmp MAIN
von
Christoph (Gast)
18.09.2008 11:04
die Fuses sind wie folgt:
Brown-out bei 2,7V
JTAG disabled
SPI enabled
OCD Disabled
Preserve EEPROM enabled
CLKDIV8 disabled
Ext. Quarz 3-8MHz, startup 1K CK + 4.1ms
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.