www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny25, watchdog, power-down, PWM


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte für Batteriebetrieb den AVR alle Sekunde per Watchdog 
Interrupt aus dem power-down Modus holen.

Power-down habe ich so verstanden, dass alle Clocks bis auf den 128 kHz 
Watchdog-Timer gestoppt werden, Ports disconnected..etc.

Im Zusammenspiel mit PWM ergibt sich mit diesem Programm:
// fuses: factory
// F_CPU: 1e6

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <util/delay.h>

ISR(WDT_vect){
  WDTCR |= (1<<WDIE);
}

int __attribute__((OS_main)) main(void){
  PORTB = 0;
  DDRB = (1<<PB3) | (1<<PB4) | (1<<PB1);
  ACSR  = (1<<ACD);
  PRR = (1<<PRUSI);
  MCUCR = (1<<SE) | (1<<SM1);
  TCCR1 = (1<<PWM1A) | (1<<COM1A1) | (1<<CS12) | (1<<CS11);
  //~ OCR1A = 128;
  OCR1A = 255;
  WDTCR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1);
  _delay_ms(533);
  sei();
  while (1){
    PORTB ^= (1<<PB3);
    sleep_cpu();
  }
}

folgendes:
Mit OCR1A = 128; erscheint für das delay die PWM an PB1, PB1 geht aus, 
PB3 geht an, und dann blinkt PB3 im Sekundentakt.

Mit OCR1A = 255; bleibt PB1 die ganze Zeit an, hinzu kommt das 1 s - 
Blinken von PB3.

D.h. wohl dass meine Annahme, dass alles abgeschaltet wird anscheinend 
falsch ist und ich das manuell machen muss?

Was ist die Ursache der unterschiedlichen Wirkung der OCR1A Werte?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann das //~ WDTCR |= (1<<WDIE); in der ISR sparen, da es nicht 
automatisch gelöscht wird, wenn der Watchdog nur mit WDIE gestartet 
wird.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
_delay_ms(533); hat bei 1 MHz auf 10tel Sekunden umgeschaltet. Das 
Verhalten bleibt aber auch mit _delay_ms(255); gleich.
Wenn das delay auskommentiert wird, schaltet die PWM sofort ab.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird an der Synchronisation von OCRxx liegen ("temporary register", 
"latch"). OCRxx vor dem Starten des Timers behebt zumindest das.
// fuses: factory
// F_CPU: 1e6

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <util/delay.h>

ISR(WDT_vect){
}

int main(void){
  PORTB = 0;
  DDRB = (1<<PB3) | (1<<PB4) | (1<<PB1);
  
  ACSR  = (1<<ACD);
  PRR = (1<<PRUSI);
  
  MCUCR = (1<<SE) 
        | (1<<SM1)
        //~ | (1<<SM0)
        ;
  
  OCR1A = 128;
  TCCR1 = (1<<PWM1A) | (1<<COM1A1) | (1<<CS12) | (1<<CS11);
  
  WDTCR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1);
  
  sei();
  
  while (1)
  {
    PORTB ^= (1<<PB3);
    sleep_cpu();
  }
}

Durch den power-down wird bei OCRA0 > 0 allerdings der Pin nach dem 
Aufwachen auf 1 gesetzt, die PWM ist nicht mehr aktiv.
Wo steht etwas zu diesem Verhalten (ausser, dass power down alle clocks 
stoppt) und wie geht man damit um?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorher PWM auf 0, nachher den Timer wieder starten..

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.