-         

Ergebnis 1 bis 5 von 5

Thema: ppm dekodierung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.05.2004
    Beiträge
    79

    ppm dekodierung

    Anzeige

    ich habe ein problem mit der dekodierung des ppm signals eines rc-empfängers.

    ich hab soviel rausbekommen: sobald ich das TCCR2 register des timer2 schreibe, wird irgendwie der externe interrupt int0 nichtmehr ausgelößt und der usart des atmega32 fängt an zu spinne . mein controller läuft auf 8mhz. wenn ich dann vor dem schreibevorgang das register lösche und hinterher wieder schreibe funktioniert der usart wieder einwandfrei...
    keine ahnung warum. eigendlich dürfte das doch garnicht miteinander zusammenhängen oder?

    dadurch, dass int0 nicht ausgelößt wird, wenn der timer2 läuft, kann ich leider auch nicht testen ob der rest des programms tut.

    wäre wirklich schön wenn mir da jemand weiterhelfen könnte! im datenblatt des atmega32 hab ich keine hinweise darauf gefunden wie das zusammenhängen könnte.

    hier mein code:
    Code:
    #include "global.h"
    #include <avr/io.h>
    #include "ppm.h"
    #include <avr/interrupt.h>
    
    uint8 servopos[7];
    word overflow = 0;
    uint8 counter =0;
    
    void decode(void)
    {
     overflow= overflow+TCNT2;
    if (overflow < 500){ 
     servopos[counter] = overflow-250;
     overflow=0;
     counter++;
    }
    else {
     counter=0;
     overflow=0;
     TCNT2=0;
    }
    }
    
    
    void ppm_init(void)
    {
     GICR |= (1<<INT0);
     MCUCR |= (1<<ISC00) | (1<<ISC01);
    
      TCCR2 |= (1<<CS20)|(1<<CS21); 
      TIMSK |= (1<<TOIE2);  
    sei();
    }
    
    ISR(INT0_vect){
     decode();
    
    }
     
    ISR( TIMER0_OVF_vect )
    {
     overflow=overflow+256;
    }
    
    
    uint8 get_pos(uint8 servo)
    {
     return servopos[servo];
    }
    danke schonmal für jegliche hilfe!!

    mfg Ford

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    ...decode(); ....


    ist schwachsin in eine int noch eine sub reinsetzen.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.05.2004
    Beiträge
    79
    ich hab das gemacht weil ich gelesen hab, dass die service routinen nich zu lang werden dürfen. aber das eigendliche problem ist das je nicht.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,
    die ISR soll möglichst schnell beendet werden, damit es nicht zu einer Überschneidung beim Ausführen und neuem Eintreten eines Interrupts kommt. Ob du die Anweisungen in eine neue Funktion schreibst oder nicht, die ISR wurde noch nicht beendet.

    Zu deinem Code. Du setzt das Interruptflag für Timer 2. Wo ist die ISR für Timer 2?

    Gruß

    Jens

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.05.2004
    Beiträge
    79
    ah ok, dann weis ich das jetzt auch...

    inzwischen tuts schon!, danke trotzdem für eure antworten.
    hab mich heute morgen dranngehockt und das mit der isr vom timer auch gemerkt ^^ naja war gestern abend warscheinlich n bischen übermüdet. schnell vorm schlafen gehn noch was zusammenklopfen geht dann wohl doch in den seltensten fällen gut...

    mfg Ford!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •