Forum: Compiler & IDEs ATmega8 Summensignal auswerten


von Markus (Gast)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Markus (Gast)


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

von Ed (Gast)


Lesenswert?

Hi,

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

Mfg Ed

von Markus (Gast)


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!

von Markus (Gast)


Lesenswert?

Mein PPM-Signal:
Schalter min --> Signal 1ms
Schlater neutral --> Signal 1,5ms
Schalter max Stellung --> Signal 2ms

von Markus -. (markus21)


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

von Oliver (Gast)


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

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.