1 | /*
|
2 | * 20201217_servo_V1.0.c
|
3 | *
|
4 | * Created: 17.12.2020 08:01:03
|
5 | * Author : pete
|
6 | */
|
7 |
|
8 | #define F_CPU 8000000UL
|
9 | #include <avr/io.h>
|
10 | #include <avr/interrupt.h>
|
11 | #include <util/delay.h>
|
12 | #include <stdio.h>
|
13 |
|
14 | volatile uint16_t T1Ovs1, T1Ovs2; //Counts overflovs
|
15 | volatile uint16_t Capt1, Capt2;
|
16 | volatile uint16_t Capt3; //Variables holding three timestamps
|
17 | volatile uint16_t Flag; //capture Flag
|
18 | uint16_t high_zeit = 0;
|
19 |
|
20 | void InitTimer1(void) //Timer initialisieren
|
21 | {
|
22 | TCCR1B|=(1<<ICES1); //steigende Flanke erfassen
|
23 | TCNT1=0; //Timer mit 0 initialisieren
|
24 | TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //Input Capture und Überlauf Interrupts erlauben
|
25 | }
|
26 | void StartTimer1(void)
|
27 | {
|
28 | TCCR1B|=(1<<CS10); //Timer starten ohne Prescaler
|
29 | sei(); //globale Interrupts erlauben
|
30 | }
|
31 |
|
32 | ISR(TIMER1_CAPT_vect) //capture ISR
|
33 | {
|
34 | volatile uint16_t a=Capt1;
|
35 | volatile uint16_t b=Capt2;
|
36 | //volatile uint16_t c=Capt3;
|
37 | if (Flag==0)
|
38 | {
|
39 | TCCR1B&=~(1<<ICES1); //erfassen der fallenden Flanke
|
40 | Capt1=ICR1; //Zeitstempel speichern
|
41 | T1Ovs2=0; //Überlauf auf 0 setzen
|
42 | }
|
43 |
|
44 | if (Flag==1)
|
45 | {
|
46 | TCCR1B|=(1<<ICES1); //erfassen der steigenden Flanke
|
47 | Capt2=ICR1; //Zeitstempel speichern
|
48 | T1Ovs1=T1Ovs2; //erster Überlauf Zähler
|
49 | }
|
50 |
|
51 | if (Flag==2)
|
52 | {
|
53 | Capt3=ICR1; //Zeitstempel speichern
|
54 | TIMSK1&=~((1<<ICIE1)|(1<<TOIE1)); //Input Capture und Überlauf Interrupts stoppen
|
55 | high_zeit = (b + T1Ovs1*0x400L) - a; //0x400 entspricht 10-Bit
|
56 | }
|
57 |
|
58 |
|
59 | Flag++; //Flag Zähler
|
60 | }
|
61 |
|
62 | ISR(TIMER1_OVF_vect) //Überlauf Service Routine
|
63 | {
|
64 | T1Ovs2++; //Überlauf Zähler
|
65 | }
|
66 |
|
67 |
|
68 |
|
69 | int main(void)
|
70 | {
|
71 | InitTimer1();
|
72 | StartTimer1();
|
73 |
|
74 | DDRD |= (1<<DDD5);
|
75 | TCCR0A = (1<<WGM00) | (1<<WGM01) | (1<<COM0B1);
|
76 | TCCR0B = (1<<CS00) | (1<<WGM02);
|
77 | OCR0A = 79999;
|
78 | OCR0B = 6000;
|
79 |
|
80 |
|
81 | DDRB |= (1<<DDB2);
|
82 | TCCR1A |= (1<<WGM10) | (1<<WGM11) | (1<<COM1B1); //gesetzt sind WGM 10, WGM11 und COM1B1
|
83 | TCCR1B |= (1<<CS10) | (1<<WGM12) | (1<<WGM13); //gesetzt sind CS10, WGM12 und WGM13
|
84 | OCR1A = 79999;
|
85 | OCR1B = 6000; //Mittelstellung?
|
86 |
|
87 | DDRD |= (1<<PD5);
|
88 | DDRB |= (1<<PB2);
|
89 |
|
90 |
|
91 |
|
92 | while(1)
|
93 | {
|
94 | if (Flag==3) //alle Timestamps erfasst?
|
95 | {
|
96 |
|
97 | Flag=0; //Flag löschen bzw. 0 setzen
|
98 | T1Ovs1=0; //Überlaufzähler löschen bzw. 0 setzen;
|
99 | T1Ovs2=0; //Überlaufzähler löschen bzw. 0 setzen
|
100 | TIFR1=(1<<ICF1)|(1<<TOV1); //clear interrupt flags to avoid any pending interrupts
|
101 | TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //enable input capture and overflow interrupts
|
102 |
|
103 | Flag=0; //Flag löschen bzw. 0 setzen
|
104 |
|
105 | T1Ovs1=0; //Überlaufzähler löschen bzw. 0 setzen;
|
106 | T1Ovs2=0; //Überlaufzähler löschen bzw. 0 setzen
|
107 |
|
108 | TIFR1=(1<<ICF1)|(1<<TOV1); //clear interrupt flags to avoid any pending interrupts
|
109 |
|
110 | TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //enable input capture and overflow interrupts
|
111 | }
|
112 | }
|
113 | }
|