main.c


1
/*
2
Main
3
Hauptprogramm für die Funktionen der selbst Entwickelten Platine beim SMG*/
4
5
//Einbinden der Bibliotheken
6
#include    <stdio.h>      //Standardbibliothek
7
#include    "config.h"      //Grundkonfiguration
8
#include   <stdint.h>      //Eingabe Bib
9
#include   <avr/io.h>
10
#include   <avr/interrupt.h>  //Interruptbibliothek
11
#include   <util/delay.h>    //Bibliothek für delay-Befehl
12
13
//CPU Clcok auf 6 MHz definieren
14
#ifndef F_CPU
15
#define F_CPU           6000000                   // processor clock frequency
16
#endif
17
18
19
//Zuweisen der Pins am Mikrocontroller zu den LED-Farben und Definition
20
//der Befehle zu Beschaltungen
21
#define LED_RED_ON  PORTB   |=  (1<<3)  //3
22
#define LED_RED_OFF PORTB   &=~ (1<<3)  //3
23
#define LED_RED_TOG PORTB   ^=  (1<<3)  //3
24
25
#define LED_GRN_ON  PORTB   |=  (1<<2)  //2
26
#define LED_GRN_OFF PORTB   &=~ (1<<2)  //2
27
#define LED_GRN_TOG PORTB   ^=  (1<<2)  //2
28
29
#define LED_BLU_ON  PORTB   |=  (1<<1)  //1
30
#define LED_BLU_OFF PORTB   &=~ (1<<1)  //1
31
#define LED_BLU_TOG PORTB   ^=  (1<<1)  //1
32
33
//Prototypen
34
void timer1_init(void);
35
36
//Entprellfunktion (nicht von mir, unverändert und funktioniert)
37
#define debounce( port, pin )            \
38
({                  \
39
  static uint8_t flag = 0;  /* new variable on every macro usage */  \
40
  uint8_t i = 0;              \
41
                  \
42
  if( flag ){      /* check for key release: */    \
43
    for(;;){      /* loop ... */        \
44
      if( !(port & 1<<pin) ){  /* ... until key pressed or ... */  \
45
  i = 0;      /* 0 = bounce */      \
46
  break;                \
47
      }                  \
48
      _delay_us( 98 );    /* * 256 = 25ms */      \
49
      if( --i == 0 ){    /* ... until key >25ms released */  \
50
  flag = 0;    /* clear press flag */      \
51
  i = 0;      /* 0 = key release debounced */    \
52
  break;                \
53
      }                  \
54
    }                  \
55
  }else{      /* else check for key press: */    \
56
    for(;;){      /* loop ... */        \
57
      if( (port & 1<<pin) ){  /* ... until key released or ... */  \
58
  i = 0;      /* 0 = bounce */      \
59
  break;                \
60
      }                  \
61
      _delay_us( 98 );    /* * 256 = 25ms */      \
62
      if( --i == 0 ){    /* ... until key >25ms pressed */  \
63
  flag = 1;    /* set press flag */      \
64
  i = 1;      /* 1 = key press debounced */    \
65
  break;                \
66
      }                  \
67
    }                  \
68
  }                  \
69
  i;        /* return value of Macro */    \
70
})
71
72
// ISR fuer OCR1A (Bei 20 ms Soll port C high gesetzt werden)
73
ISR (TIMER1_COMPA_vect)
74
{
75
PORTC = 1;
76
LED_BLU_ON;
77
}
78
79
//ISR Für OCR1B (Nach der Impulsdauer soll Port C wieder low werden)
80
ISR (TIMER1_COMPB_vect)
81
{
82
PORTC = 0;
83
LED_BLU_OFF;
84
}
85
86
//Hauptfunktion mit wesentlichen Definitionen und Programmaufrufen
87
int  main(int ac, char *av[])
88
{
89
  // Definiere Port B 1-3 als Ausgang, für die LEDs als Feedback
90
  DDRB |= (1<<1);
91
  DDRB |= (1<<2);
92
  DDRB |= (1<<3);
93
94
  // Definiere Port C 0, 1, 2 als Ausgang
95
  DDRB |= (1<<0);
96
  DDRB |= (1<<1);
97
  DDRB |= (1<<2);
98
99
  // Ports für Schalter als Eingang definieren
100
  DDRD &= ~ (1<< 2);
101
  DDRD &= ~ (1<< 3);
102
  
103
  // Möglichkeit, Farben zu beginn leuchten zu lassen
104
  LED_RED_OFF;
105
  LED_GRN_OFF;
106
  LED_BLU_OFF;
107
  
108
109
  //Timer auflösung von 0 bis 20 ms (750 000 Hz (Presclaer 8)) (15000 Takte)
110
  OCR1A = 14999;
111
112
  //Initialisierung des Timers (1)
113
  timer1_init();
114
  
115
  //Interupts aktiviren
116
  sei();  
117
118
  //Startposition (sollte 1,5ms sein)
119
  OCR1B = 1125;
120
121
  //Endlos Schleife (for)
122
   for(;;)
123
  {
124
  if( debounce( PIND, PD2 ) )
125
       {
126
     OCR1B=750; // entspricht 1 ms Impulsbreite
127
     LED_RED_ON;
128
     LED_GRN_OFF;
129
     }
130
   if( debounce( PIND, PD3 ) )
131
       {
132
    OCR1B=1500;  //entspricht 2 ms Impulsbreite
133
    LED_RED_OFF;
134
    LED_GRN_ON;
135
    }
136
  }
137
}
138
139
140
//Funktion zu Einstellung von Timer1
141
void timer1_init(void)
142
{
143
  //Timer1 aktivieren und für Compare Mode einstellen:
144
  TCCR1B |= (0<<CS10);
145
  TCCR1B |= (1<<CS11);
146
  TCCR1B |= (0<<CS12);    //Prescaler 8 Daraus ergitb sich ein Timer-Takt von 750000Hz
147
  TCCR1B |= (0<<WGM13);
148
  TCCR1B |= (1<<WGM12);    // Beide Zeilen: CTC Modus 4 (Top OCR1A)
149
  TIMSK |= (1<<OCIE1A);    // Outpunt A Match (TOP Value)
150
  TIMSK |= (1<<OCIE1B);    // Outpunt B Match (TOP Value)
151
}