Forum: Mikrocontroller und Digitale Elektronik Eine Minute warten - Atmega8


von Sandro (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sandro schrieb:
> Leider funktioniert das Ganze aber noch nicht so wie es soll.
Was tut es stattdessen?

Sandro schrieb:
> if(counter == 30)      // 1000ms / 32,766 = 30,51
>   {
>   minute_vergangen = 1;
Ich glaube, du hast nach 30*30ms noch keine ganze Minute gewartet...

von kif (Gast)


Lesenswert?

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?

von Sandro (Gast)


Lesenswert?

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

von Sandro (Gast)


Lesenswert?

falsches kopiert...Nachtrag:
1
if(counter == 1830)

von Karl H. (kbuchegg)


Lesenswert?

> unsigned char counter

wie soll denn ein unsigned char bis 983 zählen?

von Sandro (Gast)


Lesenswert?

Der Datentyp der volatile Variablen wurde auf int abgewandelt.

Trotzdem kein Blinken.

von Karl H. (kbuchegg)


Lesenswert?

>   TCCR0 |= (1 << CS02) | (1 << CS00);  // Prescaler auf 1024tel setzen

Wenn du den Timer 2 benutzen willst, dann solltest du aber auch den 
Timer 2 starten und nicht den Timer 0. TCCR0 ist das 
Konfigurationsregister vom Timer 0.

von Sandro (Gast)


Lesenswert?

>TCCR0 ist das Konfigurationsregister vom Timer 0.

Ups. Danke!

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.