Forum: Mikrocontroller und Digitale Elektronik ATMEGA162 teilt Takt willkürlich


von Christoph (Gast)


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

von Christoph (Gast)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.