Forum: Projekte & Code Attiny2313 - RC-Empfänger auswerten


von Robert St. (Gast)


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

von Michael (Gast)


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.

von Robert S. (p1337)


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 ?

von Robert S. (p1337)


Lesenswert?

Jedes mal wenn ich Build an Run drücke, stürzt AVR-Studio ab.
Kennt Jemand dieses Problem.

EDIT: Admin, bitte Beitrag aus dem Codeschnippsel bereich verschieben, 
weiß nicht was mich geritten hat hier zu schreiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.