Marderschreck_selfmade.c


1
/*
2
 * Marderschreck_selfmade.c
3
 *
4
 * Created: 26.05.2014 14:34:29
5
 *  Author: Test1
6
 */ 
7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9
#include <util/delay.h>
10
#include <util/delay.h>
11
12
13
#ifndef F_CPU
14
//prevent compiler error by supplying a default
15
# warning "F_CPU not defined for <util/delay.h>"
16
# define F_CPU 1000000UL
17
#endif
18
static int maxpwm = 170;
19
static int dutypwm = 80;
20
static uint8_t time= 0;
21
#define UP   0
22
#define DOWN 1
23
24
void Timer0_setup (){
25
  
26
  TCCR0B |=(1<<CS01);
27
  TCNT0 |=(1<<OCR0A);
28
  
29
  TIMSK |=(1<<TOIE0);
30
  
31
  
32
}
33
34
void  Timer1(){
35
  
36
TCCR1 |=(1<<PWM1A)|(1<<COM1A1)|(1<<COM1A0)|(1<<CS12);
37
38
OCR1C = maxpwm;
39
OCR1A = dutypwm;
40
TCNT1 |=(OCR1A);
41
//OCR1A=80;  //Impulsbreite ändern
42
43
TIFR |=(1<<TOV1);
44
TIMSK |=(1<<OCIE1A);
45
46
}
47
48
ISR(TIMER0_COMPA_vect){
49
  
50
  time++;
51
52
  if( time == 600 )   // oder was auch immer den 60 Sekunden entspricht
53
  time = 0;
54
55
56
}
57
ISR (TIMER1_COMPA_vect)
58
{
59
  static uint8_t  sweepDirection = UP;
60
  static uint16_t pulseCount = 0;
61
62
  pulseCount++;
63
  if( pulseCount == 1000 )
64
  {
65
    pulseCount = 0;
66
67
    if( sweepDirection == UP )
68
    {
69
      maxpwm += 10;
70
      if( maxpwm > 190 )
71
      sweepDirection = DOWN;
72
    }
73
    else
74
    {
75
      maxpwm -= 10;
76
      if( maxpwm < 80 )
77
      sweepDirection = UP;
78
    }
79
80
      OCR1C = maxpwm;
81
  }
82
83
}
84
int main(void)
85
{
86
  DDRB=0x07;
87
  //Timer0_setup();
88
  Timer1();
89
  PORTB |=(1<<PB3);
90
  
91
    while(1)
92
    {
93
    // erst mal brauchen wir eine Variable die bis 600 zählt.
94
    // 600 deshalb, weil wir 30 Sekunden Ruhe haben wollen und 30 Sekunden
95
    // gepiepse. D.h. nach 60 Sekunden (30 + 30), oder eben 600 mal
96
    // 100 Millisekunden wiederholt sich alles wieder.
97
98
    time++;
99
    if( time == 600 )
100
    time = 0;
101
102
    // nachdem das jetzt klar ist, ist auch klar, dass der Sender
103
    // eingeschaltet sein soll, wenn
104
    // a) die time Variable kleiner als 300 ist, denn dann befinden
105
    //    wir uns in den ersten 30 Sekunden dieses 60 Sekunden Zykluses
106
    // b) der externe Schalter so steht, dass vom Benutzer aus die
107
    //    Freigabe für das Gequietsche gegeben wurde
108
    //
109
    // wenn keins der beiden der Fall ist, dann soll sich auch nichts tun
110
    
111
  if( PINB & (1<<PB3) )    // grundsätzlich ist eingeschaltet
112
  {
113
    //PORTB |= (1<<PB2);     // --> daher erst mal: LED an
114
115
    if( time < 300 )       // ob tatsächlich gedudelt wird, entscheidet die Zeit
116
    TCCR1 |= (1<<CS12);  // erste 30 Sekunden: ein
117
    else
118
    TCCR1 &= ~(1<<CS12); // zweite 30 Sekunden (eigentlich: die restliche Zeit): aus
119
  }
120
  else
121
  {                        // Nope. Da ist nichts eingeschaltet
122
    //PORTB &= ~(1<<PB2);
123
    TCCR1 &= ~(1<<CS12);
124
  }
125
    }
126
}