www.mikrocontroller.net

Forum: Compiler & IDEs ATmega8 Summensignal auswerten


Autor: Markus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ed (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Markus (Gast)
Datum:

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

Autor: Markus --- (markus21)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.