Orange RX mit Atmega8 auslesen

#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.
#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);
    }
  }
}
#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

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