www.mikrocontroller.net

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


Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht 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:
void uC_wake_up(void)
{
  // all interrupts OFF
  #asm("cli")
  SMCR = 0;    // sleep disable

  uC_init();
  accel_init();

  if( PWR_NO_EXT == 0 ) led_enable = 1;
  else led_enable = 0;

  uC_init();    // ?????????????????

  // Global enable interrupts
  #asm("sei")

  trx_extended_reinit();
}

hier die init:
void uC_init(void)
{
  unsigned char i = 0;

  // Crystal Oscillator division factor: 1
  #pragma optsize-
  CLKPR = 0x80;
  CLKPR = 0;
  #ifdef _OPTIMIZE_SIZE_
  #pragma optsize+
  #endif

  // Input/Output Ports initialization
  // Ports A & C - not available in ATmega128RFA1
  // All digital inputs pulled up for now

  // Port B initialization
  PORTB  = PORT_B_VAL;
  DDRB  = PORT_B_DIR;

  // Port D initialization
  PORTD  = PORT_D_VAL;
  DDRD  = PORT_D_DIR;

  // Port E initialization
  PORTE  = PORT_E_VAL;
  DDRE  = PORT_E_DIR;

  // Port F initialization
  PORTF  = PORT_F_VAL;
  DDRF  = PORT_F_DIR;

  // Port G initialization
  PORTG  = PORT_G_VAL;
  DDRG  = PORT_G_DIR;

  // Timer/Counter 0 initialization
  // Clock source: System Clock
  // Clock value: 2000,000 kHz
  // Mode: Fast PWM top=OCR0A
  // OC0A output: Non-Inverted PWM
  // OC0B output: Disconnected
#ifdef RF_COORDINATOR
  TCCR0A  = TIMER0_FAST_PWM_TOP_FF;
  TCCR0B  = TIMER0_DEFAULT_FREQ;
  TCNT0  = 0;
  OCR0A  = 0x80;
  OCR0B  = 0;

  // set current tone for PWM:
  ptr_tone = &sine_0dB_8bit[0];
#endif

#ifdef RF_NODE
  TCCR0A  = 0;
  TCCR0B  = 0;
  TCNT0  = 0;
  OCR0A  = 0;
  OCR0B  = 0;
#endif

  // Timer1 initialization: 1ms
  // Clock source: System Clock; Clock value: 250,000 kHz
  // Mode: CTC top=OCR1A
  // Compare A Match Interrupt: On
  TCCR1A  = 0;
  TCCR1B  = 0x0B;
  TCNT1H  = 0;
  TCNT1L  = 0;
  ICR1H  = 0;
  ICR1L  = 0;
  OCR1AH  = 0;
  OCR1AL  = 0xFA;
  OCR1BH  = 0;
  OCR1BL  = 0;
  OCR1CH  = 0;
  OCR1CL  = 0;

  // Timer/Counter 2 initialization
  // Clock source: Crystal on TOSC1 pin
  // Clock value: PCK2/1024 => 32 ticks per second
  // Mode: Normal top=0xFF => 8sec
  ASSR  = 0x20;
  TCCR2A  = 0;
  TCCR2B  = 0x07;
  TCNT2  = 0;
  OCR2A  = 0;
  OCR2B  = 0;
  while((ASSR & (1 << TCN2UB)));

  // Timer/Counter 3 initialization
  // Clock source: System Clock
  // Clock value: 15,625 kHz
  // Mode: CTC top=OCR3A
  TCCR3A  = 0;
  TCCR3B  = 0x0D;
  TCNT3H  = 0;
  TCNT3L  = 0;
  ICR3H  = 0;
  ICR3L  = 0;
  OCR3AH  = 0x3D;
  OCR3AL  = 0x09;
  OCR3BH  = 0;
  OCR3BL  = 0;
  OCR3CH  = 0;
  OCR3CL  = 0;

  // Timer/Counter 4 unused
  TCCR4A  = 0;
  TCCR4B  = 0;
  TCNT4H  = 0;
  TCNT4L  = 0;
  ICR4H  = 0;
  ICR4L  = 0;
  OCR4AH  = 0;
  OCR4AL  = 0;
  OCR4BH  = 0;
  OCR4BL  = 0;
  OCR4CH  = 0;
  OCR4CL  = 0;

  // Timer/Counter 5 unused
  TCCR5A  = 0;
  TCCR5B  = 0;
  TCNT5H  = 0;
  TCNT5L  = 0;
  ICR5H  = 0;
  ICR5L  = 0;
  OCR5AH  = 0;
  OCR5AL  = 0;
  OCR5BH  = 0;
  OCR5BL  = 0;
  OCR5CH  = 0;
  OCR5CL  = 0;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// others off
  EICRA  = 0x00;
  EICRB  = 0x00;
  EIMSK  = 0x01;
  EIFR  = 0x01;
  PCMSK0  = 0;
  PCMSK1  = 0;
  PCMSK2  = 0;
  PCICR  = 0;

  // Timer/Counter 0-5 Interrupt(s) initializations
#ifdef RF_COORDINATOR
  TIMSK0  = 0x02;    // Fast PWM
#endif

#ifdef RF_NODE
  TIMSK0  = 0;    // none
#endif

  TIMSK1  = 0x02;    // CTC interrupt - 1ms
  TIMSK2  = 0x01;    // Overflow interrupt
  TIMSK3  = 0x02;    // CTC interrupt - 1s
  TIMSK4  = 0;
  TIMSK5  = 0;

  //+++++++++++++++++++++++++++++++++++++++
  // USART0 initialization
  // Communication Parameters: 8 Data, 1 Stop, No Parity
  // USART0 Receiver: On
  // USART0 Transmitter: On
  // USART0 Mode: Asynchronous
  UCSR0A  = 0;
  UCSR0B  = 0xD8;
  UCSR0C  = 0x06;
  UBRR0H  = 0;
#ifdef BAUD38K4
  // USART0 Baud Rate: 38400
  UBRR0L  = 0x19;
#else
  // USART0 Baud Rate: 9600
  UBRR0L  = 0x67;
#endif

  // Analog Comparator unused
  ACSR  = 0x80;

  //+++++++++++++++++++++++++++++++++++++++
  // ADC initialization
  // ADC Clock frequency: 125,000 kHz
  // ADC Voltage Reference: 1.6V internal
  // ADC Auto Trigger Source: Free Running
  ADMUX  = ADC_INTREF1V6_10BIT;
  ADCSRA  = ADA_FREE_ICC_125K;
  ADCSRB  = ADB_FREE_RUN;
  ADCSRC  = ADC_TIMING;
  // Digital input buffers on ADC0-ADC7: Off
  // Digital input buffers on ADC8-ADC15: On
  DIDR0  = 0xFF;
  DIDR2  = 0;

  //+++++++++++++++++++++++++++++++++++++++
  // Power savings, everything not needed turned OFF
  PRR0 = OFF_TWI_PRPGA_SPI;
  PRR1 = OFF_TIM5_TIM4_USART1;
  PRR2 = 0;

  // Watchdog Timer initialization
  // Watchdog Timer Prescaler: OSC/1024k
  // Watchdog Timer interrupt: Off
  #pragma optsize-
  #asm("wdr")
  WDTCSR = 0x39;
  WDTCSR = 0x29;
  #ifdef _OPTIMIZE_SIZE_
  #pragma optsize+
  #endif

  TX_length = 0;
  TX0_go = 0;
  RX0_counter = 0;
  RX0_state = RX_IDLE;
  for( i = 0; i < 8; i++ ) adc_valid[i] = 0;
}

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, wieder was gelernt!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.