Forum: Mikrocontroller und Digitale Elektronik LED blinkt zu schnell


von Martin H. (Gast)


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
}

von spess53 (Gast)


Lesenswert?

Hi

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

Top = 3FF.

MfG Spess

von Berater ohne Honorar (Gast)


Lesenswert?

8'000'000  0x4000  65 = ?

von Martin (Gast)


Lesenswert?

Passt doch, 1MHz / 1024 ist ca. 1khz, also 1ms periodendauer.

von Martin H. (Gast)


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...

von Martin (Gast)


Lesenswert?

Musste durch 128 teilen, dann haste 16,384ms Periodendauer

von Martin H. (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.