ATmega8 Summensignal auswerten

Gast #1749086
Lesenswert?

Hallo Zusammen,
ich bin verzweifelt auf der Suche nach einer Lösung meines Problems. Ich 
habe schon seit Tagen etliche Beiträge und Quellcodes durchgearbeitet 
jedoch ohne Erfolg. Ich bin ziemlicher Anfänder in Programmierung von 
MC`s mit C.
Zu meinem Problem:
Ich benutze das Board myAVR Board MK2 USB mit nem ATmega8.
Es soll mit diesem boa ein RC Summensignal mit 4 Kanälen ausgewertet 
werden.
Das Summesignal, wie im Bild dargestellt beinhaltet 8 Kanäle, wovon ich 
nur 4 auswerten möchte.
Meine Überlegungen: Ich lege das Signal an PB0(ICP1) an und warte auf 
Interrupt bei steigender (oder fallender) Flanke. Dann wird ein Timer 
gestartet und der Wert, bis zur nächsten steigenden Flanke in Variable 
gespeichert....
Kann mir jemand bei dem Quellcode helfen, in der Variablen sollen 
nachher die Kanäle mit unterschiedlichen Zeiten stehen.
Somit habe ich die einzelnen Kanäle des Summensignals ausgewertet.
So sind zumindest meine Überlegungen.

Hoffe ihr könnt mir bei dem Thema helfen.
Gruß
Markus
Angehängte Dateien:
Moderator Persönliche Seite #1749323
Lesenswert?

Markus schrieb:
> Dann wird ein Timer
> gestartet und der Wert, bis zur nächsten steigenden Flanke in Variable
> gespeichert....

Darin liegt dein Denkfehler.  Den Timer startest du bereits davor,
und der input capture interrupt liest den aktuellen Timerwert in
sein Register.  Wenn man von diesem den vorherigen ICP-Wert abzieht
(uint16_t Rechnung, dann darf man auch bei einfachem Zählerüberlauf
dazwischen direkt subtrahieren), dann hat man die Länge des Impulses
(bzw. der Impulspause) in Zähler"ticks".

Ansonsten ist das Thema schon ausreichend oft diskutiert worden hier,
benutze mal die Suche.
Gast #1754301
Lesenswert?

Danke Jörg für deine Antwort,
habe nun mit der Suchfunktion und einigen Artikeln dieses Programm:
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#define F_CPU 16000000UL     // Quarz mit 16 Mhz
#include <util/delay.h>

volatile uint8_t ikanal=10,ipuls=0, isumme[9];
volatile uint16_t icnt=0;

ISR(TIMER1_CAPT_vect)
  {
    uint16_t icnt_tmp = ICR1;
      uint16_t izeit = icnt_tmp-icnt;

    if(ikanal<9)
       isumme[ikanal++] = izeit;

      if(izeit>156)
      ikanal=0;

    icnt = icnt_tmp;
  }

void RC_ICP_init(void)
  {
      TIMSK |= (1<<TICIE1);      // Capture Interrupt enable
      TCCR1B |= (1<<CS12) | (1<<ICES1);  // Prescaler 256 Timer 1, 
Steigende Flanke Capture
   }


int main(void)

{

    DDRB &= ~(1 << PB0);   // PB0 Input ICP
    PORTB |= (1<<PB0);     // Pull up on PB0
    DDRC = 0xff;         // PORT A komplett Output


    RC_ICP_init(); // ICP Init
    sei();  // Globale Interrupts erlauben



for(;;)

  {

       if( ikanal < 9 )     // gibts gültige Werte?
      {
          if( (isumme[8] < 92) || (isumme[8] >102))
              PORTC |= (1 << PC0);
           else
              PORTC &= ~( 1 << PC0 );

          if( (isumme[1] < 92) || (isumme[1] >102) )
              PORTC |= (1 << PC1);
           else
              PORTC &= ~( 1 << PC1 );

          if( (isumme[2] < 92) || (isumme[2] >102))
        PORTC |= (1 << PC2);
           else
        PORTC &= ~( 1 << PC2 );

          if( (isumme[3] < 92) || (isumme[3] >102) )
        PORTC |= (1 << PC3);
           else
        PORTC &= ~( 1 << PC3 );

          if( (isumme[4] < 92) || (isumme[4] >102))
        PORTC |= (1 << PC4);
           else
        PORTC &= ~( 1 << PC4 );

          if( (isumme[5] < 92) || (isumme[5] >102) )
        PORTC |= (1 << PC5);
           else
        PORTC &= ~( 1 << PC5 );

    }

  }

}

Das Programm soll aber auf einem myAVR Board MK2 USB mit nem ATmega8 
laufen.
Die Quarz Angabe oben #define F_CPU 16000000UL     // Quarz mit 16 Mhz 
ist die auf den Empfängerquarz bezogen?
Mein Empfänger ist ein Graupner R700 35MHz. Wenn ich den Code nun teste, 
leuchten, bzw. Blinken bei mir alle LED`s gleichzeitig. Ohne dass ich
einen Stick der Fernbedienung bewege!

Könnt ihr mir diesbezüglich helfen.

Danke im voraus
Markus
Gast #1754374
Lesenswert?

Hallo Ed,
die den Quellcode von Ulrich Radig habe ich mir auch schon mehrfach 
angesehen, jedoch blicke ich nicht durch und kann es auf mein Problem 
nicht umschreiben.
Vielleicht kann mir jemand erklären, wie ich auf die Zahlenwerte komme.
if(izeit>156) 156??

if( (isumme[8] < 92) || (isumme[8] >102))  92??  und 102???
vielleicht muss ich diese für mein PPM Signal(Bild im Anhang) nur 
anpassen!
#1754477
Lesenswert?

Hallo Zusammen,
benötige dringend den Quellcode in C zum Einlesen eines Summensignals 
(Bild im Anhang).
Ich muss die ersten 4 Kanäle einlesen.
Schalterstellung zuvor erklärt. Arbeite mit myAVR Board MK2 USB mit nem 
ATmega8 der Empfänger der Funke ist ein Graupner R700 35MHz.
Hoffe jemand kann mir den Code zur Verfügung stellen!

Danke im voraus
Markus
Gast #1754489
Lesenswert?

Markus Lisges schrieb:
> Hallo Zusammen,
> benötige dringend den Quellcode in C zum Einlesen eines Summensignals

Wenn man schon fremde Threads kapert, sollte man die zumindest mal 
vorher lesen.

Ed schrieb:
> ich habe mal die Software von Ulrich Radig genutzt. Hat super
> funktioniert. Ist frei bei privater Nutzung.
> http://www.ulrichradig.de/home/index.php/avr/avr_-_rc

Markus Lisges schrieb:
> (Bild im Anhang)

Kein Bild.

Oliver

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