LED blinkt zu schnell

Gast #2097664
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):
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

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

7

8
int main ( void ) {
9
  
10
  PORTB  = (1<<PB0);
11
  DDRB  = (1<<PB0);
12

13

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

22
  sei();
23

24
  while(1) {
25
    ...
26
  }
27
}
28

29
ISR ( TIM1_OVF_vect ) {
30
  static uint8_t cnt = 0;
31

32
  if ( cnt < 32 )
33
    led_aus();
34
  else
35
    led_an();
36

37
  cnt++;
38
  if ( cnt >= 64 )
39
    cnt = 0;
40
}
Gast #2097730
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...
Gast #2098507
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren