Eine Minute warten - Atmega8

Gast #3537778
Hallo zusammen.

Ich versuche derzeit, eine Routine zu schreiben, die LEDs an Port B 
meines Atmega8 eine Minute jeweils ein- und eine Minute ausschaltet.

Leider funktioniert das Ganze aber noch nicht so wie es soll.

Da ich Timer0 für eine andere Funktion verwenden möchte, habe ich Timer2 
(8-bit) dafür hergenommen.

Könntet ihr mal einen Blick auf meinen Code werfen?
1
/***********************
2
  Controller: ATmega8
3
***********************/
4

5

6
#include <avr/io.h>
7
#include <avr/interrupt.h> 
8
 
9
#define F_CPU 8000000          // F_CPU = 8 MHz
10

11
volatile unsigned char counter = 0;
12
volatile unsigned char minute_vergangen = 0;
13

14
 
15
void init_minute_timer(void)      
16
{
17
  TCCR0 |= (1 << CS02) | (1 << CS00);  // Prescaler auf 1024tel setzen
18
  TIMSK |= (1 << TOIE2);        // Overflow-Interrupt enablen 
19
  sei();
20
}
21

22

23

24
ISR (TIMER2_OVF_vect)
25
{
26
//  (8000000/1024)/256 Hz = 30,51 Hz  => 32,776 ms
27
  counter++;
28
  if(counter == 30)      // 1000ms / 32,766 = 30,51
29
  {
30
  minute_vergangen = 1;
31
  counter = 0;
32
  }
33
}
34

35
int wait_minute(void)
36
{
37
  minute_vergangen = 0;
38
  while(minute_vergangen != 1);
39
  return 1;
40
}
41

42

43

44

45

46

47
void main (void)
48
{
49
  DDRB = 0xFF;      // Port-Pins als Ausgang schalten
50
  init_minute_timer();
51
  
52
  while(1)
53
  {
54
    PORTB = 0xFF;
55
    wait_minute();
56
    PORTB = 0;
57
    wait_minute();
58
  }
59
  
60
  return;
61
}


Vielen Dank und Gruß
Johannes
Gast
Sandro schrieb:
> Leider funktioniert das Ganze aber noch nicht so wie es soll.

Wie genau funktioniert es denn nicht?

Deine Berechnung über die Anzahl der Overflows pro Minute sieht auf 
jeden Fall komisch aus. Vielleicht meinst du mit Minute ja auch Sekunde.

Oliver
Gast
Angenommen deine Berechnungen stimmen. Du zählst alle 32ms den counter 
hoch, bis er auf 30 steht. Dann sind 960ms vergangen - wie kommst du auf 
eine Minute?
Gast
>wie kommst du auf eine Minute?
Stimmt. Ein Leichtsinnsfehler.

Habe nun auf folgendes abgeändert in der ISR:
1
 if(counter == 983)


Trotzdem blinkt sich da nix. :-(
Die LED geht an und bleibt an.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.