-         

Ergebnis 1 bis 3 von 3

Thema: Servo über M32 Erweiterungsmodul fail

  1. #1
    Neuer Benutzer Öfters hier Avatar von derpfälzer
    Registriert seit
    17.08.2011
    Beiträge
    10

    Frage Servo über M32 Erweiterungsmodul fail

    Anzeige

    Servus,
    Ich wollte testweise den Servo über die Erweiterungsplatine ansteuern.
    Das gleiche Programm wie vorher nur wollte ich ADC2 nehmen.
    In den Schaltplänen ist er auf PA2.
    Es lässt sich auch nich compilieren.

    Fehler: undefined reference to initRP6Control
    Hab ich einen Denkfehler oder habt ihr eine andere Idee?

    Code:
    // Servoansteuerung mit Timer1                                         31.1.2010 mic
    
    // Einfach und elegant, warum finde ich das erst jetzt? Timer1 (RP6-Motoransteuerung)
    // läuft ja sowieso im Hintergrund. Deshalb kann man die "klassische" Servoansteuerung
    // in die Overflow-ISR einbauen und mit ca. 19kHz aufrufen lassen. Timersetup der Lib:
    // Mode 10, Phase Correct mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)
    
    // Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38
    
    #include "RP6ControlLib.h"
    
    volatile uint8_t servo1, servo2, servo3, p; 	// Servopositionen und Impulszähler
    uint8_t c; 							// ein Char zur freien Verfügung
    
    int main(void)
    {
       initRP6Control();
       servo1=servo2=servo3=26;	// Servomitte?
       TIMSK |= (1 << TOIE1); 		// Die Timer1 Overflow-ISR zur Servoansteuerung
    	DDRA |= (ADC2);          // Servopins auf Ausgang setzen
            // DDRC |= (SCL); Herausgenommen
       setLEDs(1);                // und los!
       startStopwatch1();
       startStopwatch2();
       startStopwatch3();
    	while(1)
       {
       
    		   {
    			servo1=servo2=servo3=26; // mitte
       		p=50; while(p);          // warten bis 50 Impulse gesendet (ca. 1 Sek.)
       		servo1=servo2=servo3=14; // links
       		p=50; while(p);
       		servo1=servo2=servo3=38; // rechts
       		p=50; while(p);
    		}
    			
    		
       }
       return 0;
    }
    ISR (TIMER1_OVF_vect)
    {
    	static uint16_t servocount=1;
    	if(servocount > servo1) PORTA &= ~ADC2; else PORTA |= ADC2; 		// PA2 
    	// if(servocount > servo2) PORTC &= ~SCL; else PORTC |= SCL; 	        // PC0 XBUS 10				Herausgenommen
    	// if(servocount > servo3) PORTC &= ~SDA; else PORTC |= SDA; 	         // PC1 XBUS 12				Herausgenommen
    	if(servocount < 400) servocount++; else {servocount=1; if(p) p--;} 	// p = 1/50 Sek
    }
    gruß derpfälzer

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.783
    Blog-Einträge
    8
    Hallo

    Die komplette Ausgabe der Fehlermeldungen wäre sinnvoll. Vermutlich wurde RP6ControlLib.c nicht in das Projekt eingebunden und deshalb kennt der Kompiler die Funktion initRP6Control(); nicht.

    Bist du sicher, dass du das so machen willst? "TIMSK |= (1 << TOIE1);" funktioniert mit dem RP6, weil seine Library den Timer1 zur Motoransteuerung nutzt und der Timer deshalb auch schon richtig initialisiert wurde.

    Init vom m32:
    Code:
    void initRP6Control(void)
    {
    	portInit();		// Setup port directions and initial values.
    					// This is the most important step!
    
    	cli();			// Disable global interrupts.
    
    	// UART:
    	UBRRH = UBRR_BAUD_LOW >> 8;	// Setup UART: Baud is Low Speed
    	UBRRL = (uint8_t) UBRR_BAUD_LOW;
    	UCSRA = 0x00;
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
        UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    	
    	// Initialize ADC:
    	ADMUX = 0; //external reference 
    	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
    	SFIOR = 0;
    
    	// Initialize External interrupts - all disabled:
    	MCUCR = (1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00);
    	GICR = (0 << INT2) | (0 << INT1) | (0 << INT0);
    	MCUCSR = (0 << ISC2);
    	
    	
    	// 10kHz Timer 0:
    	TCCR0 =   (0 << WGM00) 
    			| (1 << WGM01) 
    			| (0 << COM00) 
    			| (0 << COM01) 
    			| (0 << CS02)  
    			| (1 << CS01) 
    			| (0 << CS00);
    	OCR0  = 199;
    	
    /*
    	Timer 1 is free for your application!
    */
    
    	// Timer 2 - used for beeper:
    	TCCR2 =  0; 
    	OCR2  = 0xFF; 
    
    	// Enable timer interrupts:
    	TIMSK =   (1 << OCIE0); 
    
    	// SPI Master (SPI Mode 0, SCK Frequency is F_CPU/2, which means it is 8MHz 
    	// on the RP6 CONTROL M32...):
    	SPCR =    (0<<SPIE) 
    			| (1<<SPE) 
    			| (1<<MSTR) 
    			| (0<<SPR0) 
    			| (0<<SPR1) 
    			| (0<<CPOL) 
    			| (0<<CPHA);  
    	SPSR = (1<<SPI2X);
    	
    	sei(); // Enable Global Interrupts
    }
    (Aus RP6ControlLib.c)

    Init vom RP6:
    Code:
    void initRobotBase(void)
    {
    	portInit();		// Setup port directions and initial values.
    					// THIS IS THE MOST IMPORTANT STEP!
    
    	cli();			// Disable global interrupts
    	
    	enableResetButton(); // Make sure the Reset Button is enabled!
    						 // Do not disable it if you want to be able to
    						 // reset your robot! (Otherwise you can only
    						 // stop it by switching it off completely, 
    						 // if it gets out of control ;) )
    
    	IRCOMM_OFF(); 	     // Make sure that IRCOMM and ...
    	setACSPwrOff();		 // ACS are turned OFF!
    
    	// UART:
    	UBRRH = UBRR_BAUD_LOW >> 8;	// Setup UART: Baudrate is Low Speed
    	UBRRL = (uint8_t) UBRR_BAUD_LOW;
    	UCSRA = 0x00;
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
        UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    	
    	// Initialize ADC:
    	ADMUX = 0; //external reference 
    	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
    	SFIOR = 0;
    
    	// Initialize External interrupts:
    	MCUCR = (0 << ISC11) | (1 << ISC10) | (0 << ISC01) | (1 << ISC00);
    	GICR = (1 << INT2) | (1 << INT1) | (1 << INT0);
    	MCUCSR = (0 << ISC2);
    
    	// Initialize Timer 0 -  100µs cycle for Delays/Stopwatches, RC5 reception etc.:
    	TCCR0 =   (0 << WGM00) | (1 << WGM01) 
    			| (0 << COM00) | (0 << COM01) 
    			| (0 << CS02)  | (1 << CS01) | (0 << CS00);
    	OCR0  = 99;
    
    	// Initialize Timer1 - PWM:
    	// PWM, phase correct with ICR1 as top value.
    	TCCR1A = (0 << WGM10) | (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
    	TCCR1B =  (1 << WGM13) | (0 << WGM12) | (1 << CS10);
    	ICR1 = 210; // Phase corret PWM top value - 210 results in 
    				// about 19 kHz PWM.
    				// ICR1 is the maximum (=100% duty cycle) PWM value!
    				// This means that the PWM resolution is a bit lower, but
    				// if the frequency is lower than 19 kHz you may hear very
    				// annoying high pitch noises from the motors!
    				// 19 kHz is a bit over the maximum frequency most people can
    				// hear!
    				// 
    				// ATTENTION: Max PWM value is 210 and NOT 255 !!!
    	OCR1AL = 0;
    	OCR1BL = 0;
    	setMotorDir(FWD,FWD); 	// Direction Forwards
    
    	// Initialize Timer2 - ACS:
    	TCCR2 = (1 << WGM21) | (0 << COM20) | (1 << CS20);
    	OCR2  = 0x6E; // 0x6E = 72kHz @8MHz
    	
    	// Initialize Timer Interrupts:
    	TIMSK = (1 << OCIE0); //| (1 << OCIE2); // Fixed: Timer2 Interrupt is turned 
    	                      // off by default now! It is only active 
    						  // when ACS/IRCOMM are transmitting.
    
    	// Initialize ACS:
    	sysStatACS.channel = ACS_CHANNEL_RIGHT;
    	acs_state = ACS_STATE_IRCOMM_DELAY;
    
    	sei(); // Enable Global Interrupts
    }
    (Aus RP6RobotBaseLib.c)

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Neuer Benutzer Öfters hier Avatar von derpfälzer
    Registriert seit
    17.08.2011
    Beiträge
    10
    Also meinst du es wäre eh besser wenn ich die Servos auf dem rp6 lasse und nicht an den m32 gehe ?


    Code:
    ------ Erstellen gestartet: Projekt: AVRGCC1, Konfiguration: Debug AVR ------
    Der Buildvorgang wurde gestartet.
    Projekt "AVRGCC1.cproj" (Standardziele):
    Erstellung mit der Toolsversion 2.0.
    Das Ziel "PreBuildEvent" wurde übersprungen, da die Bedingung "false" war . ('$(PreBuildEvent)'!='') wurde als (''!='') ausgewertet.
    Ziel "CoreBuild" in Datei "C:\Program Files (x86)\Atmel\AVR Studio 5.1\Vs\Compiler.targets" aus Projekt "C:\Users\media\Desktop\RP6Programme\AVRGCC1\AVRGCC1\AVRGCC1.cproj" (Ziel "Build" ist davon abhängig):
    	RunCompilerTask-Aufgabe
    		C:\Program Files (x86)\Atmel\AVR Studio 5.1\make\make.exe all 
    		Building target: AVRGCC1.elf
    		Invoking: AVR/GNU C Linker
    		"C:\Program Files (x86)\Atmel\AVR Studio 5.1\extensions\Atmel\AVRGCC\3.3.1.27\AVRToolchain\bin\avr-gcc.exe" -o AVRGCC1.elf  RP6I2CmasterTWI.o RP6RobotBaseLib.o RP6uart.o Servotest.o   -Wl,-Map="AVRGCC1.map" -Wl,-lm   -mmcu=atmega32  
    		Servotest.o: In function `main':
    C:\Users\media\Desktop\RP6Programme\AVRGCC1\AVRGCC1\Debug/.././Servotest.c(17,1): undefined reference to `initRP6Control'
    		collect2: ld returned 1 exit status
    		make: *** [AVRGCC1.elf] Error 1
    	Die Ausführung der RunCompilerTask-Aufgabe ist abgeschlossen -- FEHLER.
    Die Erstellung des Ziels "CoreBuild" im Projekt "AVRGCC1.cproj" ist abgeschlossen -- FEHLER.
    Die Erstellung des Projekts "AVRGCC1.cproj" ist abgeschlossen -- FEHLER.
    
    Fehler beim Erstellen
    ========== Build: 0 erfolgreich oder aktuell, Fehler bei 1, 0 übersprungen ==========

    Funktionieren tut es ja vom RP6 aus ich will nur nochmal nachschauen wenn ich wieder Zeit habe warum es vom M32 aus nicht geht.
    Dafür muss ich mich aber noch ein bischen einlesen wie gesagt vorher keine Ehrfahrung mit C aber es wird man muss eben nur Zeit investieren

Ähnliche Themen

  1. Servo Ansteuerung fail
    Von derpfälzer im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 30.03.2012, 17:45
  2. Welches Erweiterungsmodul?
    Von GoodOldLoki im Forum Robby RP6
    Antworten: 13
    Letzter Beitrag: 15.05.2009, 13:28
  3. Antworten: 4
    Letzter Beitrag: 06.02.2009, 21:27
  4. Antworten: 5
    Letzter Beitrag: 05.03.2008, 18:46
  5. Antworten: 8
    Letzter Beitrag: 08.04.2006, 18:01

Berechtigungen

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