Attiny2313 - RC-Empfänger auswerten

Gast #2768992
Lesenswert?

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
Gast #2772942
Lesenswert?

Um zu prüfen, ob der µC wirklich mit 1MHz läuft, kann man eine LED 
langsam über delays blinken lassen und die Zeiten mit einer normalen Uhr 
überprüfen. Wenn die Taktfrequenz sicher ist, läßt sich der Rest im 
Simulator von AVR-Studio kontrollieren, indem man per 
Breakpoint/SingleStep durch's Programm geht und sich die eingebaute 
Stopuhr und die entsprechenden µC-Register dazu anguckt.
#2772957
Lesenswert?

Danke für die Antwort !
Taktfrequenz passt mit 1mhz , sonst würde der servo nicht tun , was er 
sollte.
Ich werde den Simulator laufen lassen. Mal schauen was ich dabei 
rausbekomme.

Kann mir trotzdem jemand noch ein rechenbeispiel für den Timer geben , 
ich würde gerne unter 1mhz uc Takt 1000-2000 us zählen ...

Lasse ich dann den Timer 1/1024 oder 1/1 laufen ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren