- LiFePO4 Speicher Test         
Ergebnis 41 bis 50 von 60

Thema: Mehrere Servo-Signale einlesen, ggf. manipulieren, ausgeben

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #31
    Neuer Benutzer Öfters hier
    Registriert seit
    25.10.2010
    Beiträge
    26
    In C spuckt er mir leider die selben Mist Werte wie im Bascom Prog aus. Also scheint irgendwas an meinem Prinzip völlig daneben zu gehen.

    main.c
    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    
    #include "uart.h"
    #include "input.h"
    
    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    
    /* 9600 baud */
    #define UART_BAUD_RATE      9600      
    
    
    int main(void)
    {
    
    
        //Uart initialisieren
        uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    
    
        //Eingänge INT0 und INT1 initialisieren
        init_inputs();
    
    
        while(1)
        {
            char tmp[5];
            itoa(input_channel[3], tmp, 10); 
            uart_puts(tmp);
            uart_puts("\n");
            _delay_ms(50);
        }; //Endlosschleife
        
    }
    input.c
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    
    #include "input.h"
    
    // **************************
    //         Prototypen
    // **************************
    void init_inputs(void);//Initialisiert INT0 und INT1
    
    // **************************
    //         Deklarationen
    // **************************
    uint16_t (input_channel)[7]; //Array für die einzelnen Kanäle
    uint8_t (fail_flag); //Flag für Fail Safe Modus
    
    uint8_t (ch_cnt); //Counter für aktuellen Kanal
    
    
    void init_inputs(void)
    {
    
    
        //INT0 und INT1 als Eingang
        //DDRD = 0b11111001;
        DDRD &= ~((1 << DDD1) | (1 << DDD2));
    
        //INT0 und INT1 aktivieren
        GICR |= ((1 << INT0) | (1 << INT1));
    
        //Beide INT auf steigene Flanke konfigurieren
        MCUCR |= ((1 << ISC01) | (1 << ISC00)); //INT0
        MCUCR |= ((1 << ISC11) | (1 << ISC10)); //INT1
    
        //Timer1 Prescaler auf 1 stellen
        TCCR1B |= (1 << CS10);
    
        //Timer1 Overflow INT aktivieren
        TIMSK |= (1 << TOIE1);
    
        //Interrupts anschalten
        sei();
    };
    
    
    //ISR von INT0
    ISR(INT0_vect)
    {     
        //Wenn der CH != 0 dann speichere Zählerstand
        if(ch_cnt != 0){input_channel[ch_cnt] = TCNT1;}
    
        //Ch Zähler erhöhen
        ch_cnt++;
    
        //Zähler zurücksetzen
        TCNT1 = 0;
    
        //INT0 auf fallende Flanke
        if(ch_cnt == 6){MCUCR &= ~(1 << ISC00);}
    }
    
    
    //ISR von INT1
    ISR(INT1_vect)
    {
        //Wenn der CH != 0 dann speichere Zählerstand
        if(ch_cnt != 0){input_channel[ch_cnt] = TCNT1;}
    
        //Ch Zähler erhöhen
        ch_cnt++;
    
        //Zähler zurücksetzen
        TCNT1 = 0;
    
        //INT1 auf fallende Flanke
        if(ch_cnt == 6){MCUCR &= ~(1 << ISC10);}
    }
    
    
    //Timerüberlauf nach ~4ms, wenn nicht manuell zurückgesetzt wird
    ISR(TIMER1_OVF_vect)
    {
        //Kanalzähler zurücksetzen
        ch_cnt = 0; 
    
        //Beide INT auf steigene Flanke konfigurieren
        MCUCR |= ((1 << ISC01) | (1 << ISC00)); //INT0
        MCUCR |= ((1 << ISC11) | (1 << ISC10)); //INT1
    }
    Aus hTerm
    Code:
    ...
    ...
    ...
    9618<\n>
    9618<\n>
    9618<\n>
    9618<\n>
    9618<\n>
    9618<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    8837<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    6762<\n>
    -2320<\n>
    -2320<\n>
    -2320<\n>
    -2320<\n>
    -2320<\n>
    -2320<\n>
    -2320<\n>
    ...
    ...
    ...
    Ich versteh nur langsam nicht mehr so ganz wieso dieses Prinzip nicht funktioniert.
    Bei jedem INT den Zähler speichern und zurücksetzen.
    Beim letzten auf fallende Flanke, damit das Ende des letzten Puls erfasst wird.

    Die Pause nach den Pulsen ist dann größer als 4ms, sodass der Timer überläuft.
    Der setzt dann alles auf Anfang zurück. Die 4ms Pause ist quasi das Syncronistations Signal.

    Jemand ne Idee was ich falsch mache?

    Gruß Basti
    PS.: Schönen Feiertag noch

    EDIT:
    gerade festgestellt, für Ch1 passt es eigentlich. Da bringt er mir einen Wert zwischen etwa 18000 und 30000 Ticks des Timers.
    Nur die weiteren Ch haben dann falsche oder sogar negative Werte. Wie kann der Timer negativ Zählen?

    Das sind die 6Ch Daten die er mir ausspuckt....
    Code:
    23925 | -239 | 2331 | -14653 | 0 | 0<\n>
    Nur Ch1 verhält sich wie gewollt, äquivalent zum Knüpel der Fernbedienung, alle anderen springen ab und zu mal wild umher, aber nicht unbedingt auf Knüpelbewegungen.

    EDIT2:
    Weitere Erkenntnis, wenn ich beide Oszi Kanäle an die INTS halte und mir die Signale anschauen will, kommen die auch auf einmal korrekt an :-D scheinbar hängt der ganze scheiß irgendwie in der Luft und fängt sich Müll ein, sobal ich das aber - wenn auch nur minimal - mit dem Oszi belaste, haut's hin. Mal überlegen was ich da nun mache....

    EDIT3:
    Tatsache, die Ausgänge des Empfängers hingen bei Low Pegel völlig in der Luft. 10k gegen Masse und die Nummer läuft wie geschmiert.
    Is ja klar, das der mir nur Müll auswertet, wenn die INTs sich alles einfangen, nur nicht das richtige Signal :-D

    Aber aus lauter Trotz bleibe ich jetzt bei C, dann lern ich das auch endlich mal - bis dato noch NIE angefasst.
    Alles was oben steht habe ich mir in etwa 48h angelesen
    Geändert von Bomberpilot (27.12.2014 um 08:24 Uhr)

Ähnliche Themen

  1. Mehrere RC Signale einlesen und mehrere Servos ausgeben
    Von R2D2 Bastler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 74
    Letzter Beitrag: 10.01.2022, 08:35
  2. RC-Signal einlesen verändern und wieder ausgeben.
    Von DanielSan im Forum Arduino -Plattform
    Antworten: 1
    Letzter Beitrag: 21.03.2013, 11:58
  3. Atmel128 Spannungen einlesen und Ausgeben (Display3000)
    Von Gantenbein im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 31.08.2007, 21:41
  4. Mehrere Signale umschalten
    Von flexxo im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 25.02.2007, 13:56
  5. Servoimpulse einlesen und ausgeben
    Von moelski im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.08.2006, 07:24

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress