Forum: Mikrocontroller und Digitale Elektronik Mit Timer LED einmal pro Sekunde leuchten lassen


von Bastian F. (bastian_f)


Lesenswert?

1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
#define F_CPU 1000000
4
5
volatile uint8_t count;
6
7
int main () {
8
9
TCCR0 |= (1<<CS01) | (1<<CS00); // FCPU/64 => 1000000Hz/64/256= 61Hz
10
TIMSK |= (1<<TOIE0); 
11
TCNT0 = 0; 
12
DDRB |= (1<<PB2); 
13
count=0;
14
sei();
15
16
while (1) ;
17
}
18
19
ISR(TIMER0_OVF_vect) {
20
  count++;
21
22
  if (count==61) {
23
    PORTB |= (1<<PB2);
24
    count=0;
25
    PORTB &= ~(1<<PB2);
26
  }
27
}

Die Berechnung des Timers sollte stimmen, oder?
Mein Problem ist nun, dass wenn ich im Interrupt die LED nicht wieder 
ausschalte diese anbleibt und wenn ich sie nicht ausschalte geht sie 
erst gar nicht an.
Oder geht das ganze so schnell, dass ich es gar nicht sehen kann?
Falls ja, wie kann man das ändern?
Wenn ich ein delay nach dem LED einschalten einfügen würde, verändere 
ich dann den ganzen Timer ablauf, oder ist das nur für das Interrup 
relevant?
zB:
1
   if (count==61) {
2
    PORTB |= (1<<PB2);
3
    _delay_ms(50);
4
    count=0;
5
    PORTB &= ~(1<<PB2);
6
  }
Danke!

von Knut (Gast)


Lesenswert?

Du musst gucken welchen Status die LED hat, wenn an dann aus und 
umgekehrt! Ansonsten passt es! Du hast dann aber 0,5Hz, musst also deine 
Prescaler neu überdenken ;-)

von Uwe .. (uwegw)


Lesenswert?

Knut schrieb:
> Du musst gucken welchen Status die LED hat, wenn an dann aus und
> umgekehrt!
Auch toggeln genannt...
PORTB ^= (1<<PB2);

von Knut (Gast)


Lesenswert?

So ist es...

von Bastian F. (bastian_f)


Lesenswert?

Danke erstmal, aber kann das jemand auch einem Blöden wie mir erklären?
Das ^= ist, wenn ich das richtig verstanden habe, der XOR Operator, 
oder?
Wenn dem so ist, dann habe ich ja zwei Zustände die überprüft werden, 
nämlich an oder aus.
Aber bei beiden Varianten ist das Ergbenis mit XOR doch immer wahr, also 
wie wird da was "getoggelt"?

Und nochwas: "Du hast dann aber 0,5Hz, musst also deine Prescaler neu 
überdenken."
Wieso habe ich dann 0,5Hz wenn ich toggel?

von spess53 (Gast)


Lesenswert?

Hi

>Das ^= ist, wenn ich das richtig verstanden habe, der XOR Operator,
>oder?
>Wenn dem so ist, dann habe ich ja zwei Zustände die überprüft werden,
>nämlich an oder aus.
>Aber bei beiden Varianten ist das Ergbenis mit XOR doch immer wahr, also
>wie wird da was "getoggelt"?

0 XOR 1 = 1
1 XOR 1 = 0

MfG Spess

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.