- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 17

Thema: RP6 Fernsteuerung über RC-Empfänger

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Nochmal hallo

    Nun habe ich die Funktion getestet, wie erwartet funktioniert das wunderbar:
    Code:
    // RC-Signal messen und auswerten                                  2.5.2008 mic
    
    #include "rblib.h"
    #include "rblib.c"
    
    uint8_t servopos;
    volatile uint16_t p=0;
    
    void pause(uint16_t p_dauer)
    {
    	p=p_dauer;
    	while(p);
    }
    
    uint16_t get_RC(uint8_t kanal)
    {
    	uint16_t count=0;
    	if(kanal==1)                  // Erster RC-Kanal
    	{
    	   while(PINA & 1); 				// warten bis Ende des aktuellen Impuls
    	   while(!(PINA & 1));			// warten auf Ende Pause
    		while(PINA & 1) count++; 	// Impulslänge messen
    	}
    	return(count);             	// Zählwert übergeben
    }
    
    int main(void)
    {
    	rblib_init();
    	DDRA |= 1;
    	servopos=0;
    
    	TCCR0 =  (0 << WGM00) | (1 << WGM01);					// CTC-Mode
    	TCCR0 |= (0 << COM00) | (0 << COM01);					// ohne OCR-Pin
    	TCCR0 |=	(0 << CS02)  | (1 << CS01) | (0 << CS00);	// prescaler /8
    	TIMSK =  (1 << OCIE0); 										// Interrupt ein
    	OCR0  = 13;
    
    	sei();
    	servopos=40;
    	while(1)
    	{
    		writeInteger(servopos, 10);
    		writeString(" - ");
    		writeInteger(get_RC(1), 10);
    		writeString("\n\r");
    		servopos+=10;
    		if(servopos>170)
    		{
    		   servopos=40;
    			writeString("\n\r");
    		   pause(50);
    		}
    		pause(10);
    	}
    	return 0;
    }
    
    ISR(TIMER0_COMP_vect)
    {
    	static uint16_t count=1;
    	if(count>servopos) PORTA&=~1; else PORTA|=1;
    	if(count<2000)count++; else { count=1; if(p) p--; }
    }
    Das Progamm steuert per ISR ein Servo an Pin ADC0 an. Gleichzeitig werden im Hauptprogramm am selben Pin die Impulslängen gemessen und angezeigt. (Ein auf Ausgang geschalteter Pin kann auch eingelesen werden: IR-Kommunikation mit dem RP6) Mit Prescaler /8 und OCR0=13 ist der Wert für Servomitte ungefähr 100 (Basis des Programms ist der Testcode meines aktuellen "Projekts"). Die Ausgabe am Terminal sieht so aus:
    Code:
    Terminal cleared!
    
    [RP6BOOT]
    
    [READY]
    40 - 368
    50 - 460
    60 - 552
    70 - 644
    80 - 736
    90 - 828
    100 - 920
    110 - 1012
    120 - 1104
    130 - 1196
    140 - 1288
    150 - 1380
    160 - 1472
    170 - 1564
    
    40 - 368
    50 - 460
    60 - 552
    Im Anhang nochmals meine minimale Lib auf Basis der RP6-Lib.

    Gruß

    mic
    Angehängte Dateien Angehängte Dateien
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

Labornetzteil AliExpress