Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt muss nach sleep 2 mal initialisiert werden


von X- R. (x-rocka)


Lesenswert?

Moin,

nach dem mein ATmega128RFA1 im Tiefschlaf (Power save mode) war und 
durch Timer 2 (mit 32k Quarz) geweckt wurde, muss ich merkwürdigerweise 
meinen Timer 1 zweimal initialisieren (CTC) damit er läuft.

Preisfrage:
Was habe ich da nun falsch gemacht?

Meine Aufwachfunktion nach Timer 2 Interrupt sieht so aus:
1
void uC_wake_up(void)
2
{
3
  // all interrupts OFF
4
  #asm("cli")
5
  SMCR = 0;    // sleep disable
6
7
  uC_init();
8
  accel_init();
9
10
  if( PWR_NO_EXT == 0 ) led_enable = 1;
11
  else led_enable = 0;
12
13
  uC_init();    // ?????????????????
14
15
  // Global enable interrupts
16
  #asm("sei")
17
18
  trx_extended_reinit();
19
}

hier die init:
1
void uC_init(void)
2
{
3
  unsigned char i = 0;
4
5
  // Crystal Oscillator division factor: 1
6
  #pragma optsize-
7
  CLKPR = 0x80;
8
  CLKPR = 0;
9
  #ifdef _OPTIMIZE_SIZE_
10
  #pragma optsize+
11
  #endif
12
13
  // Input/Output Ports initialization
14
  // Ports A & C - not available in ATmega128RFA1
15
  // All digital inputs pulled up for now
16
17
  // Port B initialization
18
  PORTB  = PORT_B_VAL;
19
  DDRB  = PORT_B_DIR;
20
21
  // Port D initialization
22
  PORTD  = PORT_D_VAL;
23
  DDRD  = PORT_D_DIR;
24
25
  // Port E initialization
26
  PORTE  = PORT_E_VAL;
27
  DDRE  = PORT_E_DIR;
28
29
  // Port F initialization
30
  PORTF  = PORT_F_VAL;
31
  DDRF  = PORT_F_DIR;
32
33
  // Port G initialization
34
  PORTG  = PORT_G_VAL;
35
  DDRG  = PORT_G_DIR;
36
37
  // Timer/Counter 0 initialization
38
  // Clock source: System Clock
39
  // Clock value: 2000,000 kHz
40
  // Mode: Fast PWM top=OCR0A
41
  // OC0A output: Non-Inverted PWM
42
  // OC0B output: Disconnected
43
#ifdef RF_COORDINATOR
44
  TCCR0A  = TIMER0_FAST_PWM_TOP_FF;
45
  TCCR0B  = TIMER0_DEFAULT_FREQ;
46
  TCNT0  = 0;
47
  OCR0A  = 0x80;
48
  OCR0B  = 0;
49
50
  // set current tone for PWM:
51
  ptr_tone = &sine_0dB_8bit[0];
52
#endif
53
54
#ifdef RF_NODE
55
  TCCR0A  = 0;
56
  TCCR0B  = 0;
57
  TCNT0  = 0;
58
  OCR0A  = 0;
59
  OCR0B  = 0;
60
#endif
61
62
  // Timer1 initialization: 1ms
63
  // Clock source: System Clock; Clock value: 250,000 kHz
64
  // Mode: CTC top=OCR1A
65
  // Compare A Match Interrupt: On
66
  TCCR1A  = 0;
67
  TCCR1B  = 0x0B;
68
  TCNT1H  = 0;
69
  TCNT1L  = 0;
70
  ICR1H  = 0;
71
  ICR1L  = 0;
72
  OCR1AH  = 0;
73
  OCR1AL  = 0xFA;
74
  OCR1BH  = 0;
75
  OCR1BL  = 0;
76
  OCR1CH  = 0;
77
  OCR1CL  = 0;
78
79
  // Timer/Counter 2 initialization
80
  // Clock source: Crystal on TOSC1 pin
81
  // Clock value: PCK2/1024 => 32 ticks per second
82
  // Mode: Normal top=0xFF => 8sec
83
  ASSR  = 0x20;
84
  TCCR2A  = 0;
85
  TCCR2B  = 0x07;
86
  TCNT2  = 0;
87
  OCR2A  = 0;
88
  OCR2B  = 0;
89
  while((ASSR & (1 << TCN2UB)));
90
91
  // Timer/Counter 3 initialization
92
  // Clock source: System Clock
93
  // Clock value: 15,625 kHz
94
  // Mode: CTC top=OCR3A
95
  TCCR3A  = 0;
96
  TCCR3B  = 0x0D;
97
  TCNT3H  = 0;
98
  TCNT3L  = 0;
99
  ICR3H  = 0;
100
  ICR3L  = 0;
101
  OCR3AH  = 0x3D;
102
  OCR3AL  = 0x09;
103
  OCR3BH  = 0;
104
  OCR3BL  = 0;
105
  OCR3CH  = 0;
106
  OCR3CL  = 0;
107
108
  // Timer/Counter 4 unused
109
  TCCR4A  = 0;
110
  TCCR4B  = 0;
111
  TCNT4H  = 0;
112
  TCNT4L  = 0;
113
  ICR4H  = 0;
114
  ICR4L  = 0;
115
  OCR4AH  = 0;
116
  OCR4AL  = 0;
117
  OCR4BH  = 0;
118
  OCR4BL  = 0;
119
  OCR4CH  = 0;
120
  OCR4CL  = 0;
121
122
  // Timer/Counter 5 unused
123
  TCCR5A  = 0;
124
  TCCR5B  = 0;
125
  TCNT5H  = 0;
126
  TCNT5L  = 0;
127
  ICR5H  = 0;
128
  ICR5L  = 0;
129
  OCR5AH  = 0;
130
  OCR5AL  = 0;
131
  OCR5BH  = 0;
132
  OCR5BL  = 0;
133
  OCR5CH  = 0;
134
  OCR5CL  = 0;
135
136
// External Interrupt(s) initialization
137
// INT0: On
138
// INT0 Mode: Low level
139
// others off
140
  EICRA  = 0x00;
141
  EICRB  = 0x00;
142
  EIMSK  = 0x01;
143
  EIFR  = 0x01;
144
  PCMSK0  = 0;
145
  PCMSK1  = 0;
146
  PCMSK2  = 0;
147
  PCICR  = 0;
148
149
  // Timer/Counter 0-5 Interrupt(s) initializations
150
#ifdef RF_COORDINATOR
151
  TIMSK0  = 0x02;    // Fast PWM
152
#endif
153
154
#ifdef RF_NODE
155
  TIMSK0  = 0;    // none
156
#endif
157
158
  TIMSK1  = 0x02;    // CTC interrupt - 1ms
159
  TIMSK2  = 0x01;    // Overflow interrupt
160
  TIMSK3  = 0x02;    // CTC interrupt - 1s
161
  TIMSK4  = 0;
162
  TIMSK5  = 0;
163
164
  //+++++++++++++++++++++++++++++++++++++++
165
  // USART0 initialization
166
  // Communication Parameters: 8 Data, 1 Stop, No Parity
167
  // USART0 Receiver: On
168
  // USART0 Transmitter: On
169
  // USART0 Mode: Asynchronous
170
  UCSR0A  = 0;
171
  UCSR0B  = 0xD8;
172
  UCSR0C  = 0x06;
173
  UBRR0H  = 0;
174
#ifdef BAUD38K4
175
  // USART0 Baud Rate: 38400
176
  UBRR0L  = 0x19;
177
#else
178
  // USART0 Baud Rate: 9600
179
  UBRR0L  = 0x67;
180
#endif
181
182
  // Analog Comparator unused
183
  ACSR  = 0x80;
184
185
  //+++++++++++++++++++++++++++++++++++++++
186
  // ADC initialization
187
  // ADC Clock frequency: 125,000 kHz
188
  // ADC Voltage Reference: 1.6V internal
189
  // ADC Auto Trigger Source: Free Running
190
  ADMUX  = ADC_INTREF1V6_10BIT;
191
  ADCSRA  = ADA_FREE_ICC_125K;
192
  ADCSRB  = ADB_FREE_RUN;
193
  ADCSRC  = ADC_TIMING;
194
  // Digital input buffers on ADC0-ADC7: Off
195
  // Digital input buffers on ADC8-ADC15: On
196
  DIDR0  = 0xFF;
197
  DIDR2  = 0;
198
199
  //+++++++++++++++++++++++++++++++++++++++
200
  // Power savings, everything not needed turned OFF
201
  PRR0 = OFF_TWI_PRPGA_SPI;
202
  PRR1 = OFF_TIM5_TIM4_USART1;
203
  PRR2 = 0;
204
205
  // Watchdog Timer initialization
206
  // Watchdog Timer Prescaler: OSC/1024k
207
  // Watchdog Timer interrupt: Off
208
  #pragma optsize-
209
  #asm("wdr")
210
  WDTCSR = 0x39;
211
  WDTCSR = 0x29;
212
  #ifdef _OPTIMIZE_SIZE_
213
  #pragma optsize+
214
  #endif
215
216
  TX_length = 0;
217
  TX0_go = 0;
218
  RX0_counter = 0;
219
  RX0_state = RX_IDLE;
220
  for( i = 0; i < 8; i++ ) adc_valid[i] = 0;
221
}

von X- R. (x-rocka)


Lesenswert?

weitere Infos:

- Power Save Mode schaltet externen 16MHz Quarz ab
- Timer 1 läuft mit diesem externen 16MHz / 64

Habe ich richtig verstanden, dass nach dem Power save erstmal der 
Watchdog Oszillator übernimmt, bis die 16MHz stabil sind?
Dann sollte das doch gar keine Probleme geben?

von X- R. (x-rocka)


Lesenswert?

Aua, eben beim Autofahren ist es mir wie Schuppen vom Fisch...

Was ich euch nicht verraten habe:
in meiner sleep funktion wird latürnich Power der Timer ausgeschaltet, 
und wie man oben sieht aber erst nach dem initialisieren des Timers 1 
wieder eingeschaltet. Also:

  PRR0 = OFF_TWI_PRPGA_SPI;
  PRR1 = OFF_TIM5_TIM4_USART1;
  PRR2 = 0;

vor Timer inis verschoben, läuft.

von Peter D. (peda)


Lesenswert?

X- Rocka schrieb:
> in meiner sleep funktion wird latürnich Power der Timer ausgeschaltet,

Wenn der CPU-Takt steht, bringt das nichts, die Timer sind ja CMOS.

Explizit ausschalten muß man nur die Einheiten, die auch ohne Takt Strom 
verbrauchen, also Bandgap, ADC, analog Komparator.


Peter

von X- R. (x-rocka)


Lesenswert?

Peter Dannegger schrieb:
> X- Rocka schrieb:
>> in meiner sleep funktion wird latürnich Power der Timer ausgeschaltet,
>
> Wenn der CPU-Takt steht, bringt das nichts, die Timer sind ja CMOS.
>
> Explizit ausschalten muß man nur die Einheiten, die auch ohne Takt Strom
> verbrauchen, also Bandgap, ADC, analog Komparator.
>
>
> Peter

nicht mal nA?

von Peter D. (peda)


Lesenswert?

X- Rocka schrieb:
> nicht mal nA?

Es wird ja nur der Takt abgeschaltet, nicht die VCC des Timers:

"The Power Reduction Register (PRR), see “PRR0 – Power Reduction 
Register 0” on page 56 and “PRR1 – Power Reduction Register 1” on page 
57, provides a method to stop the clock to individual peripherals to 
reduce power consumption."

"Module shutdown can be used in Idle mode and Active mode to 
significantly reduce the overall power consumption."

"In all other sleep modes, the clock is already stopped."


Peter

von X- R. (x-rocka)


Lesenswert?

Danke, wieder was gelernt!

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.