Orange RX mit Atmega8 auslesen

OP #3808096
Lesenswert?
• ▲
▼
Hey Leute, ich habe mir einen Orange RX Fasst 2.4ghz Empfänger gekauft 
und würde gerne diesen mit einem Atmega 8 auslesen, sprich die einzelnen 
Kanäle um dann per PWM verschiedene Motoren anzusteuern.

Am ende soll ein Quadcopter damit gesteuert werden, aber leider 
scheitere ich ja schon beim Einlesen vom Steuersignal.
OP #3808109
Lesenswert?
• ▲
▼
Die Konkrete frage ist, wie kann ich das signal nun am Besten auslesen.
Ich hab versucht die Steigende Flanke einzulesen, die Zeit mitzuzählen 
bis die Flanke wieder fällt, aber irgendwas stimmt da nicht.

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

volatile int flanke=0;
volatile int aktuell_pwm_l=0;
volatile int aktuell_pwm_h=0;

ISR(TIMER1_CAPT_vect)
{
  if (flanke==0)
  {
    TCNT1H = 0;
    TCNT1L = 0;
    TCCR1B&= ~(1<<ICES1);
    flanke=1;
  }
  else
  {
    flanke=0;
    TCCR1B|=(1<<ICES1);
    aktuell_pwm_l=ICR1L;
    aktuell_pwm_h=ICR1H;
  }
}

void init_prozedur(void)
{
  TCCR1B |= (1<<WGM12) | (1<<ICNC1)|(1<<ICES1)|(1<<CS11) | (1<<CS10);
  TIMSK |= (1<<TICIE1);

  sei();
}

int main (void)
{
  init_prozedur();

  DDRB = (1<<PB0);
  TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);

  while(1)
  {
    if (aktuell_pwm_l >= 120 && aktuell_pwm_l < 125)
    {
      PORTB = (1<<PB0);
    }
  }
}
OP #3809284
Lesenswert?
• ▲
▼
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include "lcd_routines.h"
5

6
#define F_CPU 3686400UL
7

8

9

10
volatile int flanke=0;
11
volatile int aktuell_pwm_l=0;
12
volatile int aktuell_pwm_h=0;
13

14
ISR(TIMER1_CAPT_vect)
15
{
16
  if (flanke==0)
17
  {
18
    TCNT1H = 0;             //Timer auf null zurück
19
    TCNT1L = 0;
20
    TCCR1B&= ~(1<<ICES1); //ICP-Pin auf fallende Flanke einstellen
21
    flanke=1;
22
  }
23
  else
24
  {
25
    flanke=0;
26
    TCCR1B|=(1<<ICES1);    //ICP auf steigende Flanke wieder aktivieren
27
    aktuell_pwm_l=ICR1L;    //Zählerstand speichern
28
    aktuell_pwm_h=ICR1H;    //zählerstand speichern
29
  }
30
}
31

32
void init_prozedur(void)
33
{
34
  TCCR1B |=  (1<<ICNC1)|(1<<ICES1)|(1<<CS11) | (1<<CS10); //vorteiler 64, Mittelung ON, steigende flanke
35
  TIMSK |= (1<<TICIE1);//INTERRUPT ON
36

37
  sei();
38
}
39

40
int main (void)
41
{
42
  lcd_init();
43
  init_prozedur();
44
  DDRC=0xff;
45
  DDRB=0b11110000;
46
   DDRB |= (1 << DDB3);
47
  while(1)
48
  {
49
    lcd_setcursor(1,0);
50
    lcd_string("ADC=");
51
    lcd_setcursor(1,4);        // Cursor positionieren
52
    lcd_string("    ");    // alte Zahl loeschen
53

54
    lcd_setcursor(1,4);        // Cursor positionieren
55
    lcd_write_zahl(aktuell_pwm_l);
56

57
    TCCR2 |= (1 << COM21);
58
    // set none-inverting mode
59

60
    TCCR2 |= (1 << WGM21) | (1 << WGM20);
61
    // set fast PWM Mode
62

63
    TCCR2 |= (1 << CS21);
64
    // set prescaler to 8 and starts PWM
65

66
    if (aktuell_pwm_l >= 0 && aktuell_pwm_l < 19)
67
    {  
68
      OCR2 = 10;
69
    }
70
    if (aktuell_pwm_l >= 19 && aktuell_pwm_l < 21)
71
    {
72
    OCR2 = 150;
73
    }
74
    if (aktuell_pwm_l >= 21 && aktuell_pwm_l < 23)
75
    {
76
      OCR2 =180;
77
    }
78
    if (aktuell_pwm_l >= 23 && aktuell_pwm_l < 25)
79
    {
80
      OCR2 = 210;
81
    }
82
      if (aktuell_pwm_l >= 25 && aktuell_pwm_l < 28)
83
    {
84
      OCR2 = 235;
85
    }
86
      if (aktuell_pwm_l >= 28 && aktuell_pwm_l < 35)
87
    {
88
      OCR2 = 256;
89
    }
90

91
    
92
    
93
    
94
  }
95
}

Das wart dann mein finaler Code :)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.