- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: Timer >>> CPU-Takt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.703
    .. Schon bei dem CPU-Takt für den Timer1 komme ich ins schleudern. Der ATtiny84 taktet intern mit 8MHz (CKSEL2=1). Nun stelle ich die CPU gerne auf 1MHz; #define F_CPU 1000000UL ..
    Hallo frabe.

    Ceos und Hannes (021aet04) haben ja schon hingewiesen dass durch die Fuses unter anderem die Taktquelle des Controllers bestimmt wird und auch die Einstellung der internen Taktquelle. Zu den Fuses gibts Gehirnnahrung noch im RN-Wissen hier (klick) und als Hilfe auch nen Fuse-Calculator (nochKlick). Die Fuses sind also Einstellungen des Controllers die üblicherweise über das Programmiergerät zugänglich sind, die aber nichts mit der eigentlichen Programmierung in Form des Maschinencodes zu tun haben (es gibt Ausnahmen). Damit das Programm aber richtig laufen kann, muss der Programmcode die vom Benutzer gewählte Einstellung enthalten.

    Das Datenblatt zum tiny84 (meins ist 8006K–AVR–10/10) schreibt dazu
    Zitat Zitat von ATtiny24-44-84_doc8006_10-2010.pdf auf Seite 26
    ..
    6.2.2 Calibrated Internal 8 MHz Oscillator
    .. The device is shipped with the CKDIV8 Fuse programmed ..
    und weiter
    Zitat Zitat von ATtiny24-44-84_doc8006_10-2010.pdf auf Seite 30
    ..
    6.2.6 Default Clock Source

    .. resulting in 1.0 MHz system clock ..
    Mir geht es bei einer niedrigen F_CPU um Energieschohnung .. Warum macht es dennoch Sinn die CPU auf 8MHz laufe zu lassen? ..
    Es macht dann keinen Sinn die CPU auf 8 MHz laufen zu lassen. Und auch darauf gibts mehrere Hinweise im >>ganzen<< Datenblatt unter dem Stichwort "low power". Und schon auf Seite 1 des Datenblattes steht:
    ......• Low Power Consumption
    ..........– Active Mode (1 MHz System Clock): 300 μA @ 1.8V

    Das ist nur der Hinweis des Herstellers auf den niedrigen Verbrauch bei 1 MHz und geringer Versorgungsspannung - das ist keine Vorschrift. Man kann durch den niedrig taktenden internen 128kHz-Oszillator vermutlich noch niedrigere Verbräuche erzielen (dazu habe ich keine Erfahrungen). Möglicherweise kann man mit noch niedrigerem Takt, z.B. nem Uhrenoszillator mit 32.768 kHz im Stromverbrauch noch weiter runterkommen. Ausführliches dazu wieder im Datenblatt ab S25, 6.2 Clock Sources. Also - niedriger Stromverbrauch ist duch vielerlei Einstellungen möglich - wie immer die lästige, mühselige Wahl des Anwenders.

    Hoffe das hilft Dir auch weiter.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    @oberallgeier, erst einmal VIELEN DANK für deine Ausführungen.
    uC wird bei mir mit 5VDC betrieben.
    Brauchte bis lang noch keine genauen Timer mit Interrupt - meine schwarzern Flecken - aber unendlich wichtig!
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Hier kann ich nur eine 8MHz anwähler;
    Klicke auf die Grafik für eine größere Ansicht

Name:	fuses1.jpg
Hits:	5
Größe:	36,8 KB
ID:	34211
    Einen 8fach (Vor-)teiler habe ich leider auch nicht gefunden;
    Klicke auf die Grafik für eine größere Ansicht

Name:	fuses2.jpg
Hits:	5
Größe:	107,6 KB
ID:	34213

    Wo "verstecken" sich die Parameter zur CPU-f Einstellung?
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    F_CPU wird nicht dort festgelegt sondern als precompiler konstante oder per define im code

    im 2ten Bild LOW.CKDIV8 ist AN, das heißt deine CPU taktet mit OSC/8 = 1 Mhz, da OSC 8Mhz ist

    Um mal ins Detail zu gehen, im Code für die Atmel Treiber und internen Funktion (von delay.h) zum Beispiel werden Formel benutzt um die Anzahl an Takte Vs Frequenz zu errechnen um korrekt und deterministisch arbeiten zu können, damit delay_ms(1000) auch genau eine Sekunde dauert.

    Die Formel verwendet dann den "Platzhalter" F_CPU wo eigentlich eine Frequenz stehen müsste, also quasi so etwas wie eine Variable!
    Es ist aber keine Variable sondern eneben nur ein Platzhalter.
    Beim compilen geht der Preprozessor/Precompiler einmal über den Code, sammelt alle #defines und andere precompiler Schlüsselwörter ein und bildet sich so eine Art Notizzettel welcher Code eingeblendet und ausgeblendet wird und welche Platzhalter mit welchem Inhalt überschrieben werden ("Suchen und ersetzen" wenn man es so nennen will)

    Nach diesem Schritt sollte sich dein Code so lesen als hättest du überall die F_CPU Frequenz von Hand eingetragen und dieser wird dann am Ende fertig compiliert.
    Geändert von Ceos (11.06.2019 um 14:16 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    im 2ten Bild LOW.CKDIV8 ist AN, das heißt deine CPU taktet mit OSC/8 = 1 Mhz, da OSC 8Mhz ist
    Bei LOW.CKDIV8 war ich mir unsicher - daher hier Dank für die Bestätigung!
    Die Formel verwendet dann den "Platzhalter" F_CPU wo eigentlich eine Frequenz stehen müsste
    Aber auch der 2ten Teil deiner Ausführung war in mir ein Wissens-Wackelkandidat, da in div. Fachliteraturen bei einigen Prog F_CPU eingetragen wurde und bei anderen nicht.
    Nun hat sich FÄLSCHLICHER WEISE in meinem Kopf Gedanke fest gesetzt, dass die Fuse-Prozessor-Geschweindgkeit nur dann greift, wenn KEIN F_CPU im Prog.code steht.
    Dank dir auch hier für deine tolle und einfache Ausführung!!!

    Abschließend zu meinem Verständnis: Sollte in Fuse und F_CPU unterschiedliche Frequenzen eingetragen sein, meckert der Compiler nicht, funktioniert auch das Programm im Ablauf, aber berechnete Zeiten werden falsch interpretiert/umbesetzt.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Der Compiler kennt nur die Infos die du ihm gibst und das ist bestenfalls das F_CPU Makro, die fuses kann dein compiler nicht wissen, das ist eine andere Baustelle

    und wenn du falsche Zeiten gibst rennt deine sleep_ms(1000) eben in 1/8tel Sekunden durch statt einer ganzen Sekunde wenn das CKDIV8 nicht an ist
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. C167 Drehzahlberechnung mit Timer 3 od. Timer 3 & 4?
    Von cieks0301 im Forum Software, Algorithmen und KI
    Antworten: 5
    Letzter Beitrag: 13.03.2009, 10:37
  2. sehr niedriger Takt für Timer
    Von The Man im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 17.10.2007, 20:50
  3. CLK Takt höher als Datenbus Takt (SDRAM)
    Von saoirse im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 25.08.2007, 17:12
  4. Allgemein Takt Einstellung und PWM Takt einstellung
    Von Neo120484 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 30.07.2006, 09:53
  5. PWM mit Timer 0 und 2 geht, aber nicht mit Timer 1 (mega64)
    Von popi im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.06.2006, 16:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test