www.mikrocontroller.net

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


Autor: Bastian F. (bastian_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr\io.h>
#include <avr\interrupt.h>
#define F_CPU 1000000

volatile uint8_t count;

int main () {

TCCR0 |= (1<<CS01) | (1<<CS00); // FCPU/64 => 1000000Hz/64/256= 61Hz
TIMSK |= (1<<TOIE0); 
TCNT0 = 0; 
DDRB |= (1<<PB2); 
count=0;
sei();

while (1) ;
}

ISR(TIMER0_OVF_vect) {
  count++;

  if (count==61) {
    PORTB |= (1<<PB2);
    count=0;
    PORTB &= ~(1<<PB2);
  }
}

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:
   if (count==61) {
    PORTB |= (1<<PB2);
    _delay_ms(50);
    count=0;
    PORTB &= ~(1<<PB2);
  }
Danke!

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Uwe ... (uwegw)
Datum:

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

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es...

Autor: Bastian F. (bastian_f)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.