main.c


1
#include <avr/interrupt.h>
2
#include <portbits.h>
3
4
#define INT_DDR    DDRD
5
#define LED_0     PORTD_7
6
#define LED_1     PORTD_6
7
8
volatile unsigned char Impuls_1s; 
9
unsigned char Startwert_Timer_2;
10
11
ISR(SIG_OVERFLOW2)          // Interrupt Timer 2 --> 100Hz
12
{
13
  TCNT2=Startwert_Timer_2;      // Laden startwert T2             
14
     static unsigned char count0=0, count1=0;
15
  if(count0++>=100){count0=1;LED_0=1;Impuls_1s=1;}
16
  if (LED_0){if (count1++>=6){LED_0=0;count1=1;}}
17
}
18
19
20
unsigned char F_Verzoegerung(unsigned char takt, unsigned char Zeit)
21
{
22
  static unsigned char Freigabe, Einschalt_Verzoegerung, First_Run;
23
  
24
  if(takt)
25
  {
26
    if (!First_Run){First_Run=1;Einschalt_Verzoegerung=Zeit;}
27
    if(!Einschalt_Verzoegerung--) Freigabe=1;
28
  }
29
  return Freigabe;
30
}  
31
32
33
int main(void)
34
{
35
  unsigned char Freigabe_1, Freigabe_2,Sekundentakt;
36
37
  INT_DDR|=(1<<DDD6);      // PORT D Ausgang
38
  INT_DDR|=(1<<DDD7);      // PORT D Ausgang
39
  
40
  // Timer 2 --> Bildung Sekundentakt (10ms / 100Hz)
41
  TCCR2|=(1<<CS22) | (1<<CS21) | (1<<CS20);   // Prescale = 1024
42
  Startwert_Timer_2=246;              // 100Hz
43
  TCNT2=Startwert_Timer_2;
44
  TIMSK|=(1<<TOIE2);                // Interrupt freigeben (Owerflow)
45
  sei();                       // alle interrupts global freigeben  
46
47
  while(1)
48
  {  
49
    Freigabe_1=F_Verzoegerung(Sekundentakt,15);
50
51
    Freigabe_2=F_Verzoegerung(Sekundentakt,10);
52
    
53
    cli();
54
    LED_1=Freigabe_1;
55
    sei();    
56
    Sekundentakt=0;
57
    if (Impuls_1s) {Sekundentakt=1; Impuls_1s=0;} // Sekundentakt aus ISR
58
  }
59
}