Hallo Forum!
Forumsuche/Google/andere Foren, haben mich statt weiter zu bringen,
relativ durcheinander gebracht, deswegen habe ich mich entschlossen,
diesen Fall personalisiert zu schildern.
Ich möchte mit einem Attiny2313 einen 6-Kanal digitalen Empfänger eines
Modellflugzeuges auswerten, dann einige Servos ansprechen.
Hier mein Code:
1 | #define F_CPU 1000000UL
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | volatile uint8_t Pulsdauer = 0;
|
7 |
|
8 |
|
9 |
|
10 | SIGNAL(SIG_INTERRUPT0)
|
11 | {
|
12 | if( MCUCR == 0x03) // Testen auf steigende Flanke
|
13 | {
|
14 | steigende_Flanke();
|
15 | return;
|
16 | }
|
17 |
|
18 | if( MCUCR == 0x02) // Testen auf fallende Flanke
|
19 | {
|
20 | fallende_Flanke();
|
21 | return;
|
22 | }
|
23 | }
|
24 | void (steigende_Flanke)(void)
|
25 | {
|
26 | TCNT0 = 0; // Timer Reset
|
27 | TCCR0A = 0b00000101; //
|
28 | MCUCR = 0x02; // INT0 fallende Flanke
|
29 | }
|
30 | void (fallende_Flanke)(void)
|
31 | {
|
32 | TCCR0B = 0b00000000; // Timer2 Stoppen
|
33 | Pulsdauer = TCNT0; // Timer Wert = Pulsdauer
|
34 | MCUCR = 0x03; // INT0 auf steigende Flanke
|
35 | }
|
36 |
|
37 | int main(void) {
|
38 |
|
39 | DDRB=0b11111111;
|
40 |
|
41 | //PD2 Int0 für RC Signal
|
42 | PORTD = 0b11111111; // Pull up on PD2
|
43 | DDRD = 0b00000000; // PD2 in Rest out
|
44 |
|
45 | //Int0 steigende Flanke / INT0 enable
|
46 | MCUCR = (1<<ISC01 | 1<<ISC00);
|
47 | GIMSK = (1<<INT0);
|
48 |
|
49 | sei();
|
50 |
|
51 | while(1)
|
52 | {
|
53 |
|
54 | if (Pulsdauer >=1 && Pulsdauer <= 60){ //AUSGESCHALTET
|
55 | int i;
|
56 | i=0;
|
57 | while(i<=5){
|
58 | i++;
|
59 | PORTB=0b11111111;
|
60 | _delay_us(1100);
|
61 | PORTB=0b00000000;
|
62 | _delay_ms(15);
|
63 | }
|
64 | }
|
65 |
|
66 | else if (Pulsdauer >= 61 && Pulsdauer < 85){
|
67 | int i;
|
68 | i=0;
|
69 | while(i<=5){
|
70 | i++;
|
71 | PORTB=0b11111111;
|
72 | _delay_us(1400);
|
73 | PORTB=0b00000000;
|
74 | _delay_ms(15);
|
75 | }
|
76 | }
|
77 |
|
78 | else if (Pulsdauer >= 85 && Pulsdauer < 110){
|
79 | int i;
|
80 | i=0;
|
81 | while(i<=5){
|
82 | i++;
|
83 | PORTB=0b11111111;
|
84 | _delay_us(1600);
|
85 | PORTB=0b00000000;
|
86 | _delay_ms(15);
|
87 | }
|
88 | }
|
89 |
|
90 | else if (Pulsdauer >= 110 ){
|
91 | int i;
|
92 | i=0;
|
93 | while(i<=5){
|
94 | i++;
|
95 | PORTB=0b11111111;
|
96 | _delay_us(1800);
|
97 | PORTB=0b00000000;
|
98 | _delay_ms(15);
|
99 |
|
100 | }
|
101 | }
|
102 | }
|
103 | }
|
Signal vom Servo unter Int0
an PORTD sind momentan Servos angeschlossen, diese funktionieren auch.
Da die Variable "Pulsdauer"- immer auf 0 steht vermute ich, dass ich
komplett falsch liege, was die Umrechnung des Taktes angeht. der µc
läuft auf 1MHz.
Ich danke für die Fallbezogene Hilfe, denn jetzt habe ich den Überblick
über die Taktzahl verlohren. Ich bitte, wenn möglich, um Rechenbeispiel.
Nette Grüße aus Stuttgart
Robert