Forum: Mikrocontroller und Digitale Elektronik Blinker mit Herzrhythmusstörungen


von Hegy (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

wieso blinkt ein einfacher Blinker (invertieren eines Ports mit Timer)
nicht gleichmäßig? Im Anhang ein Timing-Diagramm, die obere rote Kurve
ist das Soll-Timing, unten drunter (blau) das Ist-Timing. Wieso blinkts
dann nicht ordentlich. Der Code:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
static volatile unsigned char bytecount;
6
static volatile unsigned int waittime;
7
static volatile unsigned char tcnt0; // Reload-Wert f. TCNT0 (Int.
8
Timer 0 Overflow)
9
10
11
void sleep(unsigned long wait)
12
{
13
  // Timer 0, 8-Bit Initialisierung
14
  tcnt0 = 227;
15
  TCNT0 = tcnt0; 
16
  waittime = wait;
17
  TCCR0B = (1<<CS02); // Timer 0, Prescaler = 256
18
  //TIFR0 = (1<<TOV0);
19
  
20
  do
21
    TIMSK0 = (1<<TOIE0); // Timer Overflow Interrupt Enable 0
22
einschalten
23
  while(waittime > 0);
24
25
  TIMSK0 = 0;
26
  TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02)); // Timer Stop
27
}
28
29
30
int main(void)
31
{
32
  DDRB = 0x07; // Port PB0, PB1, PB2 Output
33
  PORTB = 0xFF; // Port PB0, PB1 aus
34
35
  TIMSK0 &= ~(1<<TOIE0); // Timer Overflow Interrupt Enable 0
36
ausschalten
37
38
  sei();
39
40
  while(1)
41
  {
42
    PORTB = ~PORTB;
43
    sleep(500);
44
  }
45
  return 0;
46
}
47
48
49
// Timer 0 Overflow
50
ISR(SIG_OVERFLOW0)
51
{
52
  waittime--;
53
  TCNT0 = tcnt0;
54
}

Der Watchdog ist lt. Fuse-Bits aus.

 - Hegy

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.