ATMEGA162 teilt Takt willkürlich

Gast #990192
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren