mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED blinkt zu schnell


Autor: Martin H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,

folgende Situation:
ich hab auf einem ATTiny24 den 16-bit Timer (Timer/Counter1) im 
"Fast-PWM 10-bit"-Modus laufen (TOP = 3FFF). Dabei läuft der Timer mit 
clk/8 = 1MHz wobei clk = 8MHz (interner RC-Oszillator).
Im Overflow-interrupt des selben Timers wird ein Counter (static 
uint8_t) gezählt, welcher von 0 bis 64 zählt. Ist der Zähler kleiner 32 
wird die LED ausgemacht, sonst an.

Wenn ich mich nicht verrechne, sollte sich also eine Blinkfrequenz von 
ca. 1Hz ergeben. Ich messe aber 15Hz... Wo kann der Hund begraben sein?

Beim weiteren testen und messen (OC1A-Pin) stelle ich nun fest, dass ich 
hier ebenfalls eine Periodendauer von nur ca. 1ms habe?! Der Timer läuft 
also irgendwie zu schnell, nur warum?
hat jemand ne Idee?

Den Prescaler hab ich eigentlich auch schon überprüft und schneller als 
8MHz kann der interne Oszillator ja nicht!

Ich hänge wirklich fest. Bitte helft mir auf die Sprünge.

lg Martin


PS: Mein Code (minimal gekürzt ums übersichtlicher zu halten):

#include <avr/io.h>
#include <avr/interrupt.h>

#define led_aus() PORTB|=1<<PB0
#define led_an()  PORTB&=~(1<<PB0)


int main ( void ) {
  
  PORTB  = (1<<PB0);
  DDRB  = (1<<PB0);


  // Timer1 for Servosetting
  //  clk/8 (1MHz), 10-bit Fast-pwm (16,383ms), non-inverting PWM
  TCCR1A  = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);
  TCCR1B  = (1<<ICES1) | (1<<WGM12) | (1<<CS11);
  OCR1A  = 1500;
  OCR1B  = 1500;
  TIMSK1  = (1<<ICIE1) | (1<<TOIE1);

  sei();

  while(1) {
    ...
  }
}

ISR ( TIM1_OVF_vect ) {
  static uint8_t cnt = 0;

  if ( cnt < 32 )
    led_aus();
  else
    led_an();

  cnt++;
  if ( cnt >= 64 )
    cnt = 0;
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>im "Fast-PWM 10-bit"-Modus laufen (TOP = 3FFF).

Top = 3FF.

MfG Spess

Autor: Berater ohne Honorar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8'000'000  0x4000  65 = ?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passt doch, 1MHz / 1024 ist ca. 1khz, also 1ms periodendauer.

Autor: Martin H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so ein mist.
Hab ich da ein F zu viel gelesen!

Wie komm ich dann jetzt auf 16-20ms Periodendauer?! Na das hab ich ja 
mal schön verbockt...
Ich brauche nämlich eigentlich OC1A, OC1B und den ICP...

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Musste durch 128 teilen, dann haste 16,384ms Periodendauer

Autor: Martin H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab ne für mich bessere Lösung gefunden. Der Timer läuft jetzt mit 
1MHz takt im Normal Mode und OCR1X wird im Compare-Interrupt neu 
gesetzt, sowie COM1X1 jedes mal getoggelt wird, sodass auch der Pin 
abwechselnd gesetzt und gelöscht wird.
Ich hab dadurch die volle Auflösung (1µs) und kann geanu meine 
gewünschte Periodendauer einstellen. Positiver Nebeneffekt ist, dass ich 
die beiden PWM-Signale auchnoch gezielt phasenverschieben kann. Top!

Danke aber trotzdem!

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.