mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega8 und powersave


Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgendes Problem:
ich möchte möglichst wenig Strom verbrauchen, also Standby Powersave 
oder ähnliches.
Aufwachen soll der Prozessor auf Tastendruck, das ist nicht schwierig
aber auch nachdem der Timer abgelaufen ist. Wenn ich das Datenblatt 
richtig verstanden habe geht das aber nur wenn ich eine externe Clock 
anlege.

Ist das so oder gibt es noch eine andere möglichkeit sich quarzgenau 
wecken zu lassen?
Notfalls auch mit einem anderen Prozessor??

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Walter (Gast)

>Aufwachen soll der Prozessor auf Tastendruck,

geht aus JEDEM Sleepmodus.

>das ist nicht schwierig
>aber auch nachdem der Timer abgelaufen ist.

Geht aus fast jedem. Man muss Timer 2 als asynchronen Timer mit 32 kHz 
Uhrenquarz beschalten.

>Notfalls auch mit einem anderen Prozessor??

Ahhh neee!

MFG
Falk

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Aufwachen soll der Prozessor auf Tastendruck,

>geht aus JEDEM Sleepmodus.
sag ich ja dass das NICHT schwierig ist

>>das ist nicht schwierig
>>aber auch nachdem der Timer abgelaufen ist.

>Geht aus fast jedem. Man muss Timer 2 als asynchronen Timer mit 32 kHz
>Uhrenquarz beschalten.
When AS2 is written to one, Timer/Counter 2 is clocked from a crystal 
Oscillator connected to the Timer Oscillator 1 (TOSC1) pin.
an diesem hängt aber schon mein Quarz für den Prozessor???
Ich will ja nicht mit 32kHz takten

>>Notfalls auch mit einem anderen Prozessor??

>Ahhh neee!
aber doch, sollte allerdings ein AVR mit mind. genausoviel IO Pins sein

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>an diesem hängt aber schon mein Quarz für den Prozessor???

beim Mega8 schon.
dann must du für die Core einen der internen RC-Oszilatoren verwenden.

oder ggf die watchdog zum aufwecken missbrauchen

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>an diesem hängt aber schon mein Quarz für den Prozessor???

>beim Mega8 schon.
>dann must du für die Core einen der internen RC-Oszilatoren verwenden.
ich brauche aber auch einen stabilen Takt für die serielle Schnittstelle

>oder ggf die watchdog zum aufwecken missbrauchen
der ist aber wieder nicht genau

muss ich wohl den idle mode nehmen der aber leider mehr als 1mA braucht

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich brauche aber auch einen stabilen Takt für die serielle Schnittstelle

Du kannst mit dem 32 kHz Quarz die interne Taktquelle kalibrieren.
Dann kannst Du locker Uart betreiben.

Gruß Sebastian

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>ich brauche aber auch einen stabilen Takt für die serielle Schnittstelle

>Du kannst mit dem 32 kHz Quarz die interne Taktquelle kalibrieren.
>Dann kannst Du locker Uart betreiben.

UBRR = fosc/8*BAUD - 1
da komme ich mit 32kHz auf keinen grünen Zweig!?
mind 1200 Baud sollten es sein (gut wären eigentlich 19200)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach so, meinst du dass ich den internen RC Oszillator auf den Uhrenquarz 
kalibrieren soll?
Aber das hilft doch nicht, denn
fosc: XTAL pin frequency (System Clock).

da drunter verstehe ich doch die Frequenz des Quarzes am XTAL Pin?

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee,

- Systemclock auf interen RC-Oszillator einstellen, zb. 8Mhz
- 32k Quarz an XTAL
- Fuses richtig setzen, CPOL (oä.) nicht vergessen
- internen RC-Oszillator mit 32K Quarz justieren
- UART läuft dann über internen RC mit 8MHz Systemtakt

Aber! die Kalibration ist dann wirklich wichtig, sie muß sauber laufen 
und sollte von Zeit zu Zeit durchgeführt werden, driftet.

Der Asynchrone Timer wird dann mkit 32K getaktet auch wenn der Prozessor 
im Powerdown Modus ist. Deshalb ja asynchroner Timer.

Gruß Hagen

Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genaso wie Hagen sagt.
Man läßt einfach den asynchronen Timer mit einem zweitem Timer, der vom 
internem Takt erzeugt wird gleichzeitig laufen und dreht solange an 
OSCCAL, bis beide Timer etwa gleich laufen, fertig.
Ich poste Dir eine Funktion vom Butterfly, das klappt dann einwandfrei.
void OSCCAL_calibration(void)
{
    unsigned char calibrate = FALSE;
    int temp;
    unsigned char tempL;

    CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
    // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
    CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
    
    TIMSK2 = 0;             //disable OCIE2A and TOIE2

    ASSR = (1<<AS2);        //select asynchronous operation of timer2 (32,768kHz)
    
    OCR2A = 200;            // set timer2 compare value 

    TIMSK0 = 0;             // delete any interrupt sources
        
    TCCR1B = (1<<CS10);     // start timer1 with no prescaling
    TCCR2A = (1<<CS20);     // start timer2 with no prescaling

    while((ASSR & 0x01) | (ASSR & 0x04));       //wait for TCN2UB and TCR2UB to be cleared

    
    for (tempL = 0;tempL <=100 ;tempL++)
      _delay_ms(10);
     
    while(!calibrate)
    {
        cli(); 
        
        TIFR1 = 0xFF;   // delete TIFR1 flags
        TIFR2 = 0xFF;   // delete TIFR2 flags
        
        TCNT1H = 0;     // clear timer1 counter
        TCNT1L = 0;
        TCNT2 = 0;      // clear timer2 counter
           
          // wait for timer2 compareflag    
        while ( !(TIFR2 & (1<<OCF2A)) );   // wait for timer2 compareflag

        TCCR1B = 0; // stop timer1

        sei(); // enable global interrupt
    
  if ( (TIFR1 & (1<<TOV1)) )
        {
            temp = 0xFFFF;      // if timer1 overflows, set the temp to 0xFFFF
        }
        else
        {   // read out the timer1 counter value
            tempL = TCNT1L;
            temp = TCNT1H;
            temp = (temp << 8);
            temp += tempL;
        }
    
        if (temp > 6250)
        {
            OSCCAL--;   // the internRC oscillator runs to fast, decrease the OSCCAL
        }
        else if (temp < 6120)
        {
            OSCCAL++;   // the internRC oscillator runs to slow, increase the OSCCAL
        }
        else
            calibrate = TRUE;   // the interRC is correct

        TCCR1B = (1<<CS10); // start timer1
    }
}

Gruß Sebastian

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hagen und Sebastian

danke für eure kompetenten Tips, werde ich dann so probieren,
hatte auch schon überlegt die UART in Software zu machen, aber die 
eingebaute erspart einem doch einiges ...

Im Datenblatt war das ganze leider doch sehr un- bis mißverständlich wo 
die Clock für die UART herstammt.

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.