-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 37

Thema: RC-Kanal einlesen, Code in C

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53

    RC-Kanal einlesen, Code in C

    Anzeige

    Hallo,
    nach dem Vorlageprogramm in Bascom habe ich mal ein C-Programm geschrieben, um einen RC-Kanal einzulesen und je nach Signal einen Pin zu schalten (hier PA2).

    Irgendwie tut sich jedoch nichts, vielleicht könnt ihr mal drüberschauen?

    Den Timer habe ich mit Prescale 8 gestartet, sodass er im 2ms-Abtastzeitraum von 0-250 laufen sollte, was den 8bit-Bereich ja ziemlich gut ausnutzt.


    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    ISR(INT0_vect)
    {
        int reading;
        int rc_value;
        
        if(reading == 0)
        {
            TCNT0 = 0;
            reading = 1;
        }
        else
        {
           rc_value = TCNT0;
           TCNT0 = 0;
           reading = 0;
           if(rc_value > 128)
           {
                PORTA = (0<<PA2);
           }
           else
           {
                PORTA = (1<<PA2);
           }
        }
    }
    
    int main(void)
    {
        DDRA = 0xFF;
        PORTA = 0xFF;
        DDRB = 0x00;
        
        int reading = 0;
        int rc_value = 0;
        
        TCCR0B = (1<<CS01);
        MCUCR = (1<<ISC00);
        sei();
       
        while(1)
        {
        }  
    }

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    ISR(INT0_vect)
    {
        int reading;
        int rc_value;
      
    // An dieser Stelle hat reading immer einen eher zufälligen Inhalt.
    
        if(reading == 0)
    ...
    int reading;
    ->
    static int reading;

    Wozu sollen reading und rc_value in main gut sein?
    Ich glaube, du hast bei Variablen noch ein Verständnisproblem global <-> lokal.

    Außerdem bekommst du doch garantiert eine "is used uninitialized in this function"-Warnung. Warnungen sollte man nicht einfach ignorieren, und bei Fragen im Forum auch mitposten.
    MfG
    Stefan

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    ah ok, das mit dem Static wusste ich nicht. Mich hat das schon ein bisschen verwirrt und ich hab mich die ganze Zeit gefragt, ob nicht gerade die doppelte Deklaration a) sinnlos ist und b) unvorhersehbare Zustände hervorruft.

    Ich werds mal mit static int probieren, nur in der ISR und nicht in main.

    Vielen Dank schonmal!

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich werds mal mit static int probieren, nur in der ISR und nicht in main.
    Wie ich bereits andeutete, die beiden Definitionen in der main sind einfach nur Nonsens.
    MfG
    Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Ok, leider tut sich immer noch nichts. Woran könnte es noch liegen?

    Ich habe den INT0-Pin auf GND gelegt per 10k-Widerstand. Die RC-Signale sind soweit ich weiß positiv, von daher müsste das doch passen!?

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wie sieht der Code jetzt aus?
    Welcher AVR eigentlich?
    MfG
    Stefan

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    Ups, sorry. Ist ein Attiny24.

    Hier der aktuelle Code:


    Code:
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    
    ISR(INT0_vect) 
    { 
        static int reading; 
        static int rc_value; 
        
        if(reading == 0) 
        { 
            TCNT0 = 0; 
            reading = 1; 
        } 
        else 
        { 
           rc_value = TCNT0; 
           TCNT0 = 0; 
           reading = 0; 
           if(rc_value > 128) 
           { 
                PORTA = (0<<PA2); 
           } 
           else 
           { 
                PORTA = (1<<PA2); 
           } 
        } 
    } 
    
    int main(void) 
    { 
        DDRA = 0xFF; 
        PORTA = 0xFF; 
        DDRB = 0x00; 
        
        TCCR0B = (1<<CS01); 
        MCUCR = (1<<ISC00); 
        sei(); 
        
        while(1) 
        { 
        }  
    }

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    1) Wie soll an INT0 eine Flanke detektiert werden, wenn der Pin als Ausgang konfiguriert ist?

    2)Du machst den Anfang der Messung nicht davon abhängig, was für eine Flanke das denn gerade war. Wenn das Programm während eines Impulses startet, misst du laufend nur die Pausen zwischen den Impulsen.
    MfG
    Stefan

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Beiträge
    53
    zu 1): Der Pin INT0 ist an Port B, welcher mit DDRB = 0x00; als Eingang angelegt ist.

    zu 2): Da hast du Recht, ist mir nicht bewusst gewesen. Wie kann ich das korrigieren? Praktischerweise erst die Schaltung starten, dann den RC-Empfänger anschließen? Oder geht das auch per Software, die Flanke zu erkennen??

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo,

    lies mal im Datenblatt Absatz 9.3.1 (zum Thema MCUCR) -- dann weißt Du, wie man auf steigende und fallende Flanken reagiert. Für ein positives Signal würde man also zunächst den INT0 so einstellen, dass er auf die steigende Flanke reagiert. Beim Interrupt dann den Timer starten und die INT0-Erkennung auf die fallende Flanke umstellen. Beim nächsten INT0 (fallende Flanke!) den Timer anhalten/auswerten. Da capo.

    Es ist ratsam, zunächst ein solches Konzept zu erstellen (und im Kopf/auf Papier durchzuspielen), ehe man Code schreibt.

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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