ViertelKurve.ino


1
float p;
2
//int p;
3
int m;
4
int n;
5
int plot;
6
int val;
7
int l;
8
9
//Sinussignal
10
signed char S[400]=
11
{0,0,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,12,12,12,13,13,14,14,14,15,15,15,16,16,17,17,17,18,
12
18,19,19,19,20,20,20,21,21,22,22,22,23,23,23,24,24,25,25,25,26,26,26,27,27,28,28,28,29,29,29,30,30,31,31,31,32,32,32,
13
33,33,34,34,34,35,35,35,36,36,36,37,37,38,38,38,39,39,39,40,40,40,41,41,41,42,42,43,43,43,44,44,44,45,45,45,46,46,46,
14
47,47,47,48,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,56,56,56,57,57,57,58,58,58,59,59,59,
15
59,60,60,60,61,61,61,62,62,62,63,63,63,63,64,64,64,65,65,65,65,66,66,66,67,67,67,67,68,68,68,69,69,69,69,70,70,70,71,
16
71,71,71,72,72,72,72,73,73,73,73,74,74,74,75,75,75,75,76,76,76,76,77,77,77,77,78,78,78,78,78,79,79,79,79,80,80,80,80,
17
81,81,81,81,81,82,82,82,82,83,83,83,83,83,84,84,84,84,84,85,85,85,85,85,86,86,86,86,86,87,87,87,87,87,87,88,88,88,88,
18
88,89,89,89,89,89,89,90,90,90,90,90,90,91,91,91,91,91,91,91,92,92,92,92,92,92,92,93,93,93,93,93,93,93,94,94,94,94,94,
19
94,94,94,95,95,95,95,95,95,95,95,95,95,96,96,96,96,96,96,96,96,96,96,97,97,97,97,97,97,97,97,97,97,97,97,97,98,98,98,
20
98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,
21
99,99};
22
23
//Dreiecksignal
24
int D[16]={0,137,275,412,550,412,275,137,0,-137,-275,-412,-550,-412,-275,-137};
25
//int D[8]={0,275,550,275,0,-275,-550,-275}; //10kHz
26
27
28
void setup(){
29
pinMode(5,OUTPUT);
30
pinMode(6,OUTPUT);
31
pinMode(A0,INPUT);
32
33
//Timer1 instalisieren
34
TCCR1A = 0;                     //Register definiert zurücksetzten
35
TCCR1B = 0;                     //zuerst Register definiert zurücksetzen
36
TCNT1 = 0;                      //Zählerwert zurücksetzten
37
38
OCR1A = 199;                    //Timer1 80kHZ einstellen
39
TCCR1B |= (1 << WGM12);         //CTC mode
40
//TCCR1B |= (0 << CS12) | (0 << CS11) | (1 >> CS10); //kein Prescale
41
TCCR1B |= (1 << CS10);          // clk/1 prescale 1024
42
TIMSK1 |= (1 << OCIE1A);        //Aktivieren des Timer-Vergleichs-Interrupt
43
}
44
45
ISR(TIMER1_COMPA_vect){         //Interrupt
46
47
//Signalvergleich Sinus Positiv
48
if(l<800) {
49
  if (D[n] < val*S[m]) {          //Dreiecksignal kleiner als Sinussignal
50
  bitSet(PORTC, 6);               //Pin 5 HIGH
51
  }
52
  else {                          //Dreiecksignal größer als Sinussignal
53
  bitClear(PORTC, 6);             //Pin 5 LOW
54
  }
55
  if (D[n] < val*S[m]) {          //Dreiecksignal kleiner als Sinussignal
56
  bitSet(PORTD, 7);               //Pin 6 HIGH
57
  }
58
  else {                          //Dreiecksignal größer als Sinussignal
59
  bitClear(PORTD, 7);             //Pin 6 LOW
60
  }
61
}
62
63
//Signalvergleich Sinus Negativ
64
if(l>800) {
65
  if (D[n] < val*-S[m]) {          //Dreiecksignal kleiner als Sinussignal
66
  bitSet(PORTC, 6);               //Pin 5 HIGH
67
  }
68
  else {                          //Dreiecksignal größer als Sinussignal
69
  bitClear(PORTC, 6);             //Pin 5 LOW
70
  }
71
  if (D[n] < val*-S[m]) {          //Dreiecksignal kleiner als Sinussignal
72
  bitSet(PORTD, 7);               //Pin 6 HIGH
73
  }
74
  else {                          //Dreiecksignal größer als Sinussignal
75
  bitClear(PORTD, 7);             //Pin 6 LOW
76
  }
77
}
78
79
//Sinusarray hochrechnen
80
l=l+1;
81
82
if(l<400){
83
m=m+1;
84
}
85
86
if(l>400 && l<800){
87
m=m-1;
88
}
89
90
if(l>800 && l<1200){
91
m=m+1;
92
}
93
94
if(l>1200 && l<1600){
95
m=m-1;
96
}
97
98
if(l>1599){
99
l=0;
100
m=0;
101
}
102
103
//Dreieckarray hochrechnen
104
n=n+1;
105
if(n>15)
106
n=0;
107
}
108
109
void loop() {
110
p = analogRead(A0);             //Potiwert 0 bis 10kΩ einlesemn
111
plot = map(p, 0, +500, 1, 5);   //Potiwert in 0 bis 500 in 1 bis 5 wandeln
112
//
113
delay(300);
114
val=plot;                       //Werte von 1 bis 5
115
}